﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-竹里馆→DanielWang的专栏-文章分类-个人网上备忘录</title><link>http://www.blogjava.net/XXNiuLang/category/24902.html</link><description>&lt;marquee scrolldelay="200"&gt;独坐幽篁里,弹琴复长啸;深林人不知,明月来相照&lt;/marquee &gt;</description><language>zh-cn</language><lastBuildDate>Wed, 12 Mar 2008 13:21:35 GMT</lastBuildDate><pubDate>Wed, 12 Mar 2008 13:21:35 GMT</pubDate><ttl>60</ttl><item><title>Web.XML 配置详解</title><link>http://www.blogjava.net/XXNiuLang/articles/185672.html</link><dc:creator>DanielWang</dc:creator><author>DanielWang</author><pubDate>Wed, 12 Mar 2008 05:39:00 GMT</pubDate><guid>http://www.blogjava.net/XXNiuLang/articles/185672.html</guid><wfw:comment>http://www.blogjava.net/XXNiuLang/comments/185672.html</wfw:comment><comments>http://www.blogjava.net/XXNiuLang/articles/185672.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/XXNiuLang/comments/commentRss/185672.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/XXNiuLang/services/trackbacks/185672.html</trackback:ping><description><![CDATA[每一个站的WEB-INF下都有一个web.xml的设定文件，它提供了我们站台的配置设定.
<p>web.xml定义：<br />
&nbsp;.站台的名称和说明<br />
&nbsp;.针对环境参数(Context)做初始化工作<br />
&nbsp;.Servlet的名称和映射<br />
&nbsp;.Session的设定<br />
&nbsp;.Tag library的对映<br />
&nbsp;.JSP网页设定<br />
&nbsp;.Mime Type处理<br />
&nbsp;.错误处理<br />
&nbsp;.利用JDNI取得站台资源</p>
<p>要了解web.xml的设定值，必须了解它的schema,从web.xml中知道它的schema是由Sum Microsystems公司定制的，如果你想更为详细的了解它，<br />
可以到<a href="http://java.sun.com/xml/ns/j2ee/web-mapp_2_4.xsd">http://java.sun.com/xml/ns/j2ee/web-mapp_2_4.xsd</a>网页，那里有更为详细的介绍。这里我介绍我们平常见得最都的.<br />
&nbsp; <br />
&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;</p>
<p>&lt;web-app xmlns="<a href="http://java.sun.com/xml/ns/j2ee">http://java.sun.com/xml/ns/j2ee</a>"<br />
&nbsp;&nbsp;&nbsp; xmlns:xsi="<a href="http://www.w3.org/2001/XMLSchema-instance">http://www.w3.org/2001/XMLSchema-instance</a>"<br />
&nbsp;&nbsp;&nbsp; xsi:schemaLocation="<a href="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd</a>"<br />
&nbsp;&nbsp;&nbsp; version="2.4"&gt;<br />
&lt;web-app&gt;<br />
这是一般在写XML时所做的声明,定义了XML的版本，编码格式,还有重要的指明schema的来源,为<a href="http://java.sun.com/xml/ns/j2ee">http://java.sun.com/xml/ns/j2ee</a><br />
/web-app_2_4.xsd.</p>
<p><br />
&lt;description&gt;,&lt;display-name&gt;,&lt;icon&gt;<br />
____________________________________________</p>
<p>&lt;description&gt;站台描述&lt;/discription&gt;<br />
对站台做出描述.</p>
<p>&lt;display-name&gt;站台名称&lt;/display-name&gt;<br />
定义站台的名称.</p>
<p>&lt;icon&gt;<br />
icon元素包含small-icon和large-icon两个子元素.用来指定web站台中小图标和大图标的路径.<br />
&lt;small-icon&gt;/路径/smallicon.gif&lt;/small-icon&gt;<br />
small-icon元素应指向web站台中某个小图标的路径,大小为16 X 16 pixel,但是图象文件必须为GIF或JPEG格式,扩展名必须为:.gif或<br />
.jpg.</p>
<p>&lt;large-icon&gt;/路径/largeicon-jpg&lt;/large-icon&gt;<br />
large-icon元素应指向web站台中某个大图表路径,大小为32 X 32 pixel,但是图象文件必须为GIF或JPEG的格式,扩展名必须为; gif<br />
或jpg.<br />
范例:<br />
&lt;display-name&gt;Develop Example&lt;/display-name&gt;<br />
&lt;description&gt;JSP 2.0 Tech Book's Examples&lt;/description&gt;<br />
&lt;icon&gt;<br />
&nbsp;&nbsp; &lt;small-icon&gt;/images/small.gif&lt;/small-icon&gt;<br />
&nbsp;&nbsp; &lt;large-icon&gt;/images/large.gir&lt;/large-icon&gt;<br />
&lt;/icon&gt;</p>
<p><br />
&lt;distributable&gt;<br />
______________________________________</p>
<p>&lt;distributable&gt;<br />
distributable 元素为空标签,它的存在与否可以指定站台是否可分布式处理.如果web.xml中出现这个元素,则代表站台在开发时已经<br />
被设计为能在多个JSP Container 之间分散执行.<br />
范例:<br />
&lt;distributable/&gt;</p>
<p>&nbsp;</p>
<p>&lt;context-param&gt;<br />
___________________________________</p>
<p>&lt;context-param&gt;<br />
context-param 元素用来设定web站台的环境参数(context),它包含两个子元素:<br />
param-name和param-value.<br />
&lt;param-name&gt;参数名称&lt;/param-name&gt;<br />
设定Context名称<br />
&lt;param-value&gt;值&lt;/param-value&gt;<br />
设定Context名称的值<br />
&lt;/context-param&gt;<br />
范例:<br />
&lt;context-param&gt;<br />
&nbsp;&nbsp; &lt;param-name&gt;param_name&lt;/param-name&gt;<br />
&nbsp;&nbsp; &lt;param-value&gt;param_value&lt;/param-value&gt;<br />
&lt;/context-param&gt;<br />
此所设定的参数,在JSP网页中可以使用下列方法来取得:<br />
${initParam.param_name}<br />
若在Servlet可以使用下列方法来获得:<br />
String param_name=getServletContext().getInitParamter("param_name");</p>
<p>&nbsp;</p>
<p>&lt;filter&gt;<br />
_________________________________<br />
filter元素用来声明filter的相关设定.filter元素除了下面介绍的的子元素之外,还包括&lt;servlet&gt;介绍过的&lt;icon&gt;,&lt;display-name&gt;<br />
,&lt;description&gt;,&lt;init-param&gt;,其用途一样.<br />
&lt;filter-name&gt;Filter的名称&lt;/filter-name&gt;<br />
定义Filter的名称.<br />
&lt;filter-class&gt;Filter的类名称&lt;/filter-class&gt;<br />
定义Filter的类名称.例如:com.foo.hello<br />
&lt;/filter&gt;<br />
范例:<br />
&lt;filter&gt;<br />
&nbsp; &lt;filter-name&gt;setCharacterEncoding&lt;/filter-name&gt;<br />
&nbsp; &lt;filter-class&gt;coreservlet.javaworld.CH11.SetCharacterEncodingFilter&lt;/filter-class&gt;<br />
&nbsp; &lt;init-param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;encoding&lt;/param-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;GB2312&lt;/param-value&gt;<br />
&nbsp; &lt;/init-param&gt;<br />
&lt;/filter&gt;</p>
<p><br />
&lt;filter-mapping&gt;<br />
______________________________________<br />
&lt;filter-mapping&gt;<br />
filter-mapping 元素的两个主要子元素filter-name和url-pattern.用来定义Filter所对应的URL.<br />
&lt;filter-name&gt;Filter的名称&lt;/filter-name&gt;<br />
定义Filter的名称.<br />
&lt;url-pattern&gt;URL&lt;/url-pattern&gt;<br />
Filter所对应的RUL.例如:&lt;url-pattern&gt;/Filter/Hello&lt;/url-pattern&gt;</p>
<p>&lt;servlet-name&gt;Servlet的名称&lt;servlet-name&gt;<br />
定义servlet的名称.<br />
&lt;dispatcher&gt;REQUEST|INCLUDE|FORWARD|ERROR&lt;/disaptcher&gt;<br />
设定Filter对应的请求方式,有RQUEST,INCLUDE,FORWAR,ERROR四种,默认为REQUEST.<br />
&lt;/filter-mapping&gt;<br />
范例:<br />
&lt;filter-mapping&gt;<br />
&nbsp;&nbsp; &lt;filter-name&gt;GZIPEncoding&lt;/filter-name&gt;<br />
&nbsp;&nbsp; &lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />
&lt;/filter-mapping&gt;</p>
<p>&nbsp;</p>
<p>&lt;listener&gt;<br />
___________________________________________<br />
&lt;listener&gt;<br />
listener元素用来定义Listener接口,它的主要子元素为&lt;listener-class&gt;<br />
&lt;listen-class&gt;Listener的类名称&lt;/listener-class&gt;<br />
定义Listener的类名称.例如: com.foo.hello<br />
&lt;listener&gt;<br />
范例:<br />
&lt;listener&gt;<br />
&nbsp; &lt;listener-class&gt;coreservlet.javaworld.CH11.ContenxtListener&lt;/listener-class&gt;<br />
&lt;/listener&gt;</p>
<p>&nbsp;</p>
<p>&lt;servlet-mapping&gt;<br />
_____________________________________________<br />
servlet-mapping元素包含两个子元素servlet-name和url-pattern.用来定义servlet所对应URL.<br />
&lt;servlet-name&gt;Servlet的名称&lt;/servlet-name&gt;<br />
定义Servlet的名称.<br />
&lt;url-pattern&gt;Servlet URL&lt;/url-pattern&gt;<br />
定义Servlet所对应的RUL.例如:&lt;url-pattern&gt;/Servlet/Hello&lt;/url-pattern&gt;<br />
&lt;/servlet-mapping&gt;<br />
范例:<br />
&lt;servlet-mapping&gt;<br />
&nbsp;&nbsp; &lt;servlet-name&gt;LoginChecker&lt;/servlet-name&gt;<br />
&nbsp;&nbsp; &lt;url-pattern&gt;/LoginChecker&lt;/url-pattern&gt;<br />
&lt;/servlet-mapping&gt;</p>
<p><br />
&lt;session-cofing&gt;<br />
__________________________________<br />
&lt;session-config&gt;<br />
session-config包含一个子元素session-timeout.定义web站台中的session参数.<br />
&lt;session-timeout&gt;分钟&lt;/session-timeout&gt;<br />
定义这个web站台所有session的有效期限.单位为分钟.<br />
&lt;/session-config&gt;<br />
范例:<br />
&lt;session-config&gt;<br />
&nbsp;&nbsp; &lt;session-timeout&gt;20&lt;/session-timeout&gt;<br />
&lt;/session-config&gt;</p>
<p><br />
&lt;mime-mapping&gt;<br />
___________________________________________________<br />
&lt;mima-mapping&gt;<br />
mime-mapping包含两个子元素extension和mime-type.定义某一个扩展名和某一MIME Type做对映.<br />
&lt;extension&gt;扩展名名称&lt;/extension&gt;<br />
扩展名称<br />
&lt;mime-type&gt;MIME格式&lt;/mime-type&gt;<br />
MIME格式.<br />
&lt;/mime-mapping&gt;<br />
范例:<br />
&lt;mime-mapping&gt;<br />
&nbsp;&nbsp; &lt;extension&gt;doc&lt;/extension&gt;<br />
&nbsp;&nbsp; &lt;mime-type&gt;application/vnd.ms-word&lt;/mime-type&gt;<br />
&lt;/mime-mapping&gt;<br />
&lt;mime-mapping&gt;<br />
&nbsp;&nbsp; &lt;extension&gt;xls&lt;/extension&gt;<br />
&nbsp;&nbsp; &lt;mime-type&gt;application/vnd.ms-excel&lt;/mime-type&gt;<br />
&lt;/mime-mapping&gt;<br />
&lt;mime-mapping&gt;<br />
&nbsp;&nbsp; &lt;extension&gt;ppt&lt;/extesnion&gt;<br />
&nbsp;&nbsp; &lt;mime-type&gt;application/vnd.ms-powerpoint&lt;/mime-type&gt;<br />
&lt;/mime-mapping&gt;</p>
<p><br />
&lt;welcome-file-list&gt;<br />
_____________________________________________<br />
&lt;welcome-file-list&gt;<br />
welcome-file-list包含一个子元素welcome-file.用来定义首页列单.<br />
&lt;welcome-file&gt;用来指定首页文件名称&lt;/welcome-flie&gt;<br />
welcome-file用来指定首页文件名称.我们可以用&lt;welcome-file&gt;指定几个首页,而服务器会依照设定的顺序来找首页.<br />
范例:<br />
&lt;welcome-file-list&gt;<br />
&nbsp; &lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;<br />
&nbsp; &lt;welcome-file&gt;index.htm&lt;/welcome-file&gt;<br />
&lt;/welcome-file-list&gt;</p>
<p>&nbsp;</p>
<p>&lt;error-page&gt;<br />
_________________________<br />
&lt;error-page&gt;<br />
error-page元素包含三个子元素error-code,exception-type和location.将错误代码(Error Code)或异常(Exception)的种类对应<br />
到web站台资源路径.<br />
&lt;error-code&gt;错误代码&lt;/error-code&gt;<br />
HTTP Error code,例如: 404<br />
&lt;exception-type&gt;Exception&lt;/exception-type&gt;<br />
一个完整名称的Java异常类型<br />
&lt;location&gt;/路径&lt;/location&gt;<br />
在web站台内的相关资源路径<br />
&lt;/error-page&gt;<br />
范例:<br />
&lt;error-page&gt;<br />
&nbsp;&nbsp; &lt;error-code&gt;404&lt;/error-code&gt;<br />
&nbsp;&nbsp; &lt;location&gt;/error404.jsp&lt;/location&gt;<br />
&lt;/error-page&gt;<br />
&lt;error-page&gt;<br />
&nbsp;&nbsp; &lt;exception-type&gt;java.lang.Exception&lt;/exception-type&gt;<br />
&nbsp;&nbsp; &lt;location&gt;/except.jsp&lt;/location&gt;<br />
&lt;/error-page&gt;</p>
<p>&nbsp;</p>
<p>&lt;jsp-config&gt;<br />
_______________________________________________<br />
&lt;jsp-config&gt;<br />
jsp-config元素主要用来设定JSP的相关配置,&lt;jsp:config&gt;包括&lt;taglib&gt;和&lt;jsp-property-group&gt;两个子元素.其中&lt;taglib&gt;元素<br />
在JSP 1.2时就已经存在了;而&lt;jsp-property-group&gt;是JSP 2.0新增的元素.</p>
<p>&lt;taglib&gt;<br />
taglib元素包含两个子元素taglib-uri和taglib-location.用来设定JSP网页用到的Tag Library路径.<br />
&lt;taglib-uri&gt;URI&lt;/taglib-uri&gt;<br />
&nbsp;&nbsp; taglib-uri定义TLD文件的URI,JSP网页的taglib指令可以经由这个URI存取到TLD文件.<br />
&lt;taglib-location&gt;/WEB-INF/lib/xxx.tld&lt;/taglib-laction&gt;<br />
&nbsp;&nbsp; TLD文件对应Web站台的存放位置.<br />
&lt;/taglib&gt;</p>
<p>&lt;jsp-property-group&gt;<br />
jsp-property-group元素包含8个元素,分别为:<br />
&lt;description&gt;Description&lt;/descrition&gt;<br />
此设定的说明</p>
<p>&lt;display-name&gt;Name&lt;/display-name&gt;<br />
此设定的名称</p>
<p>&lt;url-pattern&gt;URL&lt;/url-pattern&gt;<br />
设定值所影响的范围,如:/CH2 或者/*.jsp</p>
<p>&lt;el-ignored&gt;true|false&lt;/el-ignored&gt;<br />
若为true,表示不支持EL语法.</p>
<p>&lt;scripting-invalid&gt;true|false&lt;/scripting-invalid&gt;<br />
若为true表示不支持&lt;%scription%&gt;语法.</p>
<p>&lt;page-encoding&gt;encoding&lt;/page-encoding&gt;<br />
设定JSP网页的编码</p>
<p>&lt;include-prelude&gt;.jspf&lt;/include-prelude&gt;<br />
设置JSP网页的抬头,扩展名为.jspf</p>
<p>&lt;include-coda&gt;.jspf&lt;/include-coda&gt;<br />
设置JSP网页的结尾,扩展名为.jspf<br />
&lt;/jsp-property-group&gt;<br />
&lt;/jsp-config&gt;<br />
范例:<br />
&lt;jsp-config&gt;<br />
&lt;taglib&gt;<br />
&nbsp;&nbsp; &lt;taglib-uri&gt;Taglib&lt;/taglib-uri&gt;<br />
&nbsp;&nbsp; &lt;taglib-location&gt;/WEB-INF/tlds/MyTaglib.tld&lt;/taglib-location&gt;<br />
&lt;/taglib&gt;<br />
&lt;jsp-property-group&gt;<br />
&nbsp;&nbsp; &lt;description&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Special property group for JSP Configuration JSP example.<br />
&nbsp;&nbsp; &lt;/description&gt;<br />
&nbsp;&nbsp; &lt;display-name&gt;JSPConfiguration&lt;/display-name&gt;<br />
&nbsp;&nbsp; &lt;uri-pattern&gt;/*&lt;/uri-pattern&gt;<br />
&nbsp;&nbsp; &lt;el-ignored&gt;true&lt;/el-ignored&gt;<br />
&nbsp;&nbsp; &lt;page-encoding&gt;GB2312&lt;/page-encoding&gt;<br />
&nbsp;&nbsp; &lt;scripting-inivalid&gt;true&lt;/scripting-inivalid&gt;<br />
&nbsp;&nbsp; ............<br />
&lt;/jsp-property-group&gt;<br />
&lt;/jsp-config&gt;</p>
<p>&nbsp;</p>
<p>&lt;resource-ref&gt;<br />
________________________________________________<br />
&lt;resource-ref&gt;<br />
resource-ref元素包括五个子元素description,res-ref-name,res-type,res-auth,res-sharing-scope.利用JNDI取得站台可<br />
利用资源.<br />
&lt;description&gt;说明&lt;/description&gt;<br />
资源说明</p>
<p>&lt;rec-ref-name&gt;资源名称&lt;/rec-ref-name&gt;<br />
资源名称</p>
<p>&lt;res-type&gt;资源种类&lt;/res-type&gt;<br />
资源种类</p>
<p>&lt;res-auth&gt;Application|Container&lt;/res-auth&gt;<br />
资源由Application或Container来许可</p>
<p>&lt;res-sharing-scope&gt;Shareable|Unshareable&lt;/res-sharing-scope&gt;<br />
&nbsp;资源是否可以共享.默认值为 Shareable<br />
范例:<br />
&lt;resource-ref&gt;<br />
&nbsp;&nbsp; &lt;description&gt;JNDI JDBC DataSource of JSPBook&lt;/description&gt;<br />
&nbsp;&nbsp; &lt;res-ref-name&gt;jdbc/sample_db&lt;/res-ref-name&gt;<br />
&nbsp;&nbsp; &lt;res-type&gt;javax.sql.DataSoruce&lt;/res-type&gt;<br />
&nbsp;&nbsp; &lt;res-auth&gt;Container&lt;/res-auth&gt;<br />
&lt;/resource-ref&gt;</p>
<p>这些都是些比较常用的,详细可以登录: <a href="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd</a><br />
</p>
<img src ="http://www.blogjava.net/XXNiuLang/aggbug/185672.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/XXNiuLang/" target="_blank">DanielWang</a> 2008-03-12 13:39 <a href="http://www.blogjava.net/XXNiuLang/articles/185672.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>实时JAVA简介</title><link>http://www.blogjava.net/XXNiuLang/articles/136574.html</link><dc:creator>DanielWang</dc:creator><author>DanielWang</author><pubDate>Tue, 14 Aug 2007 02:01:00 GMT</pubDate><guid>http://www.blogjava.net/XXNiuLang/articles/136574.html</guid><wfw:comment>http://www.blogjava.net/XXNiuLang/comments/136574.html</wfw:comment><comments>http://www.blogjava.net/XXNiuLang/articles/136574.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/XXNiuLang/comments/commentRss/136574.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/XXNiuLang/services/trackbacks/136574.html</trackback:ping><description><![CDATA[我在一家投资银行工作了许多年 ， 我的经验告诉我，在金融软件中出现的绝大多数问题是由于缺少实时支持导致的。许多大型的金融IT系统工作于JAVA平台，程序运行时一个不在计划中的的两秒的垃圾收集将导致成千上万美元的损失。更糟糕的是，垃圾收集通常发生在程序负载很高的情况下，这时候程序对执行过程中的中断更为敏感。同样的情况也发生在其他高科技产业中，这就是为什么需要仔细研究实时JAVA规范及其实现的原因。<br><br>有些人可能会认为JAVA和实时是不同环境中的两个概念，实际上，最老的JSR之一（确切的说是第一个JSR）就是关于扩展JAVA平台的实时特性的。然而，任务提交的顺序并不保证它的实现的顺序；Sun只是在最近才实现了实时性，但这并不意味着它是一个低优先级的特性；实际上，这是一个非常复杂并且是一个完整的工作。但是实时的要求与JAVA的本身的要求兼容吗？有很多问题就不得不提了，如GC的语义学 ，同步，线程调度以及high-resolution的时间管理。在本文中，我们将逐一解释这些名词。<br><span style="FONT-SIZE: 10pt"><br>作者:michaelzyy;</span><a href="http://www.matrix.org.cn/user.shtml?username=michaelzyy" target=_new><span style="FONT-SIZE: 10pt">michaelzyy</span></a><br><span style="FONT-SIZE: 10pt">原文:</span><a href="http://www.matrix.org.cn/resource/article/2006-11-28/JAVA+Real+Time_72f1a994-7e38-11db-babc-9753a314dd4b.html" target=_new><span style="FONT-SIZE: 10pt">http://www.matrix.org.cn/resource/article/2006-11-28/JAVA+Real+Time_72f1a994-7e38-11db-babc-9753a314dd4b.html</span></a><br><span style="FONT-SIZE: 10pt">关键字:Java;Real time<br><br>实时是什么意思呢？<br><br>Greg Bollella ，是Sun公司的一个杰出的工程师，实时JAVA规范的作者之一，它说，实时意味着&#8220;能够可靠的可预测的推测和控制程序逻辑的时间行为的能力。&#8221;实时并不像许多开发者想的那样，意味着速度，而是意味着当需要对现实世界的事件作出反应时，它的行为是可预测的和可靠的。实时的电脑总是在限定的期限之内作出反应。取决与所设定的的期限，大量的系统可以被称作是实时的。<br><br>很多程序不能允许即使是一秒的延迟；他们包括之前提到的金融软件，飞机控制软件，核电站控制软件等等。所以，这些并不完全是对速度要求很高的，尽管实时平台的设计师会努力使得程序变快。显而易见，标准的JAVA平台并不符合这些实时系统的要求，这也写入了J2SE和J2EE的许可证协议中，这些协议明确的声明JAVA不能用于核电站设施软件和防卫系统等等。<br><br>实时JAVA<br><br>开发实时应用程序需要一个能够允许开发者正确的控制程序的运行时间以及程序在现实中的行为PI集合和语义。因此JAVA的实时版本必须提供一些JVM的增强以及一个适合实时程序的API集合。毫不奇怪，在JAVA中添加实时的特性最大的障碍在于它的垃圾收集器。Sun最近发布的JAVA实时版本RTS1.0中就包含了一个革命性的核心的实时的垃圾收集器。尽管它的第一个实现中并没有包含这样一个垃圾收集器（将在下一个release版本中将增加）。JAVA RTS 提出了其他一些问题，保证线程调度的确定性，overhead同步，锁排队管理，类初始化以及最少的中断反应延迟。JAVA RTS仅仅针对于合适的操作系统，这就意味着只有诸如QNX这样的的实时操作系统才适合去实现一个这样的JVM。<br><br>实时JAVA规范的第一个官方商业实现版本是在Solaris 10，工作在UltraSparc硬件上，并且要求J2SE 1.4.2作为基础。未来的版本将会支持JAVA 5 以及其他的一些平台。美国海军，Raytheon公司和波音公司已经开始使用SUN的JAVA实时系统。当然，SUN的JAVA实时系统并不是第一个实时JAVA的实现。一些嵌入式系统的厂商已经在他们的系统中实现了一些实时的特性，不过他们的实现只是涵盖了一些具体的需要，并不符合JSR-1规范的要求。这对于那些使用JAVA平台并需要实时JVM的开发人员来说是个好消息。<br><br>这些听起来都不错，可是从一个开发人员的角度来看，这又意味着什么呢？要改变现有的程序使其使用RTS的API需要些什么改变呢？我们可以摆脱垃圾收集导致的中断这样一个主要的问题吗？很不幸，所有的一切并不是那么简单。仅仅简单的安装一个RTS的扩展包，把java.lang.Thread实例改名交javax.realtime.RealtimeThread并不能把一个程序变成一个实时的应用程序。<br><br>不过，这仍然是一个很好的开端，至少你可以获得一个革命性的实时的垃圾收集器。不得不提的是现有的J2SE的程序将可以成功的在JAVA 实时系统下运行 因为RTSJ规范只是JAVA语言规范和JAVA虚拟机规范的一个子集。它并不允许那些可能会破坏现有程序的语义扩展。<br><br>为了使得实时的垃圾收集器可预测，程序员必须了解它的程序是如何从堆中要求内存的，因为垃圾收集器和程序都要用到它。程序产生垃圾，然后垃圾收集器将垃圾清理成空闲的内存，它们需要在堆中进行。因此，你必须告诉垃圾收集器关于你的程序产生垃圾的速度等一些信息，这样它可以明白自己需要多快的进行垃圾收集。如何获取那些数字可能是有点tricky，但是不管你做什么，你必须得考虑内存的使用。<br><br>如果运行RealtimeThread不是足够的，在修改完大骂之后，垃圾收集器的停顿将仍然很长或者无法预测。你可能需要使用一个execution context而不是RealtimeThread，例如javax.realtime.NoHeapRealtimeThread.它可以通过使用内存而不是JAVA堆来获得可预测的特性，例如immortal memory 和 scoped memory，后面我们将讨论他们。获得可预测性当然需要代价的：典型的情况是牺牲了系统的平均性能。<br><br>JAVA RTS的新特性<br><br>让我们来看一下JAVA RTS平台中增加了哪些新特性。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;*直接内存存取.JAVA RTS 允许对物理内存的直接存取，这与J2ME很像。不要惊奇，JAVA实时系统主要针对的平台就是嵌入式系统。这就意味着现在你可以创建用纯JAVA写的设备驱动了。尽管内存存取并不是一个实时系统的直接要求，许多应用程序还是需要对物理内存做存取。JAVA RST定义了一个新的类，这个类允许程序员对物理内存做字节级别的存取，同时这个类还允许在物理内存中创建对象。有人可能会认为JAVA支持物理内存存取就是放弃了原有的主要的原则－可靠性和安全性，并向C语言又靠近了一步。但这并不是问题的所在，JAVA通过控制内存边界和数据内容来实现了一个强大的安全保护措施。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;*异步交流。JAVA RTS 提供了两种异步交流的形式：异步事件处理和异步传输控制。异步事件处理意味这开发者可以计划对来自JVM外部的事件的反应。异步传输控制为一个线程提供了安全的中断另一个线程的方法。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;*High-resolution timing.有很多详细描述High-resolution timing的方法，包括绝对时间和相对时间。时间的调度和度量能够具有一个纳秒级准确度。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;*内存管理。有两种新的内存区域可以帮助防止由于在实时应用程序中传统的垃圾回收导致的无法预期的延迟。Immortal memory 和 scoped memory。Immortal memory保存对象而不摧毁他们，直到程序结束。这就意味着在Immortal memory中创建的对象必须像C 程序那样仔细的分配和管理。scoped memory仅仅被用于当一个进程在一个特定的范围里工作的情形。当这个进程离开这个范围的时候，对象将自动被摧毁。Immortal memory和scoped memory都不会被垃圾收集的，因此可以通过使用它们来避免垃圾收集的影响。JAVA RTS也为使用内存区域的线程提供了内存分配预算的功能的有限支持。当线程被创建的时候，每个实时线程的最大内存区域消费和最大的分配率可以是指定的。 <br><br>&nbsp;&nbsp;&nbsp;&nbsp;*实时线程。正如先前所提到的，JAVA RT支持两种新的线程模型：实时线程(javax.realtime.RealtimeThread) 和非堆实时线程(javax.realtime.NoHeapRealtimeThread).这两种线程类型都是不能被垃圾收集中断的。这些线程具有28个级别的优先级，并且和标准的JAVA不同，他们的优先级是严格的增强的。实时线程是同步的，并且并不受限于所谓的优先级颠倒（priority inversion），在这种priority inversion情况下，如果一个低优先级的线程拥有一个高优先级的线程所需要的资源，将会阻止了这个高优先级的线程的运行。测试证明JAVA RTS完全避免了priority inversion，这对于紧急任务来说是很重要的。 <br><br>它是如何工作的<br><br>让我们先简短的了解程序员可以多么轻易的利用这些实时JAVA的新特性的。我们将只考虑新的API中的最有趣的部分:线程和内存。对于其他问题，请参阅real-time JAVA specification 文档(PDF).<br><br>规范的制订者们一个主要的目标就是保证RTS编程的简单性，尽管实时问题是很复杂的；这就意味着操作系统必须尽可能多的完成一些工作，使得程序员只需要完成实时程序设计这个具有挑战性的工作。<br><br>线程<br><br>RealtimeThread 类继承了java.lang.Thread类。这个类有多个构造函数，开发者能够调试线程的行为。<br><br></span>
<pre><span style="FONT-SIZE: 10pt">public RealtimeThread()<br>public RealtimeThread(SchedulingParameters scheduling)<br>public RealtimeThread(SchedulingParameters scheduling, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReleaseParameters release)</span></pre>
<br><br><span style="FONT-SIZE: 10pt">提供给RealtimeThread（还有MemoryParameters ）的构造函数的两个参数ReleaseParameters 和SchedulingParameters使得线程的时间和处理器需求可以通知给系统。RealtimeThread实现了Schedulable接口。关键就在于Schedulable对象可以被放置在ImmortalMemory, HeapMemory, ScopedPhysicalMemory, and PhysicalImmortal等类的实例所表示的内存中。<br><br>NoHeapRealtimeThread 是RealtimeThread的一个特有的形式。因为NoHeapRealtimeThread实例可以立刻抢占任何已实现的垃圾收集器，它的run（）函数中的逻辑不允许分配或引用任何在堆中分配的对象，或者是对在堆中的对象进行操作。例如，如果A和B是immortal memory中的两个对象。B.p是堆中的一个对象的引用 ， A.p和B.p的类型是一致的，那么NoHeapRealtimeThread是不允许执行与下面类似的代码的：<br><br></span>
<pre><span style="FONT-SIZE: 10pt">A.p = B.p;<br>B.p = null;</span></pre>
<br><br><span style="FONT-SIZE: 10pt">考虑到这些限制，NoHeapRealtimeThread对象必须被放置在一个内存区域中以防止线程可能unexceptionally的控制实例的变量。这就是为什么NoHeapRealtimeThread的构造函数要求ScopedMemory 或 ImmortalMemory的引用了。当线程启动后，所有的操作都处于分配的内存区域中。因此，new操作产生的所有的内存分配都处于这个区域中。<br><br>内存管理<br><br>我们已经发现了一些内存相关的类了。更确切的说，MemoryArea 是所有处理可分配的内存区域的类的抽象的基类，这些内存区域包括ImmortalMemory，物理内存和ScopedMemory。HeapMemory类是一个单体（singleton）对象，它允许其他内存区域中的代码在JAVA堆中分配内存。这个方法返回一个对HeapMemory单体实例所代表的JAVA堆的指针。<br><br></span>
<pre><span style="FONT-SIZE: 10pt">public static HeapMemory instance() </span></pre>
<br><br><span style="FONT-SIZE: 10pt">更有意思的是ImmortalMemory类，这是一个所有线程都共享的内存资源。在ImmortalMemory中分配的对象一直会存活到程序结束的时候，并且绝不会被垃圾收集掉，尽管一些垃圾收集算法可能会要求扫描Immortal Memory<br><br>ScopedMemory区域连接到特定内存区域，这是一个处理那些指向具有有限生命周期的内存空间的类<br><br>RawMemoryAccess实例把一段范围的物理内存当作一个固定顺序的字节。Accessor方法的完整实现将允许通过偏移量来访问物理地址的内容，把它解析成byte，short，int或long数据或者这些类型的数组。如果你需要访问float或是double类型的值，就必须使用RawMemoryFloatAccess类。偏移量是代表high-order 还是 low-order字节取决于RealtimeSystem类中的静态布尔变量BYTE_ORDER的值。一个raw的内存空间当然不能够存储JAVA对象的引用，因为这样一种操作是不安全的。RawMemoryAccess类用下面的构造函数来初始化：<br><br></span>
<pre><span style="FONT-SIZE: 10pt">public RawMemoryAccess(JAVA.lang.Object type,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;long base, long size)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws SecurityException, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OffsetOutOfBoundsException,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SizeOutOfBoundsException,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UnsupportedPhysicalMemoryException,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MemoryTypeConflictException,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MemoryInUseException</span></pre>
<br><br>值得注意的是这个构造函数定义了相当多的可能抛出的异常。Type参数是代表所需内存类型的对象所需要的。它被用于定义初始地址以及控制映射。<br><br>结论<br><br>实时JAVA提供了一个更可靠和可预测的调度机制，内存处理方法，各种不同的内存模型，一个可预测性更好的线程和同步模型，异步时间处理，以及high-resolution时间处理。这使得可预测的运行成为传统的计算性能测试中所有决定中的第一选择。这就是实时的真谛。<br><br>这篇文章只是一个新的概念和Sun的JAVA实现的的综述。如果你对具体的实现细节很感兴趣，你可以在下面的资源中找到很多有用的资料。实时JAVA为JAVA应用程序提供了实时能力，这也使得JAVA有可能成为第一个可用的商业的实时语言。<br><br><br>资源 <br>&nbsp;&nbsp; * Real-Time JAVA Platform Programming, by Peter C. Dibble<br>&nbsp;&nbsp;&nbsp;&nbsp;* Real-Time Specification for JAVA (PDF)<br>&nbsp;&nbsp;&nbsp;&nbsp;* Sun J2SE Real-Time Edition<br><br><br>Peter Mikhalenko是Deutsche Bank的一个商务顾问。<br>
<img src ="http://www.blogjava.net/XXNiuLang/aggbug/136574.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/XXNiuLang/" target="_blank">DanielWang</a> 2007-08-14 10:01 <a href="http://www.blogjava.net/XXNiuLang/articles/136574.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JMX(The Java Management extensions) 架构概述</title><link>http://www.blogjava.net/XXNiuLang/articles/136405.html</link><dc:creator>DanielWang</dc:creator><author>DanielWang</author><pubDate>Mon, 13 Aug 2007 07:43:00 GMT</pubDate><guid>http://www.blogjava.net/XXNiuLang/articles/136405.html</guid><wfw:comment>http://www.blogjava.net/XXNiuLang/comments/136405.html</wfw:comment><comments>http://www.blogjava.net/XXNiuLang/articles/136405.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/XXNiuLang/comments/commentRss/136405.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/XXNiuLang/services/trackbacks/136405.html</trackback:ping><description><![CDATA[<span style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">本节主要介绍JMX规范中的各个部分，以及它与整个管理架构的关系：<br>&nbsp;&nbsp;&nbsp; 1.工具层（Instrumentation Level）<br>&nbsp;&nbsp;&nbsp; 2.代理层（Agent Level）<br>&nbsp;&nbsp;&nbsp; 3.分布式服务层（Distributed Services Level）<br>&nbsp;&nbsp;&nbsp; 4.其他管理协议层（Additional Management Protocol Level）<br>&nbsp;&nbsp;&nbsp;<br>工具层（Instrumentation Level）<br>&nbsp;&nbsp;&nbsp; 工具层为实现JMX可管理资源提供了一个规范。JMX可管理资源可以是应用、服务的实现、设备、用户等等。它可以是用Java开发或用Java封装，以至于能够被JMX-compliant程序管理。<br>&nbsp;&nbsp;&nbsp; 一个给定资源的工具是由一个或者多个标准的或动态的管理Bean或称作MBeans来提供。标准的MBeans是与源于JavaBeans(TM)组件模型的某一设计模式相一致的Java对象。动态MBeans则遵照一个特定的接口，在运行期间提供更多的灵活性。详细信息请参看&#8221;Managed Beans（MBeans）&#8220;。<br>&nbsp;&nbsp;&nbsp; 资源的工具通过代理层（Agent Level）使其可以被管理。MBeans不需要JMX代理知道他们的操作。<br>&nbsp;&nbsp;&nbsp; MBeans通常设计为灵活的、简单的并且容易实现。应用、服务、或者设备的开发者，通过一个标准的方法可以使他们的产品变成可管理，而不需要理解复杂的管理系统。现存的对象可以轻松的提供自己的标准MBeans或者包裹成动态的MBeans，这样可以付出很少的代价使现存的资源变成可管理的。<br>&nbsp;&nbsp;&nbsp; 另外，工具层（Instrumentation Level）也制定了一个通知机制。这样就允许MBeans可以产生和传递通知事件到其他各层的组件中去。<br>&nbsp;&nbsp;&nbsp; 由于工具层（Instrumentation Level）是由设计模式和Java接口组成，所以参考实现只提供一个不同MBeans和它们的通知机制的例子。<br>&nbsp;&nbsp;&nbsp; 工具层（Instrumentation Level）的兼容性测试会检测MBeans是否与设计模式相一致，是否正确的实现了接口。<br>&nbsp;&nbsp;&nbsp; JMX的可管理资源能被遵从JMX规范的代理自动进行管理。同样，它们也可以被不遵从JMX规范，但支持MBeans设计模式和接口的系统管理。<br><br>代理层（Agent Level）<br>&nbsp;&nbsp;&nbsp; 代理层（Agent Level）提供了一个实现代理的规范。管理代理之间控制被管理的资源，并使它们对于远程的管理程序可用。虽然并没有要求，但是代理通常与它所管理的资源放置在同一台机器上。<br>&nbsp;&nbsp;&nbsp; 代理层（Agent Level）构建在工具层（Instrumentation Level）之上，并且使用工具层（Instrumentation Level），通过定义一个标准化的代理来管理JMX的可管理资源。JMX代理由一个MBean Server和一系列的处理MBeans的服务组成。另外，JMX的代理需要至少一个通信适配器或连接器，在本部分内容不对其做详细的说明。MBean Server的实现和代理服务都托管在一个JMX规范的实现上。<br>&nbsp;&nbsp;&nbsp; JMX代理可以嵌入在一台安装有JVM（Java Virtual Machine），并安放了JMX可管理资源的机器里。同样，当被管理的资源只提供一个私有（non-Java）的环境时，JMX代理可以作为一个中介或者集线器存在。JMX代理并不需要知道它为什么资源提供服务。任何JMX可管理资源可以使用任何一个提供它所需服务的JMX代理。<br>&nbsp;&nbsp;&nbsp; 管理层通过一个协议适配器或连接器（在接下来的部分介绍），访问代理的MBeans，使用其提供的服务。对于JMX代理并不需要知道远程的管理程序是如何使用它们。<br>&nbsp;&nbsp;&nbsp; 管理系统中实现JMX代理的开发者能用标准的方法开发自己的产品，而不需要去理解JMX可管理资源的语义，以及管理程序的功能。<br>&nbsp;&nbsp;&nbsp; JMX代理的参考实现是一系列的，提供一个MBean Server和所有代理服务的Java类。<br>&nbsp;&nbsp;&nbsp; 代理的兼容性测试会检测被测试的代理是否遵从代理规范中提供的接口和功能。成功通过CTS测试的代理即可成为合格的JMX代理。<br>&nbsp;&nbsp;&nbsp; JMX代理运行在J2SE(tm) Version 1.3及以上版本，and on certain profiles of the J2ME(tm)。<br>&nbsp;&nbsp;&nbsp; JMX代理自动适应JMX分布式服务，也可以被支持JMX代理但不遵从JMX的系统使用。<br><br>分布式服务层（Distributed Services Level）<br>&nbsp;&nbsp;&nbsp; 分布式服务层（Distributed Services Level）的详细定义超出了本规范的范围。为介绍JMX架构的概述，在此仅对其进行简单介绍。<br>&nbsp;&nbsp;&nbsp; 分布式服务层（Distributed Services Level）提供实现JMX管理的接口。本层定义可以在代理或者分层的代理操作的接口和组件。这些组件可以：<br>&nbsp;&nbsp;&nbsp; 1.提供管理程序的接口，通过一个连接器，透明的与代理和它的JMX可管理资源交互；<br>&nbsp;&nbsp;&nbsp; 2.通过将它们的语义映射到data-rich协议（例如超文本标志语言（HTML）或者简单网络管理协议（SNMP）），来暴露JMX代理的管理视图和它的MBeans；<br>&nbsp;&nbsp;&nbsp; 3.从高层的管理平台发布管理信息到JMX代理；<br>&nbsp;&nbsp;&nbsp; 4.提供安全。<br>&nbsp;&nbsp;&nbsp; 管理组件通过网络相互协作，提供分布的，可调节的管理功能。基于Java的自定义管理功能可以在这些组件之上进行开发，来部署一个管理程序。<br>&nbsp;&nbsp;&nbsp; 管理层和代理、工具层的联合，为设计和开发完整的管理解决方案提供了一个完整的架构。JMX技术为可移植，按需部署的管理功能，动态的或流动的服务，以及安全这类解决方案提供了唯一的工具。</span>
<img src ="http://www.blogjava.net/XXNiuLang/aggbug/136405.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/XXNiuLang/" target="_blank">DanielWang</a> 2007-08-13 15:43 <a href="http://www.blogjava.net/XXNiuLang/articles/136405.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JMX组件概述</title><link>http://www.blogjava.net/XXNiuLang/articles/136394.html</link><dc:creator>DanielWang</dc:creator><author>DanielWang</author><pubDate>Mon, 13 Aug 2007 07:15:00 GMT</pubDate><guid>http://www.blogjava.net/XXNiuLang/articles/136394.html</guid><wfw:comment>http://www.blogjava.net/XXNiuLang/comments/136394.html</wfw:comment><comments>http://www.blogjava.net/XXNiuLang/articles/136394.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/XXNiuLang/comments/commentRss/136394.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/XXNiuLang/services/trackbacks/136394.html</trackback:ping><description><![CDATA[<span style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">下面列出了JMX架构每一层中的关键组件，并将在接下来的部分进行介绍。<br>&nbsp;&nbsp;&nbsp; 1.工具层（Instrumentation Level）<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; a.MBeans（标准的，动态的，开放的和模型MBeans）<br>&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; b.通知模型<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; c.MBean元数据类<br>&nbsp;&nbsp;&nbsp; 2.代理层（Agent Level）<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; a.MBean Server<br>&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; b.代理服务<br><br>工具层的组件<br><br>&nbsp;&nbsp;&nbsp; 工具层的主要组件就是MBean设计模式，通知模型和MBean元数据类。<br><br>MBeans<br>&nbsp;&nbsp;&nbsp; MBean是实现了一个特定接口，并遵从某一设计模式的Java对象。这要求在MBean中规范化资源管理接口的表现形式。资源的管理接口包含所有需要的信息，以及管理程序需要在资源上进行的操作的控制。<br>&nbsp;&nbsp;&nbsp; MBean的管理接口表现为如下几种：<br>&nbsp;&nbsp;&nbsp; 1.可以被访问的属性；<br>&nbsp;&nbsp;&nbsp; 2.可以被调用的操作；<br>&nbsp;&nbsp;&nbsp; 3.可以被发布的通知；<br>&nbsp;&nbsp;&nbsp; 4.MBean类的构造子。<br>&nbsp;&nbsp;&nbsp; MBeans通过它们的公共方法封装属性和方法，沿袭设计模式暴露它们给管理程序。例如，在标准MBean中一个只读的属性只有getter方法，而可读写的属性则既有getter方法，又有setter方法。<br>任何作为MBean来实现的对象，并且在代理中注册，则它可以在代理所在的JVM以外进行管理。这些对象包括：<br>&nbsp;&nbsp;&nbsp; 1.程序所管理的资源；<br>&nbsp;&nbsp;&nbsp; 2.为帮助管理资源提供的增值服务；<br>&nbsp;&nbsp;&nbsp; 3.能被管理的JMX基础结构组件。<br>&nbsp;&nbsp;&nbsp; 其他的JMX组件，例如代理服务，被指定为工具MBeans，使它们能受益于JMX的基础结构，并提供管理接口。<br>&nbsp;&nbsp;&nbsp; JMX架构并没有强行限制编译好的MBean类的储存位置。它们可以放在任何代理的JVM的classpath指向的位置，如果使用了类载入（class loading）它们也可以放在一个远程的站点。<br>&nbsp;&nbsp;&nbsp; JMX规范定义了四类MBean：标准MBean、动态MBean、开放MBean和模型MBean。每一种MBean需要一种不同的工具。<br>&nbsp;&nbsp;&nbsp; 1.标准MBeans（Standard MBeans）设计和实现是最简单的，这类MBean使用自己的方法名作为管理接口；<br>&nbsp;&nbsp;&nbsp; 2.动态MBeans（Dynamic MBeans）必须实现一个指定的接口，由于动态MBeans在运行期间暴露它们的管理接口，因此更为灵活；<br>&nbsp;&nbsp;&nbsp; 3.开放MBeans（Open MBeans）属于动态MBeans，这类MBean依靠基础数据类型来实现通用管理，并为友情用户进行自我声明；<br>&nbsp;&nbsp;&nbsp; 4.模型MBeans（Model MBeans）同样也是动态MBeans，这类MBeans是完全可配置的，在运行期间进行自我声明；它们为资源动态工具提供一个一般性的，有默认行为的MBeans类。<br><br>通知模型（Notification Model）<br>&nbsp;&nbsp;&nbsp; JMX规范定义了基于Java事件模型的一般性通知模型。通知可以被MBean的实例和MBean server发布。规范中指明通知的发送和接受者必须实现通知对象、广播和监听接口。<br>&nbsp;&nbsp;&nbsp; JMX的实现可以提供通知模型发布的服务，来使管理程序远程侦听MBean模型和MBean server的事件。如何完成通知模型的发布超出了本部分规范的范围。规范的后面将讨论高级通知服务，例如管理程序取回通知进行转发和保存。<br><br>MBean元数据类<br>&nbsp;&nbsp;&nbsp; 工具规范定义了MBean的管理接口的类。这些类用来定义构建发布MBean管理接口的标准信息结构。在代理层的MBean server的一个功能是提供MBeans的元数据。<br>&nbsp;&nbsp;&nbsp; 元数据类包含描述MBean的管理接口的所有组件的结构：属性、操作、通知和构造子。每一个元数据类包含有名字、描述和它的特性。例如，属性的特性是它为只读、只写还是可读写；操作的特性是它的参数的标识和返回类型。<br>&nbsp;&nbsp;&nbsp; 不同类型的MBean扩展元数据类来提供附加的信息。通过继承，标准信息总是可用的，知道如何访问子类的管理程序可以获得额外的信息。<br><br>代理层的组件<br><br>&nbsp;&nbsp;&nbsp; 代理层的关键组件是工具层的对象都在其中注册的MBean server，和使JMX代理体现更自主和性能更好的智能管理可用的代理服务。<br><br>MBean Server<br>&nbsp;&nbsp;&nbsp; 被管理Bean的服务，简称MBean server，用来注册在代理中暴露给管理操作的对象。任何注册在MBean server中的对象对于管理程序都是可见的。MBean server只暴露MBean的管理接口，而不是直接暴露对象的引用。<br>&nbsp;&nbsp;&nbsp; 任何系统在代理JVM以外管理的资源都必须在MBean server中作为MBean注册。MBean server也提供一个标准化的接口，给同一个JVM来访问MBeans，为本地对象提供手工可管理资源的所有好处。MBeans可以通过一下几类来实例化和注册：<br>&nbsp;&nbsp;&nbsp; 1.其他的MBean；<br>&nbsp;&nbsp;&nbsp; 2.代理本身；<br>&nbsp;&nbsp;&nbsp; 3.远程管理程序（通过分布式服务）<br>&nbsp;&nbsp;&nbsp; 注册MBean的时候，必须为它指定一个唯一的对象名（Object Name）。管理程序用这个对象名来标识执行管理操作的对象。MBean可用的操作包括：<br>&nbsp;&nbsp;&nbsp; 1.发现MBean的管理接口；<br>&nbsp;&nbsp;&nbsp; 2.读写MBean的属性；<br>&nbsp;&nbsp;&nbsp; 3.执行MBean定义的操作；<br>&nbsp;&nbsp;&nbsp; 4.基于对象名或者属性值来查询MBean。<br>&nbsp;&nbsp;&nbsp; MBean server通过协议适配器和连接器使代理的JVM外的管理程序可以访问代理。通过指定的协议每种适配器提供所有注册在MBean server中的MBean的实例的视图。例如，HTML适配器可以显示MBean到Web浏览器。协议适配器提供的视图因协议的不同而不同，在本规范中不对其进行讨论。<br>&nbsp;&nbsp;&nbsp; 连接器提供用来处理管理和代理之间通信的管理方接口。即使是不同的协议，每个连接器都提供相同的远程接口。当远程管理程序使用这些接口时，它就可以通过网络透明的连接到代理，而不需要知道相关的协议。远程管理接口规范在JSR160&#8220;JMX Remoting 1.2&#8221;中进行讨论。<br>&nbsp;&nbsp;&nbsp; 适配器和连接器使所有的MBean server操作对于远程管理程序可用。对于一个被管理的代理，它必须包含至少一个协议适配器或者连接器。代理也可以拥有多个适配器和连接器，使它可以被不同的管理者，通过不同的协议进行管理。<br><br>代理服务（Agent Services）<br>&nbsp;&nbsp;&nbsp; 代理服务是可以在注册在MBean server中的MBean上执行管理操作的对象。通过在代理上包含智能管理，JMX可以帮助你构建更加强大的管理解决方案。代理服务通常是允许它们和它们的功能通过MBean server进行控制的MBeans。JMX规范定义了一下几种代理服务：<br>&nbsp;&nbsp;&nbsp; 1.通过管理服务小程序从任意网络位置取回和实例化新的类和本地库动态载入类，实现动态的载入类；<br>&nbsp;&nbsp;&nbsp; 2.观察MBean数字或字符串型的属性，并能通知其他对象某些类型改变了的监视器；<br>&nbsp;&nbsp;&nbsp; 3.提供一个一次报警通知或者是重复的，周期的通知的定时机制的定时器；<br>&nbsp;&nbsp;&nbsp; 4.定义MBeans之间关联和执行基于预定义关系类型关系的关系服务。<br>&nbsp;&nbsp;&nbsp; 所有的代理服务托管在一个遵从JMX的实现中。<br><br>综述<br><br>&nbsp;&nbsp;&nbsp; 本部分指明了关于实现遵从JMX工具和代理规范（Version 1.2）的工具层和代理层的托管组件。<br><br>工具层（Instrumentation Level）<br>&nbsp;&nbsp;&nbsp; 遵从JMX工具规范（Version 1.2）的实现必须提供在第2章&#8220;MBean 工具&#8221;、&#8220;第3章&#8221;开放MBeans&#8220;和第4章&#8221;模型MBean&#8220;中说明的所有组件。它包括通过Javadoc工具生成的相应的API文档中定义的相关类。这些组件为标准和动态的MBean提供了支持。<br><br>代理层（Agent Level）<br>&nbsp;&nbsp;&nbsp; 遵从JMX代理规范（Version 1.2）的实现必须提供在第二部分&#8221;JMX代理&#8220;中指定的所有组件。它包括MBean server的实现，代理服务和通过Javadoc工具生成的相应的API文档中定义的相关类。因此所有指定的四种服务的实现是必须的。</span>
<img src ="http://www.blogjava.net/XXNiuLang/aggbug/136394.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/XXNiuLang/" target="_blank">DanielWang</a> 2007-08-13 15:15 <a href="http://www.blogjava.net/XXNiuLang/articles/136394.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>