??xml version="1.0" encoding="utf-8" standalone="yes"?>麻豆网在线观看,日本午夜在线视频,欧美一区二区三区免费大片http://www.aygfsteel.com/19851985lili/category/19285.html☜GivE mE HapPy ? zh-cnWed, 28 Feb 2007 03:43:03 GMTWed, 28 Feb 2007 03:43:03 GMT60JMSQJava Message ServiceQJava消息服务Q?/title><link>http://www.aygfsteel.com/19851985lili/articles/94635.html</link><dc:creator>☜♥☞MengChuChen</dc:creator><author>☜♥☞MengChuChen</author><pubDate>Thu, 18 Jan 2007 06:38:00 GMT</pubDate><guid>http://www.aygfsteel.com/19851985lili/articles/94635.html</guid><wfw:comment>http://www.aygfsteel.com/19851985lili/comments/94635.html</wfw:comment><comments>http://www.aygfsteel.com/19851985lili/articles/94635.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/19851985lili/comments/commentRss/94635.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/19851985lili/services/trackbacks/94635.html</trackback:ping><description><![CDATA[ <font face="Verdana">  </font> <a target="_new"> <b style="COLOR: black; BACKGROUND-COLOR: #ffff66"> <font face="Verdana">JMS</font> </b> </a> <font face="Verdana">Q?/font> <a target="_new"> <font face="Verdana">Java Message Service</font> </a> <font face="Verdana">Q?/font> <a target="_new"> <font face="Verdana">Java消息服务</font> </a> <font face="Verdana">Q是一lJava应用</font> <a target="_new"> <font face="Verdana">E序</font> </a> <font face="Verdana">接口(Java </font> <a target="_new"> <font face="Verdana">API</font> </a> <font face="Verdana">)Q它提供创徏、发送、接收、读?/font> <a target="_new"> <font face="Verdana">消息</font> </a> <font face="Verdana">的服务。由Sun公司和它的合作伙伴设计的<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS</b> API定义了一l公q应用E序接口和相应语法,使得JavaE序能够和其他消?/font> <a target="_new"> <font face="Verdana">lg</font> </a> <font face="Verdana">q行通信?</font> <p> <font face="Verdana">      <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS</b>是一U与厂商无关?APIQ用来访问消息收发系l。它</font> <a target="_new"> <font face="Verdana">c?/font> </a> <font face="Verdana">g </font> <a target="_new"> <font face="Verdana">JDBC</font> </a> <font face="Verdana"> (Java </font> <a target="_new"> <font face="Verdana">Database</font> </a> <font face="Verdana"> Connectivity)Q这里,JDBC 是可以用来访问许多不同关p?/font> <a target="_new"> <font face="Verdana">数据?/font> </a> <font face="Verdana">?APIQ?<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS</b> 则提供同样与厂商无关的访问方法,以访问消息收发服务。许多厂商目前都支持 <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS</b>Q包?IBM ?MQSeries、BEA?Weblogic <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS</b> service?Progress ?SonicMQQ这只是几个例子?<br /><b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS</b> 使您能够通过消息收发服务Q有时称为消息中介程序或路由器)从一?<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS</b> 客户机向另一?JML 客户机发送消息。消息是 <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS</b> 中的一U?/font> <a target="_new"> <font face="Verdana">cd</font> </a> <a target="_new"> <font face="Verdana">对象</font> </a> <font face="Verdana">Q由两部分组成:报头和消息主体。报头由路由信息以及有关该消息的</font> <a target="_new"> <font face="Verdana">元数?/font> </a> <font face="Verdana">l成。消息主体则携带着应用E序的数据或有效负蝲。根据有效负载的cd来划分,可以消息分为几U类型,它们分别携带Q简单文?(TextMessage)、可序列化的对象 (ObjectMessage)、属性集?(MapMessage)、字节流 (BytesMessage)、原始值流 (StreamMessage)Q还有无有效负蝲的消?(Message)?</font> </p> <p> <font face="Verdana">      消息收发pȝ是异步的Q也是_<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS</b> 客户机可以发送消息而不必等待回应。比较可知,q完全不同于Z RPC 的(Zq程q程的)pȝQ如 <a target="_new">EJB</a> 1.1?a target="_new">CORBA</a> ?Java <a target="_new">RMI</a> 的引用实现。在 RPC 中,客户用服务器上某个分布式对象的一个方法。在Ҏ调用q回之前Q该客户dQ该客户机在可以执行下一条指令之前,必须{待Ҏ调用l束。在 <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS</b> 中,客户机将消息发送给一个虚拟通道Q主题或队列Q,而其?<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS</b> 客户机则预订或监听这个虚拟通道。当 <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS</b> 客户机发送消息时Q它q不{待回应。它执行发送操作,然后l箋执行下一条指令。消息可能最l{发到一个或许多个客hQ这些客h都不需要作出回应?</font> </p> <p> <font face="Verdana">  <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS</b>的通用接口集合以异步方式发送或接收消息。异步方式接收消息显然是使用间断|络q接的客hQ诸如移动电话和PDA的最好的选择。另外, <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS</b>采用一U宽杄合方式整合企业系l的ҎQ其主要的目的就是创够用跨q_数据信息的、可UL的企业应用E序Q而把开发h力解攑և来?/font> </p> <p> <font face="Verdana">  Java消息服务支持两种消息模型QPoint-to-Point消息(<a target="_new">P2P</a>)和发布订阅消息(Publish Subscribe messagingQ简UPu<a target="_new">b/S</a>ubQ?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS</b>规范q不要求供应商同时支持这两种消息模型Q但开发者应该熟悉这两种消息模型的优势与~点?/font> </p> <p> <font face="Verdana">  P2P消息模型是在点对点之间传递消息时使用。如果应用程序开发者希望每一条消息都能够被处理,那么应该使用P2P消息模型。与Pub/Sub消息模型不同QP2P消息L能够被传送到指定的位|?/font> </p> <p> <font face="Verdana">  Pub/Sub模型在一到多的消息广播时使用。如果一定程度的消息传递的不可靠性可以被接受的话Q那么应用程序开发者也可以使用Pub/Sub消息模型。换句话_它适用于所有的消息消费E序q不要求能够收到所有的信息或者消息消费程序ƈ不想接收CQ何消息的情况?/font> </p> <p> <font face="Verdana">  <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS</b>通过允许创徏持久订阅来简化时间相x,即消息预订者未ȀzM可以接收到消息。此外,使用持久订阅q可通过队列提供灉|性和可靠性,而仍然允许消息被发给许多的接收者?Topic Subscriber topic Subscriber = topicSession.createDurableSubscriber(topic, subscriptionName);   Connection对象表示了到两种消息模型中的MU的消息pȝ的连接。服务器端和客户机端对象要求理创徏?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS</b>q接的状态。连接是由Connection Factory创徏的ƈ且通过JNDI查寻定位?//取得用于 P2P?QueueConnectionFactory QueueConnectionFactory = queueConnectionFactory( ); Context messaging = new InitialContext( ); QueueConnectionFactory = (QueueConnectionFactory) Messaging.lookup(“QueueConnectionFactory?; //取得用于 pub/sub?TopicConnectionFactory TopicConnectonFactory topicConnectionFactory; Context messaging = new InitialContext(); topicConnectionFactory = (TopicConnectionFactory) messaging.lookup(“TopicConnectionFactory?;   注意Q用于P2P的代码和用于PublishSubscribe的代码非常相伹{?/font> </p> <p> <font face="Verdana">  如果session被标Cؓtransactional的话Q确认消息就通过认和校正来自动地处理。如果session没有标记?transactionalQ你有三个用于消息确认的选项?/font> </p> <p> <font face="Verdana">  · AUTO_ACKNOWLEDGE session自动地认收到一则消息?/font> </p> <p> <font face="Verdana">  · <a target="_new">CLIENT</a>_ACKNOWLEDGE <a target="_new">客户?/a>E序确认收C则消息,调用q则消息的确认方法?   · DUPS_OK_ACKNOWLEDGE q个选项命osession“懒散的”确认消息传递,可以惛_Q这导致消息提供者传递的一些复制消息可能会出错。这U确认的方式只应当用于消息消费程序可以容忍潜在的副本消息存在的情c?queueSession = queueConnection.createQueueSession(false, session.AUTO_ACKNOWLEDGE);//P2P topicSession = topicConnection.createTopicSession(false, session.AUTO_ACKNOWLEDGE); //Pub-Sub</font> </p> <p> <font face="Verdana">  注意Q在本例中,一个session目的从连l中创徏Q非值指出session是non-transactional的,q且 session自动地认收到一则消息?/font> </p> <p> <font face="Verdana">  <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS</b>现在有两U传递消息的方式。标CؓNON_PERSISTENT的消息最多投递一ơ,而标CؓPERSISTENT的消息将使用暂存后再转送的机理投递。如果一?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS</b>服务ȝQ那么持久性消息不会丢׃是得{到q个服务恢复联机时才会被传递。所以默认的消息传递方式是非持久性的。即使用非持久性消息可能降低内务和需要的存储器,q且q种传递方式只有当你不需要接收所有的消息时才使用?/font> </p> <p> <font face="Verdana">  虽然 <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS</b>规范q不需?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS</b>供应商实现消息的优先U\U,但是它需要递送加快的消息优先于普通别的消息?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS</b>定义了从0?的优先路线U别Q?是最低的优先U?则是最高的。更Ҏ的是0?是正怼先的变化幅度,??是加快的优先U的变化q度。D例来_ topicPublisher.publish (message, DeliveryMode.PERSISTENT, 8, 10000); //Pub-Sub ?queueSender.send(message, DeliveryMode.PERSISTENT, 8, 10000);//P2P   q个代码片断Q有两种消息模型Q映递送方式是持久的,优先Uؓ加快型,生存周期?0000 (以毫U?a target="_new">度量</a> )。如果生存周期设|ؓӞq则消息永q不会过期。当消息需要时间限制否则将使其无效Ӟ讄生存周期是有用的?/font> </p> <p> <font face="Verdana">  <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS</b>定义了五U不同的消息正文格式Q以及调用的消息cdQ允怽发送ƈ接收以一些不同Ş式的数据Q提供现有消息格式的一些别的兼容性?/font> </p> <p> <font face="Verdana">  · StreamMessage -- Java原始值的数据?</font> </p> <p> <font face="Verdana">  · MapMessage--一套名U?值对</font> </p> <p> <font face="Verdana">  · TextMessage--一个字W串对象</font> </p> <p> <font face="Verdana">  · ObjectMessage--一个序列化?Java对象</font> </p> <p> <font face="Verdana">  · BytesMessage--一个未解释字节的数据流</font> </p> <p> <font face="Verdana">  <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS</b>应用E序接口提供用于创徏每种cd消息和设|荷载的Ҏ例如Qؓ了在一个队列创建ƈ发送一个TextMessage实例Q你可以使用下列语句Q?TextMessage message = queueSession.createTextMessage(); message.setText(textMsg);   以异步方式接收消息,需要创Z个消息监听器然后注册一个或多个使用MessageConsumer?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS</b> MessageListener接口。会?主题或队?负责产生某些消息Q这些消息被传送到使用onMessageҎ的监听者那里?import javax.<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">jms</b>.*; public <a target="_new">class</a> ExampleListener implements MessageListener { //把消息强制{化ؓTextMessage格式 public void onMessage(Message message) { TextMessage textMsg = null; // 打开q处理这D|?} }   当我们创建QueueReceiver和TopicSubscriberӞ我们传递消息选择器字W串Q?//P2P QueueReceiver QueueReceiver receiver; receiver = session.createReceiver(queue, selector); //Pub-Sub TopicSubscriber TopicSubscriber subscriber; subscriber = session.createSubscriber(topic, selector);   Z启动消息的交付,不论是Pub/Subq是P2PQ都需要调用startҎ?TopicConnection.start( ); //pub-sub QueueConnection.start( ); //P2P TopicConnection.start ( );// pub-sub QueueConnection.start ( );// P2P</font> </p> <p> <font face="Verdana">  当一条消息被捕捉Ӟq条消息做ؓ一条必被强制转化为适当消息cd的普通Message对象到达。这是一个被用来提取或打开消息内容的getterҎ。下列代码片D用StreamMessagecd?private void unPackMessage (Message message) { String eName; String position; double rate; StreamMessage message; Message = session.createStreamMessage( ); //注意下面的代码必L照我l出的顺序书?message.writeString(eName); message.writeString(position); message.writeDouble(rate); //实现处理消息的必要的E序逻辑 }</font> </p> <p> <font face="Verdana">  停止消息的传递,无论是Pub/Subq是P2PQ都调用stopҎ?TopicConnection.start( ); //pub-sub QueueConnection.start( ); //P2P TopicConnection.start ( );// pub-sub QueueConnection.start ( );// P2P   其他?a target="_new">J2EE</a>lg--<a target="_new">servlet</a>或EJB--可以当作消息生者;然而,它们可能只能同步操作Q这可能是因为它们的h-应答的性质军_的。虽?a target="_new">XML</a>目前q不是被支持的消息类型,发送一个XML<a target="_new">文g</a>和创Z条文本类型消息以及把XML文gd到消息的有效负蝲都一L单,都是以非专有的方式传送数据。值得注意的是Q一?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS</b>供应厂商已经提供了可用的XML消息cd。但是用非标准的消息类型可能会出现可移植性问题?String reportData; //reportData内容为XML 文 TextMessage message; message = session.createTextMessage(); message.setText (reportData);</font> </p> <p> <font face="Verdana">  消息驱动lg(MDB)是一个当消息到达时被容器调用的异步消息消费程序。和entity和session EJB不同QMDB没有本地和远E接口ƈ且是匿名的;它们对于客户是不可见的。MDB?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS</b>pȝ的一部分Q作为消费者实现服务器上的商业逻辑E序?一个客L序可能通过使用JNDI定位一个与MDB相关联的<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS</b>?例如Q?Context initialContext = new InitialContext(); Queue reportInfoQueue = (javax.<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">jms</b>.Queue)initialContext.lookup (“java:comp/env/<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">jms</b>/reportInfoQueue?;   MDB是由Beancd相应的XML部v描述W组成?Bean cd现MessageDriveBean 接口Q?import javax.ejb.*; import <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">jms</b>.Message.*; public interface MessageDriveBean { public void ejbCreate(); public void ejbRemove(); public void setMessageDrivenContext(MessageDrivenContext ctx); }   消息监听器接口: import javax.<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">jms</b>.*; public interface MessageListener { public void onMessage( ); }</font> </p> <p> <font face="Verdana">  部v描述W?Q?DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/j2ee/dtds/ejb-jar_2_0.dtd"Q?Qejb-jarQ?Qenterprise-beansQ?Qmessage-drivenQ?Qejb-nameQMDBQ?ejb-nameQ?Qejb-classQMDBQ?ejb-classQ?Qtransaction-typeQContainerQ?transaction-typeQ?Qmessage-driven-destinationQ?Q?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">jms</b>-destination-typeQjavax.<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">jms</b>.QueueQ?<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">jms</b>-destination-typeQ?Q?message-driven-destinationQ?Qsecurity-identityQ?Qrun-as-specified-identityQ?Qrole-nameQeveryoneQ?role-nameQ?Q?run-as-specified-identityQ?Q?security-identityQ?Q?message-drivenQ?Q?enterprise-beansQ?Q?ejb-jarQ?/font> </p> <p> <font face="Verdana">   既然我们现在已经有了一些基本的<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS</b>知识Q那么我们可以?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS</b>做什么呢QQ何事情都可以?/font> </p> <p> <font face="Verdana">   例如Q分别用于销售、库存、客h务和账目处理的系l。这些部门之间的pȝ很可能已l存在了很长旉Q这些处理要求把事务Ud到系l中去,qƈ不是一个小的工作。这是消息服务适用的地炏V?/font> </p> <p> <font face="Verdana">  当售货员完成销售的时候,一条消息被发给库存pȝQ一旦订单消息发送给收发货h员,可以按照订单出货了。当订单成功地发货,pȝ通知֮服务和会计系l这个订单已l成功的交易了。所有对应的每个<a target="_new">子系l?/a>都自动地Ҏ收到的消息进行更新?/font> </p> <p> <font face="Verdana">  <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS</b>一般都不是用来整合一个系l,而是整合许多可能参与消息驱动环境的系l?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS</b>是一个用于开发和集成企业应用E序的重要的工具。因多公叔R有以前遗留下来的pȝ和新q开发的pȝl合h的系l,消息的用是整合整个企业的重要的步骤?</font> </p> <p> <font face="Verdana">   </font> </p> <p> <font face="Verdana"> <strong> <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS</b>接口描述</strong> </font> </p> <p> <font face="Verdana">      <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS</b> 支持两种消息cdPTP 和Pub/SubQ分别称作:PTP Domain 和Pub/Sub DomainQ这两种接口都承统一?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS</b> Parent 接口Q?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS</b> 主要接口如下所C:</font> </p> <font face="Verdana"> <p align="center"> </p> <table class="table" border="1"> <tbody> <tr> <td class="th" width="138"> <b> <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS</b> Parent</b>  </td> <td class="th" width="210"> <b>PTPDomain</b></td> <td class="th" width="214"> <b>Pub/Sub Domain</b> </td> </tr> <tr> <td class="td" width="138">ConnectionFactory</td> <td class="td" width="210">QueueConnectionFactory</td> <td class="td" width="214">TopicConnectionFactory</td> </tr> <tr> <td class="td" width="138">Connection</td> <td class="td" width="210">QueueConnection</td> <td class="td" width="214">TopicConnection</td> </tr> <tr> <td class="td" width="138">Destination</td> <td class="td" width="210">Queue</td> <td class="td" width="214">Topic</td> </tr> <tr> <td class="td" width="138">Session</td> <td class="td" width="210">QueueSession</td> <td class="td" width="214">TopicSession</td> </tr> <tr> <td class="td" width="138">MessageProducer</td> <td class="td" width="210">QueueSender</td> <td class="td" width="214">TopicPublisher</td> </tr> <tr> <td class="td" width="138">MessageConsumer</td> <td class="td" width="210">QueueReceiver,QueueBrowser</td> <td class="td" width="214">TopicSubscriber</td> </tr> </tbody> </table> </font> <p> <font face="Verdana">      以下是对q些接口的简单描qͼ<br />    ConnectionFactory Q连接工厂,<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS</b> 用它创徏q接<br />    Connection Q?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS</b> 客户端到<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS</b> Provider 的连?br />    Destination Q消息的目的?br />    SessionQ?一个发送或接收消息?a target="_new">U程</a><br />    MessageProducerQ?由Session 对象创徏的用来发送消息的对象<br />    MessageConsumerQ?由Session 对象创徏的用来接收消息的对象</font> </p> <p> <font face="Verdana"> </font> </p> <p> <font face="Verdana"> <strong> <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS</b>消息模型</strong> </font> </p> <p> <font face="Verdana"> <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS</b> 消息׃下几部分l成Q消息头Q属性,消息体?/font> </p> <p> <font face="Verdana">    <strong>消息?Header)</strong> - 消息头包含消息的识别信息和\׃息,消息头包含一些标准的属性如QJMSDestination,JMSMessageID {?</font> </p> <p align="center"> <font face="Verdana"> <table class="table" border="1"> <tbody> <tr> <td class="th" width="150"> <b> <i>消息?/i> </b> </td> <td class="th" width="515"> <b> <i>p讄</i> </b> </td> </tr> <tr> <td class="td" width="150">JMSDestination</td> <td class="td" width="515">send ?publish Ҏ</td> </tr> <tr> <td class="td" width="150">JMSDeliveryMode</td> <td class="td" width="515">send ?publish Ҏ</td> </tr> <tr> <td class="td" width="150">JMSExpiration</td> <td class="td" width="515">send ?publish Ҏ</td> </tr> <tr> <td class="td" width="150">JMSPriority</td> <td class="td" width="515">send ?publish Ҏ</td> </tr> <tr> <td class="td" width="150">JMSMessageID</td> <td class="td" width="515">send ?publish Ҏ</td> </tr> <tr> <td class="td" width="150">JMSTimestamp</td> <td class="td" width="515">send ?publish Ҏ</td> </tr> <tr> <td class="td" width="150">JMSCorrelationID</td> <td class="td" width="515">客户</td> </tr> <tr> <td class="td" width="150">JMSReplyTo</td> <td class="td" width="515">客户</td> </tr> <tr> <td class="td" width="150">JMSType</td> <td class="td" width="515">客户</td> </tr> <tr> <td class="td" width="150">JMSRedelivered</td> <td class="td" width="515"> <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS</b> Provider</td> </tr> </tbody> </table> </font> </p> <p> <font face="Verdana"> <br />      <strong>属?Properties)</strong> - 除了消息头中定义好的标准属性外Q?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS</b> 提供一U机制增加新属性到消息头中Q这U新属性包含以下几U:<br />    1. 应用需要用到的属?<br />    2. 消息头中原有的一些可选属?<br />    3. <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS</b> Provider 需要用到的属性?br />    标准?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS</b> 消息头包含以下属性: <br />   JMSDestination --消息发送的目的?<br />   JMSDeliveryMode --传?a target="_new">模式</a>Q?有两U模式: PERSISTENT 和NON_PERSISTENTQPERSISTENT 表示该消息一定要被送到目的圎ͼ否则会导致应用错误。NON_PERSISTENT 表示偶然丢失该消息是被允许的Q这两种模式使开发者可以在消息传递的可靠性和吞吐量之间找到^衡点?br />   JMSMessageID 唯一识别每个消息的标识,?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS</b> Provider 产生?br />   JMSTimestamp 一个消息被提交l?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS</b> Provider 到消息被发出的时间?br />   JMSCorrelationID 用来q接到另外一个消息,典型的应用是在回复消息中q接到原消息?br />   JMSReplyTo 提供本消息回复消息的目的地址?br />   JMSRedelivered 如果一个客L收到一个设|了JMSRedelivered 属性的消息Q则表示可能该客L曄在早些时候收到过该消息,但ƈ没有{收(acknowledged)?br />   JMSType 消息cd的识别符?br />   JMSExpiration 消息q期旉Q等于QueueSender 的send Ҏ中的timeToLive 值或TopicPublisher 的publish Ҏ中的timeToLive 值加上发送时ȝGMT 旉倹{如果timeToLive值等于零Q则JMSExpiration 被设为零Q表C消息怸q期。如果发送后Q在消息q期旉之后消息q没有被发送到目的圎ͼ则该消息被清除?br />   JMSPriority 消息优先U,?-9 十个U别Q?-4 是普通消息,5-9 是加急消息?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS</b> 不要?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS</b> Provider 严格按照q十个优先发送消息,但必M证加急消息要先于普通消息到达?/font> </p> <p>    <strong>消息?Body) </strong>- <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS</b> API 定义?U消息体格式Q也叫消息类型,你可以用不同Ş式发送接收数据ƈ可以兼容现有的消息格式,下面描述q?U类型: </p> <p align="center"> </p> <table class="table" border="1"> <tbody> <tr> <td class="th" width="150"> <b> <i>消息cd</i> </b> </td> <td class="th" width="515"> <b> <i>消息?/i> </b> </td> </tr> <tr> <td class="td" width="150">TextMessage</td> <td class="td" width="515">java.lang.String对象Q如xml文g内容</td> </tr> <tr> <td class="td" width="150">MapMessage</td> <td class="td" width="515">?值对的集合,名是String对象Q值类型可以是JavaM基本cd</td> </tr> <tr> <td class="td" width="150">BytesMessage</td> <td class="td" width="515">字节?/td> </tr> <tr> <td class="td" width="150">StreamMessage</td> <td class="td" width="515">Java中的输入输出?/td> </tr> <tr> <td class="td" width="150">ObjectMessage</td> <td class="td" width="515">Java中的可序列化对象</td> </tr> <tr> <td class="td" width="150">Message</td> <td class="td" width="515">没有消息体,只有消息头和属性?/td> </tr> </tbody> </table> <div id="wmqeeuq" class="para">下例演示创徏q发送一个TextMessageC个队列: </div> <p align="center"> </p> <div id="wmqeeuq" class="programlisting" style="WIDTH: 674px; HEIGHT: 29px"> <blockquote> <pre>TextMessage message = queueSession.createTextMessage(); message.setText(msg_text); // msg_text is a String queueSender.send(message);</pre> </blockquote> </div> <p align="center"> </p> <div id="wmqeeuq" class="para">下例演示接收消息q{换ؓ合适的消息cdQ?</div> <p align="center"> </p> <div id="wmqeeuq" class="programlisting" style="WIDTH: 674px; HEIGHT: 29px"> <blockquote> <pre>Message m = queueReceiver.receive(); if (m instanceof TextMessage) { TextMessage message = (TextMessage) m; System.out.println("Reading message: " + message.getText()); } else { // Handle error }</pre> </blockquote> </div> <img src ="http://www.aygfsteel.com/19851985lili/aggbug/94635.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/19851985lili/" target="_blank">☜♥☞MengChuChen</a> 2007-01-18 14:38 <a href="http://www.aygfsteel.com/19851985lili/articles/94635.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JMXhttp://www.aygfsteel.com/19851985lili/articles/94633.html☜♥☞MengChuChen☜♥☞MengChuChenThu, 18 Jan 2007 06:36:00 GMThttp://www.aygfsteel.com/19851985lili/articles/94633.htmlhttp://www.aygfsteel.com/19851985lili/comments/94633.htmlhttp://www.aygfsteel.com/19851985lili/articles/94633.html#Feedback0http://www.aygfsteel.com/19851985lili/comments/commentRss/94633.htmlhttp://www.aygfsteel.com/19851985lili/services/trackbacks/94633.html  JMX Q?/font> Java Management Extensions Q即 Java理扩展 Q是一个ؓ应用 E序 、设备、系l等植入理功能?/font> 框架 ?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMX可以跨越一pd异构 操作pȝ q_、系l?/font> 体系l构 和网l传输协议,灉|的开发无~集成的pȝ、网l和服务理应用?

      Java理扩展JMX(Java Management Extensions)是一个ؓ应用E序植入理功能的框架?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMX是一套标准的代理和服务,实际上,用户可以在Q何Java应用E序中用这些代理和服务实现理?

      Java理扩展JMX的前w是JMAPI?

      Java理扩展JMX致力于解军_布式pȝ理的问题,因此Q能够适合于各U不同的环境是非帔R要的。ؓ了能够利用功能强大的Java计算环境解决q一的问题,Sun公司扩充了Java基础c?/a>库,开发了专用的管理类库?

      JMX是一U?a target="_new">应用~程接口Q可扩充对象和方法的集合体,可以用于跨越一pd不同的异构操作系l^台、系l体pȝ构和|络传输协议Q灵zȝ开发无~集成的pȝ、网l和服务理应用它提供了用户界面指导、Javacd开发集成系l、网l及|络理应用的规范?

      理对象?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMX应用E序的核心?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMXl构包括Q支持Java的Web览器用h口,理q行模块ARM(Admin Runtime Module)和应用。这三个部g之间通过RMIQ?a target="_new">Remote Method InvocationQ进行通信。这里需要说明的是,RMI是得一?a target="_new">Java虚拟?/a>Q?a target="_new">JVMQ上q行的程序可以调用远E服务器上另一个JVMȝ对象?

      用户接口用来发布理操作Q这些操作可以间接的通过览器或通过单独的应用程序来Ȁ发。管理运行模块用来给应用提供实例化的理对象。它包括Agent对象接口Q通知接口和被数据接口。应用指的是那些被管讑֤单元?

      JMX是一个完整的|络理应用E序开发环境,它同时提供了Q厂商需要收集的完整的特性清单,可生成资源清单表|囑Ş化的用户接口Q访问SNMP的网l?a target="_new">APIQ主机间q程q程调用Q?a target="_new">数据?/a>讉KҎ?

      JMXq一d的管理基l构Qh值在于对被管理资源的服务实现了抽象,提供了低层的基本c集合,开发h员在保证大多数的公共理cȝ完整性和一致性的前提下,q行扩展以满特定网l管理应用的需要?

      JMX注重于构造管理工L软g框架Qƈ量采用已成熟的技术?/font>

      JMX可以用来理|络Q设备,应用E序{资源,当前规范?.2版?/font>

一、Java理扩展JMX的优?/strong>

      1Q可以非常容易的使应用程序具有被理的功?br />      2Q提供具有高度׾~性的架构
每个JMX Agent服务可以很容易的攑օ到Agent中,每个JMX的实现都提供几个核心的Agent服务Q你也可以自q写服务,服务可以很容易的部vQ取消部|Ӏ?
      3Q主要提供接口,允许有不同的实现


二、Java理扩展JMX的体pȝ?/strong>

JMX框架

      1)讑֤层(Instrumentation LevelQ:主要定义了信息模型。在JMX中,各种理对象以管?a target="_new">构g的Ş式存在,需要管理时Q向MBean服务器进行注册。该层还定义了通知机制以及一些辅?a target="_new">元数?/a>cR?
      2)代理层(Agent LevelQ:主要定义了各U服务以及通信模型。该层的核心是一个MBean服务器,所有的理构g都需要向它注册,才能被管理。注册在MBean服务器上理构gq不直接和远E应用程序进行通信Q它们通过协议适配器和q接器进行通信。而协议适配器和q接器也以管理构件的形式向MBean服务器注册才能提供相应的服务?
      3)分布服务层(Distributed Service LevelQ:主要定义了能对代理层q行操作的管理接口和构gQ这L理者就可以操作代理。然而,当前?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMX规范q没有给一层的具体规范?
      4)附加理协议APIQ定义的API主要用来支持当前已经存在的网l管理协议,如SNMP、TMN、CIM/WBEM{?


      1Q? 讑֤层(Instrumentation LevelQ?br />      该层定义了如何实?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMX理资源的规范。一?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMX理资源可以是一个Java应用、一个服务或一个设备,它们可以用Java开发,或者至能用Javaq行包装Qƈ且能被置?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMX框架中,从而成?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMX的一个管理构?Managed Bean)Q简UMBean。管理构件可以是标准的,也可以是动态的Q标准的理构g遵从JavaBeans构g?a target="_new">设计模式Q动态的理构g遵从特定的接口,提供了更大的灉|性?

      该层q定义了通知机制以及实现理构g的辅助元数据cR?


      1Q?Q? 理构gQMBeanQ?br />      ?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMX规范中,理构g定义如下Q它是一个能代表理资源的Java对象Q遵从一定的设计模式Q还需实现该规范定义的特定的接口。该定义了保证了所有的理构g以一U标准的方式来表C理资源?

      理接口是被管理资源暴露出的一些信息,通过对这些信息的修改p控制被管理资源。一个管理构件的理接口包括Q?
      1)能被接触的属性|
      2)能够执行的操作;
      3)能发出的通知事gQ?
      4)理构g的构建器?

      理构g通过公共的方法以及遵从特定的设计模式装了属性和操作Q以便暴露给理应用E序。例如,一个只d性在理构g中只有GetҎQ既有Get又有SetҎ表示是一个可d的属性?

      其余?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMX的构Ӟ例如JMX代理提供的各U服务,也是作ؓ一个管理构件注册到代理中才能提供相应的服务?

      JMX对管理构件的存储位置没有M限制Q管理构件可以存储在q行JMX代理的Java虚拟机的c\径的M位置Q也可以从网l上的Q何位|导入?

      JMX定义了四U管理构Ӟ标准、动态、开攑֒模型理构g。每一U管理构件可以根据不同的环境需要进行制定?

      1.标准理构g

      标准理构g的设计和实现是最单的Q它们的理接口通过Ҏ名来描述。标准管理构件的实现依靠一l命名规则,UC计模式。这些命名规则定义了属性和操作。检查标准管理构件接口和应用设计模式的过E被UCؓ内省QIntrospectionQ[22]?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMX代理通过内省来查看每一个注册在MBean 服务器上的管理构件的Ҏ和超c,看它是否遵从一定设计模式,军_它是否代表了一个管理构ӞqL认出它的属性和操作?

      2.动态管理构?

      动态管理构件提供了更大的灵zL,它可以在q行期暴露自q理接口。它的实现是通过实现一个特定的接口DynamicMBeanQ如下图Q?


 


      JMX代理通过getMBeanInfoҎ来获取该动态管理构件暴露的理接口Q该Ҏq回的对象是MbeanInfocȝ实例Q包含了属性和操作的签名。由于该Ҏ的调用是发生在动态管理构件向MBean服务器注册以后,因此理接口是在q行期获取的。不同于标准理构gQ?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMX代理不需要通过内省机制来确定动态管理构件的理接口。由于DynamicMBean的接口是不变的,因此可以屏蔽实现l节。由于这U在q行期获取管理接口的Ҏ,动态管理构件提供了更大的灵zL?

      3.开攄理构?

      开攄理构件是一U专门化的动态管理构Ӟ其中所有的与该理构g相关的参数、返?a target="_new">cd和属性都围绕一l预定义的数据类型(String、Integer、Float {)来徏立,q且通过一l特定的接口来进行自我描q?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMX代理通过获得一个OpenMBeanInfo对象来获取开攄理构件的理接口QOpenMBeanInfo是MbeanInfo的子cR?

      4.模型理构g

      模型理构g也是一U专门化的动态管理构件。它是预制的、通用的和动态的 MBean c,已经包含了所有必要缺省行为的实现Qƈ允许在运行时d或覆盖需要定制的那些实现?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMX规范规定该类必须实现为javax.management.modelmbean.RequiredModelMBeanQ管理者要做的是实例化该c,q|该构g的默认行为ƈ注册?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMX代理中,卛_实现对资源的理?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMX代理通过获得一个ModelMBeanInfo对象来获取管理接口?

      模型理构gh以下新的特点[23]Q?
      1)持久?
      定义了持久机Ӟ可以利用Java的序列化?a target="_new">JDBC来存储模型MBean的状态?
      2)通知和日志功?
      能记录每一个发出的通知Qƈ能自动发出属性变化通知?
      3)属性值缓?
      h~存属性值的能力?


      1Q?Q? 通知模型
      一个管理构件提供的理接口允许代理对其理资源q行控制和配|。然而,对管理复杂的分布式系l来_q些接口只是提供了一部分功能。通常Q管理应用程序需要对状态变化或者当特别情况发生变化时作出反映?

      为此Q?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMX定义了通知模型。通知模型仅仅涉及了在同一?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMX代理中的理构g之间的事件传播?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMX通知模型依靠以下几个部分Q?
      1)NotificationQ一个通用的事件类型,该类标识事g的类型,可以被直接用,也可以根据传递的事g的需要而被扩展?
      2)NotificationListener接口Q接受通知的对象需实现此接口?
      3)NotificationFilter接口Q作为通知qo器的对象需实现此接口,为通知监听者提供了一个过滤通知的过滤器?
      4)NotificationBroadcaster接口Q通知发送者需实现此接口,该接口允许希望得到通知的监听者注册?

      发送一个通用cd的通知QQ何一个监听者都会得到该通知。因此,监听者需提供qo器来选择所需要接受的通知?

      Mcd的管理构Ӟ标准的或动态的Q都可以作ؓ一个通知发送者,也可以作Z个通知监听者,或两者都是?


      1Q?Q? 辅助元数据类
      辅助元数据类用来描述理构g。辅助元数据cM仅被用来内省标准理构gQ也被动态管理构件用来进行自我描q。这些类Ҏ属性、操作、构建器和通告描述了管理接口?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMX代理通过q些元数据类理所有管理构Ӟ而不这些管理构件的cd?

      部分辅助元类如下Q?
      1)MBeanInfo--包含了属性、操作、构建器和通知的信息?
      2)MBeanFeatureInfo--Z面类的超cR?
      3)MBeanAttributeInfo--用来描述理构g中的属性?
      4)MBeanConstructorInfo--用来描述理构g中的构徏器?
      5)MBeanOperationInfo--用来描述理构g中的操作?
      6)MBeanParameterInfo--用来描述理构g操作或构建器的参数?
      7)MBeanNotificationInfo--用来描述理构g发出的通知?


      1Q? 代理?br />      代理层是一个运行在Java虚拟Z的管理实体,它活跃在理资源和管理者之_用来直接理资源Qƈ使这些资源可以被q程的管理程序所控制。代理层׃个MBean服务器和一pd处理被管理资源的服务所l成。下图表CZ代理层的l成Q?


 

 

      1Q?Q? MBean服务?br />      Mbean服务器ؓ代理层的核心Q设备层的所有管理构仉在其注册Q管理者只用通过它才能访问管理构件?
      理构g可以通过以下三种Ҏ实例化和注册Q?
      1)通过另一个管理构?
      2)理代理本n
      3)q程应用E序
      注册一个管理构件时Q必L供一个唯一的对象名。管理应用程序用q个对象名进行标识管理构件ƈ对其操作。这些操作包括:
      1)发现理构g的管理接?
      2)d属性?
      3)执行理构g中定义的操作
      4)获得理构g发出的通告
      5)Z对象名和属性值来查询理构g


      1Q?Q? 协议适配器和q接?br />      MBean服务器依赖于协议适配器和q接器来和运行该代理的Java虚拟Z外的理应用E序q行通信。协议适配器通过特定的协议提供了一张注册在MBean服务器的理构g?a target="_new">视图。例如,一个HTML适配器可以将所有注册过的管理构件显C在Web 面上。不同的协议Q提供不同的视图?

      q接器还必须提供理应用一方的接口以代理和管理应用程序进行通信Q即针对不同的协议,q接器必L供同Lq程接口来封装通信q程。当q程应用E序使用q个接口Ӟ可以通过|络透明的和代理q行交互Q而忽略协议本w?

      适配器和q接器MBean服务器与理应用E序能进行通信。因此,一个代理要被管理,它必L供至一个协议适配器或者连接器。面临多U管理应用时Q代理可以包含各U不同的协议适配器和q接器?

      当前已经实现和将要实现的协议适配器和q接器包括:
      1)RMIq接?
      2)SNMP协议适配?
      3)IIOP协议适配?
      4)HTML协议适配?
      5)HTTPq接?


      1Q?Q? 代理服务
      代理服务可以Ҏ册的理构g执行理功能。通过引入理Q?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMX可以帮助我们建立强有力的理解决Ҏ。代理服务本w也是作为管理构件而存在,也可以被MBean服务器控制?

      JMX规范定义了代理服务有Q?
      1)动态类装蝲--通过理程序服务可以获得ƈ实例化新的类Q还可以使位于网l上的类库本地化?
      2)监视服务--监视理构g的属性值变化,q将q些变化通知l所有的监听者?
      3)旉服务--定时发送一?a target="_new">消息或作Z个调度器使用?
      4)关系服务--定义q维持管理构件之间的怺关系?

      1.动态类装蝲

      动态类装蝲是通过m-letQmanagement appletQ服务来实现的,它可以从|络上的MURL处下载ƈ实例化管理构Ӟ然后向MBean服务器注册。在一个M-let服务q程中,首先是下载一个m-let文本文gQ该文g?a target="_new">XML格式的文Ӟ文g的内Ҏ识了理构g的所有信息,比如构g名称、在MBean服务器中唯一标识该构件的对象名等。然后根据这个文件的内容Qm-let服务完成剩余的Q务。下图例C一q程Q?


 


      2.监视服务

      通过使用监视服务Q管理构件的属性值就会被定期监视Q从而保证始l处于一个特定的范围。当监视的属性值的变化出了预期定义的范围Q一个特定的通告׃发出?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMX规范当前规定了三U监视器Q?

      1)计数器监视器Q监视计数器cd的属性|通常为整型,且只能按一定规律递增?
      2)度量监视器,监视度量cd的属性|通常为实敎ͼD增能减?
      3)字符串监视器Q监视字W串cd的属性倹{?

      每一个监视器都是作ؓ一个标准管理构件存在的Q需要提供服务时Q可以由相应的管理构件或q程理应用E序动态创建ƈ配置注册使用?

      下图例示了计数器监视器的使用情况Q?


 


      3.旉服务

      旉服务可以在制定的旉和日期发出通告Q也可以定期的周期性的发出通告Q依赖于理应用E序的配|。时间服务也是一个管理构Ӟ它能帮助理应用E序建立一个可配置的备忘录Q从而实现智能管理服务?

      4.关系服务

      JMX规范定义了管理构件之间的关系模型。一个关pL用户定义的管理构件之间的Nl联pR?

      关系模型定义如下一些术语:

      1)角色Q就是是一个关pM的一cL员n份,它含有一个角色倹{?
      2)角色信息Q描qC个关pM的一个角艌Ӏ?
      3)关系cdQ由角色信息l成Q作为创建和l持关系的模ѝ?
      4)关系Q管理构件之间的当前联系Q且必须满一个关pȝ型的要求?
      5)角色|在一个关pM当前能满给定角色的理构g的列表?
      6)关系服务Q是一个管理构Ӟ能接触和l持所有关pȝ型和关系实例之间的一致性?

      在关pL务中Q管理构件之间的关系由通过关系cd定的关pd例来l护。仅仅只有注册到MBean服务器上q且能被对象名标识的理构g才能成ؓ一个关pȝ成员。关pL务从来就不直接操作它的成?-理构gQؓ了方便查扑֮仅仅提供了对象名?

      关系服务能锁定不合理关系cd的创建,同样Q不合理的关pȝ创徏也会被锁定。角色值的修正也要遵守一致性检查?

      ׃关系是定义在注册的管理构件之间的联系Q所以当其中的管理构件卸载时Q就会更改关pR关pL务会自动更改角色倹{所有对关系实例的操作比如创建、更新、删除等都会使关pL务发出通告Q通告会提供有兌ơ操作的信息?

      JMX关系模型只能保证所有的理构g满它的设计角色Q也是_不允怸个管理构件同时出现在许多关系中?


      1Q? 分布服务?br />      当前QSUNq没有给一层的具体规范Q下面给出的只是一个简要描q?

      该层规定了实?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMX应用理q_的接口。这一层定义了能对代理层进行操作的理接口?a target="_new">lg。这些组件能Q?
      1)为管理应用程序提供一个接口,以便它通过一个连接器能透明和代理层或?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMX理资源q行交互?
      2)通过各种协议的映(如SNMP、HTML{)Q提供了一?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMX代理和所有可理lg的视图?
      3)分布理信息Q以便构造一个分布式pȝQ也是高层管理^台的理信息向其下众多的JMX代理发布?
      4)攉多个JMX 代理端的理信息q根据管理终端用L需要筛选用h兴趣的信息ƈ形成逻辑视图送给相应的终端用戗?
      5)提供了安全保证?

      通过理应用层和另一理代理和以及他的设备层的联合,可以ؓ我们提供一个完整的|络理的解x案。这个解x案ؓ我们带来了独一无二的一些优点:M、根据需要部|Ӏ动态服务、还有安全性?


      1Q? 附加理协议API
      该层提供了一些API来支持当前已l存在的一些管理协议?

      q些附加的协议APIq没有定义管理应用的功能Q或者管理^台的体系l构Q他们仅仅定义了标准的Java API和现存的|络理技术通信Q例如SNMP?

      |络理q_和应用的开发者可以用q些API来和他们的管理环境进行交互,q将q个交互q程装在一?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMX理资源中。例如,通过SNMP可以对一个运行有SNMP代理的交换机q行理Qƈ这些管理接口封装成Z个管理构件。在动态网l管理中Q可以随时更换这些管理构件以适应需?/a>?

      q些API可以帮组开发者根据最通常的工业标准来部v他们的管理^台和应用。新的网路管理的解决Ҏ可以和现存的基础l构合ؓ一体,q样Q现存的|络理也能很好的利用基于Java技术的|络理应用?

      q些API目前?a target="_new">JCPQ?a target="_new">Java Community ProcessQ内作ؓ独立的JSRQJava Specification RequestQ开发?

      他们包括Q?
      1)SNMP Manager API
      2)CIM/WBEM manager and protocol API


      1Q? JMX的当前实现及应用
      自从SUN发布?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMX规范Q许多大公司UL行动hQ实现规范或者实现相应的ZJMX的网l管理系l,下面列出了当前的主要实现及应用情况:

      1)SUN?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMX规范了作Z相应的参考实玎ͼq在此基上开发了一个全新的用于|络理的品JDMKQJava动态管理工具集Q,其中定义了资源的开发过E和Ҏ、动?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMX代理的实现、远E管理应用的实现。同ӞJDMK也提供了一个完整的体系l构用来构造分布式的网l管理系l,q提供了多种协议适配器和q接器,如SNMP协议适配器、HTML协议适配器、HTTPq接器、RMIq接器?
      2)IBM Tivoli实现?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMX规范的品ؓTivoliJMXQ它为JAVA理应用E序和网l提供了架构、设计模式、一些API集和一些服务?
      3)Adventnet开发的关于JMX的品ؓAdventNet Agent ToolkitQ它使得定义新的SNMP MIB、开?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMX和Java SNMP Agent的过E自动化?
      4)JBoss实现?a target="_new">J2EE应用服务?/a>?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMX为微内核Q各个模块以理构g的Ş式提供相应的服务?
      5)BEA的Weblogic应用服务器也?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMX技术作q理基础?
      6)金蝶的Apusic也是一个以JMX为内核开发出?a target="_new">J2EE应用服务器?


三?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMX的好?/strong>

      。可减少对JAVA应用实施理的投?
      。提供了一个可伸羃的管理框?
      。集成现有的理ҎQ如QWBEMQSNMPQTMN
      。用现有的标准JAVA技?
      。能使用未来的一些管理概念:?a target="_new">Jiniq接技术、通用x即用、服务定位协?Service Location Protocol)
      。只定义了一些可以访问的接口

四?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMX架构的了?/strong>

      JMX应该说是关于|络应用理的的框架Q如果你开发了一个比较复杂的pȝQ无疑你要提供这个系l的自n理 pȝQ?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMX更多应用是体现在Server上,如果你要使用java开发一个自己Server或复杂的应用pȝQ那么推荐你ZJMX架构来开发, JBoss 3.0 weblogic{就是基?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMX开发的W合J2EE规范的服务器软g?

      了解JMX可以使你深入了解J2EE服务器, Z么我们^时说 "EJB"是个比较"Weight"的方案选择Q其中一个原因是J2EE服务器Y件本w?也是你的pȝ中一部分Q它作ؓ你系l的容器Q对你的pȝ有至关重要的作用Q如果无法直接介?理或“调教”它Q那么无疑你的系l本w存在着隐含的危险, 现在Q通过JMXQ你现在可以深入CJ2EE容器内部的管理了?(好像国内出现了第一个自己J2ee服务器,不知道那是不是基?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMX开发的?)

      J2EEq不能概括所有的应用领域Q比如对速度和性能要求极高的游戏或股票行情{系l就需要自q接来开发ServerQ?如果是能够基?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMX开发,那么可以说就大大提高~写理E序的效率,可以你的模块变?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMX的MBeanQ可以通过Agent在程序内部或者通过 WEB理面对你的MBean模块q行初始?重启 以及参数讄?/p>

      JMX的好处还有:可以方便整合q接现有的Java技术,如JNDI JDBC JTS及其它。特别是能够使用Jini的查?发现机制以及协议Q我们知?Jini提供了一U服务的查询和发现机Ӟq些services都可以通过JMX 来实现管理?/p>

      现在我们开?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMX的了解:

      1.到java.sun.com首页?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMX面Q下?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMX的规定说明和SamplesE序?br />      2.按照JMX的说明进行一ơTutorialQ了解如何加?删除 配置一个MBeanQTutorial中是以SimpleMBeanZQ那么我们能否徏立一个自qMBean?

      我们来做一个Hello 的MBeanQ这里有一个小关键点,你的class取名有个规则Q?需要以MBean为结,如这里我们取名ؓHelloMbean:


public interface HelloMBean {

  // management attributes
  public String getName();
  public void setName(String name);

  // management operations
  public void print();

}

      在这个Class里,有一个隐含attributes: name, 提供了set和get的方法,同时有一个操作方法print()Q?/p>

      再定义一个concretec?

public class Hello implements HelloMBean {

  private String name = "";

  public String getName() {
  return name;
  }

  public void setName(String name) {
  this.name = name;
  }

  public void print() {
  System.out.println("Hello, " + name + "!!" );
  }
}


      q样一个简单的MBean做好了Q我们可以通过admin界面加入q个HelloQ?/p>

      再按 Tutorial启动BaseAgentQ在Agent Administration中参考Simple填入Q?br />Domain: Standard_Hello_MBeans

Keys : name=Hello,number=1

Java Class: Hello

      出现Create Successful信息。进入MBean View lName赋|ҎApply Q然后再按printQ这是你的Hello中的ҎQ在控制C会看到输出?/p>

      是不是很惊奇Hello中的 attributes 和operations能被动态的讉K和控Ӟ 已经隐约感到JMX的架构原理了吧?

      下面再深入明一些概念:
      上面HelloMBean资源是通过adminq样的HTTP WEB界面理Q这U管理资源方式是属于JMX的Distributed服务层, JMX 通过Distributed层能够部|和理MBean资源。就象上面的例子Q是通过HtmlAdaptor提供的HTTP WEB界面来方面的l护理HelloMBean.

      那么我们能否在程序中自动理和部|我的MBeanQ当然可以,q是通过Agent层来完成Q现在我们已l有了这个层ơ,MBean所在的资源层,
最外面的Distributed服务层,Distributed服务层是通过Agent层来讉KMBean资源的,看看下面来自Sun公司JMX规定的架构图Q?/p>

      从图中看出,Agent Level(Agent?包括MBean Server和Agent Services,那么我们来做一个上面例子HelloMBean的AgentQ?/p>

// CREATE the MBeanServer
//
System.out.println("\n\tCREATE the MBeanServer.");
MBeanServer server = MBeanServerFactory.createMBeanServer();

// CREATE Registe HelloMBean
//
System.out.println("\n\tCREATE, REGISTER a new Hello Standard_MBean:");
HelloMBean helloMBean = new Hello();

ObjectName hello_name = null;
try {
hello_name = new ObjectName("Standard_Hello_MBeans:name=Hello,number=1");
System.out.println("\tOBJECT NAME = " + hello_name);

//HelloMBean注册到MBeanServer中去
server.registerMBean(helloMBean, hello_name);
}
catch (Exception e) {
e.printStackTrace();
return;
}

      向MBeanServer注册后,以后JMXq道有了这个HelloMBean资源?/p>

      理一个agent的MBean资源或用它提供的服务必通过一个protocol adaptor 或者connector,adaptor 或者connector属于Distributed layer level(Distributed服务?Q我们上面例子中通过HTTP WEB界面理HelloMBean是览器通过HtmlAdaptorq个adaptor来实现的?/p>

]]>
BPEL~辑?/title><link>http://www.aygfsteel.com/19851985lili/articles/94381.html</link><dc:creator>☜♥☞MengChuChen</dc:creator><author>☜♥☞MengChuChen</author><pubDate>Wed, 17 Jan 2007 03:06:00 GMT</pubDate><guid>http://www.aygfsteel.com/19851985lili/articles/94381.html</guid><wfw:comment>http://www.aygfsteel.com/19851985lili/comments/94381.html</wfw:comment><comments>http://www.aygfsteel.com/19851985lili/articles/94381.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/19851985lili/comments/commentRss/94381.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/19851985lili/services/trackbacks/94381.html</trackback:ping><description><![CDATA[ <table cellspacing="0" cellpadding="0" width="760" align="center" border="0"> <tbody> <tr> <td class="title" valign="center" align="middle" height="56"> <b> <font color="#ff0000" size="3"> <span id="wmqeeuq" class="atitle">从UML到BPEL</span> <!-- #EndEditable --> </font> </b> </td> </tr> <tr> <td class="formtitle" align="middle" height="40"> <!-- #BeginEditable "2" -->来自: IBM  Keith Mantell  IBM IT Architect<!-- #EndEditable --></td> </tr> </tbody> </table> <table height="65" cellspacing="0" cellpadding="0" width="760" align="center" border="0"> <tbody> <tr> <td class="content" height="65"> <!-- #BeginEditable "3" --> <table width="85%" align="center" border="0"> <tbody> <tr> <td class="content"> <span id="wmqeeuq" class="atitle2">Web服务世界中的模型驱动体系l构</span><table class="content"><tbody><tr><td class="content"><a class="content_a" >如此多的XML ...</a></td></tr><tr><td class="content"><a class="content_a" >BPEL是什么?</a></td></tr><tr><td class="content"><a class="content_a" >UMLZ么?</a></td></tr><tr><td class="content"><a class="content_a" >自动化业务流E的UML配置文gQProfileQ?/a></td></tr><tr><td class="content"><a class="content_a" >映射到BPEL4WS</a></td></tr><tr><td class="content"><a class="content_a" >UML到BPEL映射验证?/a></td></tr><tr><td class="content"><a class="content_a" >反射</a></td></tr><tr><td class="content"><a class="content_a" >鸣谢</a></td></tr><tr><td class="content"><a class="content_a" >参考资?/a></td></tr><tr><td class="content"><a class="content_a" >关于作?/a></td></tr></tbody></table><blockquote>本文描述了一U新工具Q该工具是在alphaWorks|站上发布的Emerging Technologies Toolkit version 1.1 QETTKQ,它采取用l一建模语言QUnified Modeling LanguageQUMLQ定义的程q生成相应的BPEL和WSDL文档来实现该程。这U性能用于H出对象理l(OMGsQ模型驱动体pȝ构(MDAQ创始的一些优点:提高开发过E中的抽象水qI因此获得更高的生产率Q?更好的质量,能够隔离于技术的Ҏ改变?</blockquote><p><a name="0"><span id="wmqeeuq" class="atitle2">如此多的XML ...</span></a></p><p>随着面向服务的体pȝ构(SOAQ的出现Q应用程序开发经历了一ơ彻底改变。这U架构合q了ZXML的标准,例如WSDL、简单对象访问协议(SOAPQ、统一描述、发现和集成协议QUDDIQ和现在的BPEL。然而,当您能做更多的事情时Q开发Q务的大小和复杂性已l提高,q且开发者会发现他们沉迷于文和语法中,而迷׃他们工作的主要目标。另外,开发h员的目标在发生变化,标准本n也处在发展之中。因而,Z能快速的采用Web服务Q开发者正在寻找解军_杂、高效和技术改变问题的{案?/p><p>UML到BPEL的映工兯够获得用UML工具Q例如:IBM Rational的XDE或RoseQ开发的程模型Qƈ且能它们{换ؓ正确的BPEL和WSDL文来实现该程?Emerging Technologies Toolkit version 1.1 QETTKQ是试有趣的新技术的环境Qƈ且现在具有两U格式:autonomic和webservices。本文重点介l后者——webservices?/p><p><a name="1"><span id="wmqeeuq" class="atitle2">BPEL是什么?</span></a></p><p>BPEL提供了一UX<span id="wmqeeuq" class="content_a">ML注释和语义,用于指定ZWeb服务的业务流E行为。用合作伙伴的交互方式Q定义了该BPEL4WS程。合作伙伴可以将服务提供l流E,也可以向程h服务Q或者参与到程的双向交互中。BPEL通过指定序来编排Web服务Q这Ҏ务集合的调用来说意义p。BPELq针Ҏ个服务分配了合作伙伴的责仅R您可以使用它来指定合作伙伴的公共接口和可执行流E的描述?/span></p><p>BPEL 1.1是该规范的最新版本。它除了澄清术语之外Q还允许较好的变量范围和附加的事件处理程序。有兌规范的最新版本和BPEL介绍Q请参阅最前面的两相兛_定w接?/p><p><a name="2"><span id="wmqeeuq" class="atitle2">Z么用UMLQ?/span></a></p><p>UML是一UOMG标准Q该标准提供了一U可视化的徏模表C法Q这对设计和了解复杂的系l很有效?/p><p>UMLh下列几种通用优点Q它是众所周知的面向对象(Object-Oriented QooQ徏模表C法Q具有非常容易理解的囑Ş表示法以及一套丰富的语义集来捕获OOpȝ的关键特征?UMLq泛地应用于面向对象的Y件开发,q常用于定制的、基于组件的软g开发、业务流E徏模和pȝ设计。这使大部分UMLl验能被应用到成熟的Web服务技术中?/p><p><a name="IDAQCQBB"><span id="wmqeeuq" class="atitle3">扩展UML</span></a><br />扩展或定制UML的特性对MDA来说是很必要的;可以通过定制UML来支持系l徏模,q种pȝ是需要完全或部分的部|到Web服务基础架构上。本文主要介l模板(stereotypesQ。模板(stereotypesQ是一U对模型的元素进行分cȝҎ。例如,如果您有一个表C顾客的c,那么您可以附?code><<entity>></code> 模板QstereotypesQ来表示它代表一个数据对象(或许是Entity BeanQ。这U信息有助于ZҎ型的可读性,甚至可以用来改变表示CASE工具Q例如Rational RoseQ中cȝ图标。然而,在这U情况下您可以用它来指导模型的译。要CQ您可以模板(stereotypesQ添加到UML模型中的更多元素上。还可以在配|文ӞProfileQ中l合q些模板QstereotypesQ。ؓ了表C特定的兴趣域,UML配置文gQProfilesQ用于定义对基本UML的扩展集合。例如那些ؓCORBA和数据徏模(Data ModelingQ定义的配置文gQProfilesQ。配|文件定义了要用的UML元素Q如何对其进行扩展,以及U束元素集合的良好性规则(<i xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerWorks/">well-formedness rules</i>Q?/p><p>下面部分Q我介l一UUML配置文gQProfileQ,可以通过构徏与BPEL4WSQWeb服务业务程执行语言Q相对应的一套语义结构来支持建模。同时还描qBPEL4WS映射QBPEL4WS映射可以从适合配置文g的UML模型自动生成Web服务制品QBPEL、WSDL、XSDQ?/p><p>下面部分展C实际的BPEL例子以及UML配置文gQProfileQ,q点讲q关键概c?/p><p><a name="3"><span id="wmqeeuq" class="atitle2">自动化业务流E的UML配置文gQProfileQ?/span></a></p><p>q部分通过一个例子介l了UML配置文g子集Q该例子定义了一个简单本的贷ƾ批准流E。在本例中您会在ETTK的README文档中发现{换器。它可以被ȝ为如下所C:</p><blockquote xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerWorks/">“在收到hhӞ请求的数g数|10000Q比较。如果请求的数值比较少Q那么将调用Assessor服务Q否则将调用Approver服务。如果Accessor认ؓ该请求的风险比较高,它也被传递给Approver。当Approver完成或者Accessor接受Ӟ会q回批准信息。?</blockquote><p>BPEL程是有状态的q包含实例,所以在BPEL中,q种情况都会被作Z个LoanApproval程而实玎ͼ对于被处理的每个实际h甌QLoanApproval程都会有一个实例。每个实例都用BPEL变量来捕获它自己的状态。在UML配置文g中,程被表CZؓ<code><<Process>></code>模板cR类的属性与程的状态相对应Q在BPEL4WS 1.0术语中的容器Q或者BPEL 1.1中的变量Q?a xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerWorks/">?</a>昄了表Cƾ批准流E的UMLc??/p><p><a name="figure1"><b>?1.用于BPEL程建模的UMLc?/b></a><br /><img height="101" alt="Process" src="http://www.uml.org.cn/UMLApplication/images/a_process.gif" width="228" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerWorks/" /></p><p>通过zd囑֏以清楚的描述cȝ行ؓ?a xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerWorks/">?</a>昄了贷ƾ批准流E的zd图。例如,<code>invokeAssessor</code>zd昄为带有圆角的长方形。执行的操作昄为活动的入口条gQ例如,<code>riskAssessment</code>Q一个变量)被设|ؓ查服务的l果。通过UML分区Q也作ؓ泳道Q来表示程中通信的合作伙_customer、assessor以及approver。每个分Z昄了往合作伙伴发送或者接收信息的zd。箭头表C流E执行活动的序。注意分z(assingmentQ活动没有放C个分ZQ它描绘了发生在它自w流E内的活动,该流E不需要外部服务?/p><p><a name="figure2"><b>?2h批准程的活动图</b></a><br /><img height="438" alt="Activity graph" src="http://www.uml.org.cn/UMLApplication/images/process.gif" width="590" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerWorks/" /></p><p>应答QreplyQ活动向֮q回响应Q完成流E的处理。每个活动都有一个描q性的名称和输入活动来l化zd执行的工作?/p><p><a name="4"><span id="wmqeeuq" class="atitle2">映射到BPEL4WS</span></a></p><p>自动化业务流E的UML配置文g表示可以从UML模型生成完整的可执行BPEL制品?a xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerWorks/">?</a> 概要的展CZ从配|文件到BPEL的映,覆盖C本文介绍的配|文件子集?/p><p><a name="table1"><span id="wmqeeuq" class="atitle3">?1. UML到BPEL4WS映射概述</span></a><br /></p><table class="content" cellspacing="0" cellpadding="3" width="100%" border="1"><tbody><tr><td><b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerWorks/">配置文g构g</b></td><td><b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerWorks/">BPEL4WS概念</b></td></tr><tr><td><<process>>c?/td><td>BPEL程定义</td></tr><tr><td><<process>> cȝzd?/td><td>BPELzdU别</td></tr><tr><td><<process>>cd?/td><td>BPEL变量</td></tr><tr><td>分层l构和控制流</td><td>BPEL序和流E活?/td></tr><tr><td><<receive>>?<<reply>>?lt;<invoke>>zd</td><td>BPELzd</td></tr></tbody></table><p><a xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerWorks/">清单1</a>Q由于版面空间原因,q里省略了很多细节代码)昄了BPEL文的羃减版本,该文是由本文介l的h批准例子生成的?/p><a name="code1"><b>清单 1.BPEL清单摘录</b></a><br /><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1"><tbody><tr><td><pre><code class="content"> <process name="loanApprovalProcess" ...> <variables> <variable name="request" messageType="loandef:creditInformationMessage"/> <variable name="riskAssessment" messageType="asns:riskAssessmentMessage"/> ... </variables> ... <flow> <receive name="receive1" partner="customer" portType="apns:loanApprovalPT" operation="approve" variable="request" createInstance="yes"> <source linkName="receive-to-assess" transitionCondition= "bpws:getVariableData('request', 'amount')<10000"/> <source linkName="receive-to-approval" transitionCondition= "bpws:getVariableData('request', 'amount')>=10000"/> </receive> <invoke name="invokeAssessor" partner="assessor" portType="asns:riskAssessmentPT" operation="check" inputVariable="request" outputVariable="riskAssessment"> <target linkName="receive-to-assess"/> <source linkName="assess-to-setMessage" transitionCondition= "bpws:getVariableData('riskAssessment', 'risk')='low'"/> <source linkName="assess-to-approval" transitionCondition= "bpws:getVariableData('riskAssessment', 'risk')!='low'"/> </invoke> <assign name="assign"> <target linkName="assess-to-setMessage"/> <source linkName="setMessage-to-reply"/> <copy> <from expression="'yes'"/> <to variable="approvalInfo" part="accept"/> </copy> </assign> ... <reply name="reply" partner="customer" portType="apns:loanApprovalPT" operation="approve" variable="approvalInfo"> <target linkName="setMessage-to-reply"/> <target linkName="approval-to-reply"/> </reply> </flow> </process></code></pre></td></tr></tbody></table><p>?a xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerWorks/">参考资?/a>中可以找到完整的配置文g链接?/p><p><a name="5"><span id="wmqeeuq" class="atitle2">UML到BPEL映射验证?/span></a></p><p>从IBM alphaWorks可以获得作ؓETTK的一部分的技术验证器Q它支持从UML工具Q例如Rational XDEQ到BPEL4WSq行旉QBPWS4JQ的端到端情景。映实现被构徏为Eclipse插gQ它采取了UML模型QXMIQ交换的工业标准文g格式作ؓ输入。BPEL4WS制品QartifactQ同需要的WSDL和XSD制品是一L成的?/p><p>让我们看一下验证器。首先要Ҏ您的需要安装一些先x件。ETTK面昄了相兌l信息(参阅<a xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerWorks/">参考资?/a>下蝲链接Q。概括v来,您需要下列资源:</p><ul xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerWorks/"><li>Rose或XDEQ本文采用的是XDE v2003Q? </li><li>Eclipse 2.0+或WebSphere Studio Application DeveloperQWSADQ?.0+ </li><li>WebSphere Application Server (WAS) 5.0+或Apache Tomcat 4.1.24+ </li><li>The ETTK本nQ其中包含了BPWS4JQ?</li></ul><p>假设您已l具有下面需要的合适环境?/p><p>验证器随着不同情景的一套样例文而生,例如h批准或购买订单流E。样例文将是两U类型:一U是可以由Rose或XDEUML打开和修改的模型文Q另一U是包含UML模型的XMI版本的XML文档Q该文可以通过Rose或XDEq行输出。在<a xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerWorks/">?</a>中可以看到Rose或XDE中相应的模型Q或者这些工LXMI输出的模型?/p><p><a xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerWorks/">?</a>使用一个UMLzd图显CZ转换文的全部流E;UML没有用吗Q方框表C制品(通常是文档)Q而椭圆表CZ个操作或zd。主要阶D|Q?/p><ul xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerWorks/"><li>构徏UML模型q将其导出到XMIQ用Rose或XDE) </li><li>生成BPEL、WSDL和XSD文 </li><li>在BPWS4Jq行旉部vq运行这些文—?试?</li></ul><p><a name="figure3"><b>?. 开发一个流E?/b></a><br /><img height="323" alt="Development Process" src="http://www.uml.org.cn/UMLApplication/images/devt_process.gif" width="378" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerWorks/" /></p><p><a name="IDASQQBB"><span id="wmqeeuq" class="atitle3">构徏q输出UML模型</span></a><br />如果hRose而不没有XDEQ则可以打开其中一个UML文Q?mdl?mdxQ;在本文中您已l通过h批准的例子看Cq些例子?/p><p><a name="figure4"><b>?4.使用XDE建模q输?/b></a><br /><img height="415" alt="XDE" src="http://www.uml.org.cn/UMLApplication/images/xde_export.gif" width="549" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerWorks/" /></p><p>?a xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerWorks/">?</a>UML模型被输出到XMI——您需要用XDE v2003或更新版本。注意这U方法的好处是您正在使用的是一般性用途,而不需要修改UML工具和UML的标准扩展机制来构徏和输出流E定义?/p><p>一旦模型执行完毕,则可以点击File -->Export菜单Q选择XMI Export其输出Q如<a xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerWorks/">?</a>所C?/p><p><a name="IDATRQBB"><span id="wmqeeuq" class="atitle3">生成BPEL和WSDL文</span></a><br />在EclipseQ或WebSphere Application Developer (IE)Q中创徏Java ProjectQ然后导入您在前面创建的XMI文Q或使用ETTK提供的XMI样例文Q。最后选择XMI文gq过叛_鼠标菜单选择“Generate BPEL from UML”,?a xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerWorks/">?</a>所C?/p><p><a name="figure5"><b>?5.转换XMI文g</b></a><br /><img height="461" alt="XDE Conversion" src="http://www.uml.org.cn/UMLApplication/images/xde_convert.gif" width="223" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerWorks/" /></p><p>下面为您提供了更改不同前~的机会;需要对其进行改q来与您的设|相匚wQ如果您恰好使用的是ETTK安装Q则默认g需要修改,?a xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerWorks/">?</a>所C?/p><p><a name="figure6"><b>?.讄前缀</b></a><br /><img height="320" alt="Prefixes" src="http://www.uml.org.cn/UMLApplication/images/prefices.gif" width="440" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerWorks/" /></p><p>单击“Finish”按钮后Q许多文将昄在工E中Q其中包括主要的BPEL和WSDL文QLoanAssessor和LoanApprover服务以及数据定义的WSDL文?/p><p><a name="IDABTQBB"><span id="wmqeeuq" class="atitle3">试</span></a><br />q时Q生成的文应该准备q行部v。本文中可以部v到Apache TomcatQ但是也同样可以使用WebSphere Application Server?/p><p>D到BPEL4WS部v面板Q地址是http://localhost:8080/bpws4j/admin/index.html)Q,接着在各自的字段输入与主要服务相应的WSDL文Q即 Loan ApprovalProcess.wsdlQ和BPEL文档Q(即ProcessOrder.bpelQ,?a xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerWorks/">?7</a>所C?/p><p><a name="figure7"><b>?.部v程</b></a><br /><img height="217" alt="Deploying process" src="http://www.uml.org.cn/UMLApplication/images/deployment1.jpg" width="600" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerWorks/" /></p><p>单击“Continue Deployment”按钮之后,在流E插入不同角色需要的所有文档。在本例中有两个特别的Q务:LoanAssessor和LoanApprover?/p><p><a name="figure8"><b>?8.部v服务</b></a><br /><img height="268" alt="Deploying services" src="http://www.uml.org.cn/UMLApplication/images/deployment2.jpg" width="600" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerWorks/" /></p><p>一旦部|完程Q参?a xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerWorks/">Figure 8</a>所C)Q然后运行的例子与BPWS4J例子是相同的Q调用与您的操作pȝ相应的LoanApprovalSample脚本Q?/p><p><code>LoanApprovalSample [soap-address] first-name last-name amount</code></p><p>例如Q?/p><p><code>LoanApprovalSample http://localhost:80/bpws4j/soaprpcrouter John Doe 10</code></p><p>ҎUMLzd图,可以知道数?0000是重要的Q?/p><p><a name="6"><span id="wmqeeuq" class="atitle2">反射</span></a></p><p>本文介绍了带有UML到BPEL转换器的自动化业务流EUML配置文g。配|文件允许开发者用常规的UML技巧和工具Q开发基于BPEL4WS的Web服务业务程。这U方法面向服务的的BPEL4WSlg合ƈ到全面的pȝ设计Q该pȝ设计利用了现存的软g工程Ҏ。另外,从UML到BPEL4WS的映容怋用模型驱动开发方法,从UML模型自动生成BPEL4WS可执行的程?/p><p>q种Ҏ着重于了MDA的概念如何能被运用到其它领域以及抽象的更高别,该方法得开发者可以隔M技术的改变?/p><p>q里有几U不同的情况Q每U情况下q种Ҏ都是有益的:</p><ul xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerWorks/"><li>W一U情况,屏蔽在项目用的技术版本的更改。BPEL可以Qƈ且已l)更改了版本。如果流E所使用的语义没有发生根本的变化Q可以重新生成实现而无需开发h员的q预。这U{换技术也能用来保护开发者在最初开发UML模型的投入:当有UML新版本可用的时候(例如版本从1.4升?版本)QUML模型本n也能q行转换? </li><li>W二U情况,可以产生UML配置表,使用它能生成其它q程实现Q诸如BPML? </li><li>W三U方法,可以从单个模型生成多U技术的制品QartifactQ。在本例中包括BPEL和WSDLQ但不能能生成non-XML输出Q诸如Java输出? </li><li>最后,转变是双向的--在本例中有一个反向映来支持现有的BPEL4WS和WSDL制品QartifactQ的导入Q以及支持BPEL4WS和WSDL制品QartifactQ的同步Q一方发生的改变能够反映到另一斏V?</li></ul><p><a name="7"><span id="wmqeeuq" class="atitle2">致谢</span></a></p><p>感谢Gary Flood、Catherine Griffin和Tracy GardnerҎ文进行输入和注释工作?/p><p><a name="8"><span id="wmqeeuq" class="atitle2">参考资?/span></a></p><ul><li>从IBM alphaWorks下蝲ETTK?br /><br /></li><li>请参阅IBM alphaWorks 上的live running install of the ETTK on <i xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerWorks/">developerWorks</i>?br /><br /></li><li>阅读James Snell~写的“Implementing Web services with the ETTK”教E?Q?i xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerWorks/">developerWorks</i>Q?003q?月)<br /><br /></li><li>查看OMG上的MDA参考资料页面,那里有很多文章,可以链接C议和更多信息?br /><br /></li><li>览OMG上的UML参考资料,那里有很多文章,可以链接C议和更多信息?br /><br /></li><li>?lt;ettk install directory>\\wstk\\services\\demos\\uml2bpel\\docs\\UMLProfileForBusinessProcess1.1.pdf文中查找UML Profile?br /><br /></li><li>阅读<a xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerWorks/">BPEL 1.1规范</a> Q?i xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerWorks/">developerWorks</i>Q?003q?月)?br /><br /></li><li>通过阅读Frank Leymann和Dieter Roller~写的?a target="_blank">Web服务世界中的业务程</a>”,Q获取优U的关于BPEL4WS的概qͼ<i xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerWorks/">developerWorks</i>Q?002q?月)?br /></li></ul></td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <img src ="http://www.aygfsteel.com/19851985lili/aggbug/94381.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/19851985lili/" target="_blank">☜♥☞MengChuChen</a> 2007-01-17 11:06 <a href="http://www.aygfsteel.com/19851985lili/articles/94381.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse Test and Performance Tools Platform ?/title><link>http://www.aygfsteel.com/19851985lili/articles/94377.html</link><dc:creator>☜♥☞MengChuChen</dc:creator><author>☜♥☞MengChuChen</author><pubDate>Wed, 17 Jan 2007 02:53:00 GMT</pubDate><guid>http://www.aygfsteel.com/19851985lili/articles/94377.html</guid><wfw:comment>http://www.aygfsteel.com/19851985lili/comments/94377.html</wfw:comment><comments>http://www.aygfsteel.com/19851985lili/articles/94377.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/19851985lili/comments/commentRss/94377.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/19851985lili/services/trackbacks/94377.html</trackback:ping><description><![CDATA[ <br />Eclipse Test and Performance Tools Platform ?br />用一U高U的可扩展^台来试、分析和监视应用E序<br /><br /><b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> ?br /><br />在交付健壮的产品质量的程序所需的过E中Q编写应用程序或 servlet ?Java 代码只是W一个阶Dc必d代码q行试Q检验它的操作和正确性。往往q必d代码q行分析Q以便消除性能瓉和资源浪费(其是内存)。还必须对代码进行监视,以便Ҏ障进行定位、识别用模式、寻找进一步增强和优化的机会以及探入侵尝试和实际的入c?br /><br />Eclipse <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> 是什么?<br /><br />虽然存在许多对代码进行测试、分析和监视的工P但是很少能够集成Z个大型的工具包。另外,q类工具通常是由不同的厂商提供的Q这使您不得不花费宝늚旉和精力来学习和掌握许多不同的用户界面QUIQ、编译器和诊断技术。在旉和资金两斚wQ专有的开发工具都需要很大的投资?br /><br />但是Q如果测试工兗分析器和监视器是开放源码的Q那么会怎么P而且Q如果这些工h可扩展的QQ何厂商或开发h员都可以创徏新工h者对现有工具q行改进Q那么会怎么P如果q些工具能够很好地集成到一U现有的行的开发环境中Q那么会怎么Pq恐怕是白日做梦吧?不,q已l是现实了?br /><br />Eclipse <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> 是一UY件体pȝ构以及几个扩展了 Eclipse q_的组Ӟ到目前ؓ止)Q它?Eclipse q_上提供了试、性能和监视工兗一?Java、C ?C++ 开发h员?<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> 为其他开发h员构建独特的工具Q还有一些开发h员将 <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> 提供的工具和 Eclipse 的其他特性组合v来,构徏和部|供用户使用的应用程序?br /><br /><b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> 提供了什?br /><br />单地_<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> 是一?Eclipse Foundation 目Q它的目标是Q“构Z个通用的可扩展的基于标准的工具q_QY件开发h员可以在q个q_上创Z用的可互操作?..试和性能工具。?换句话说Q?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> 在本质上是一个工P用来构徏对Y件质量控制进行自动化的工兗?br /><br />实际上,<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> 的当前版本包括核心工具和三种核心衍生工具Q?br /><br /><b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b><br /><b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> ?UI 开发、数据收集、基于规则的数据查询以及应用E序的控制提供了基础代码。例如,<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> 提供了其他工具可以重用和扩展的许多向对{它q提供了~程接口和一个守护进E,以便帮助从正在运行的本地或远E进E中攉数据?<br /><b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> Testing Tools<br />q个目是在 <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> 之上构徏的,提供了对应用E序q行各种自动化测试所需的其他服务。当前版本支?JUnit 自动试、一U指向和点击脚本~程pȝQ用于进行手工测试ƈ记录l果Q和一个用于测?Web 应用E序的自动化pȝQ包括一个可以记录和回放 Web 览会话q对l果q行验证的记录器。Eclipse V4.1 q包括一个图形用L面(GUIQ记录器的早期版本,它可以记录和回放Z SWT 的界面中的鼠标和键盘事g?<br /><b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> Monitoring Tools<br />q个目Ҏ自日志文件或来自应用E序攉的统计数据的数据q行攉、分析和囑Ş昄?<br /><b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> Tracing and Profiling Tools<br />q个目也扩展了 <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b>Q用来收集和分析正在q行的应用程序中的资源用数据,包括 CPU 和内存。这个跟t工兯允许与正在运行的q程q行交互。例如,可以手工地实施垃圾收集ƈ查剩余的对象池,从而寻扑֒修复内存 “泄漏”?br />另外Q?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> 包括一个称?Agent Controller 的守护进E。Agent Controller ?Eclipse 工作台和被测试的应用E序之间?“联lh”。它代表 Eclipse 启动本地或远E?Java 应用E序q{发应用程序度量(包括应用E序日志文gQ给 Eclipse?br /><table class="i_table" cellspacing="1" cellpadding="1" width="100%" align="center"><tbody><tr><td><table cellspacing="0" cellpadding="3" width="100%"><tbody><tr class="head"><td><b>sofieh</b></td><td class="smalltxt" align="right">2006q?3?0?10:54</td></tr><tr bgcolor="#ffffff"><td class="tpc_content" colspan="2">好文章,Ӟ<br />毕竟是权威?/td></tr></tbody></table></td></tr></tbody></table><br /><table class="i_table" cellspacing="1" cellpadding="1" width="100%" align="center"><tbody><tr><td><table cellspacing="0" cellpadding="3" width="100%"><tbody><tr class="head"><td><b>snappyboy</b></td><td class="smalltxt" align="right">2006q?4?5?09:42</td></tr><tr bgcolor="#ffffff"><td class="tpc_content" colspan="2">Eclipse Test and Performance Tools Platform ?br />用一U高U的可扩展^台来试、分析和监视应用E序<br /><br />U别: 中<br />Martin Streicher, ȝ, Linux Magazine<br />2006 q?3 ?23 ?br />学习如何使用 Eclipse Test and Performance Tools PlatformQ?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b>Q分?Java?应用E序Qƈ研究如何量内存使用量、识别内存泄漏ƈ隔离性能瓉?br />开始之?br />在本教程中可以学C么?如何从本教程获得最大的收益Q?br />关于本教E?br />本教E介l?Eclipse Test and Performance Tools PlatformQ?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b>Q,逐步说明了如何安?Eclipse ?<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> 工具Qƈ演示如何分析正在q行?Java 应用E序?br /><br />前提条g<br />Z从本教程中获益,您应该具?Java 软g开发经验ƈ了解整个软g开发生命周期,包括试和分析。还应该熟悉从命令行安装软gQ以及设|和理 shell 和系l环境变量,比如 Java CLASSPATH。了?Eclipse ?Standard Widget ToolkitQSWTQ也是有帮助的?br />在开始之前,必须?UNIX]、Linux]、Mac OS X ?Microsoft] Windows] pȝ上安装几个Y件包。需?Java 虚拟机(Java Virtual MachineQJVMQ、Eclipse q_、Eclipse <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> q行时以?<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> 所依赖的几个Y件。还需?<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> ?Agent ControllerQ它允许启动q分析应用程序。下面是所需的所有YӞ<br />?   Java 2 Platform, Standard EditionQJ2SEQ?V1.4 Software Development KitQSDKQ?<br />?   J2SE V1.4 Java Runtime Environment QJ2REQ?<br />?   Eclipse V3.1 SDK <br />?   Eclipse Modeling FrameworkQEMFQ?SDK V2.1 <br />?   XML Schema Infoset ModelQXSDQ?SDK V2.1 <br />?   V1.1.1 of UML2 <br />?   <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> q行?<br />?   Agent Controller q行?Q适合您系l的版本Q?<br />?   Eclipse Update ManagerQ可选) <br /><br />pȝ需?br />如果pȝ上没有安?JVM ?EclipseQ那么所有Y件至需?300 MB 的空闲磁盘空间。还需要有_的空闲物理内存来q行 JVM。一般来_使用 64 MB 或更多的I闲物理内存?br /><b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> ?br />在交付健壮的产品质量的程序所需的过E中Q编写应用程序或 servlet ?Java 代码只是W一个阶Dc必d代码q行试Q检验它的操作和正确性。往往q必d代码q行分析Q以便消除性能瓉和资源浪费(其是内存)。还必须对代码进行监视,以便Ҏ障进行定位、识别用模式、寻找进一步增强和优化的机会以及探入侵尝试和实际的入c?br />Eclipse <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> 是什么?<br />虽然存在许多对代码进行测试、分析和监视的工P但是很少能够集成Z个大型的工具包。另外,q类工具通常是由不同的厂商提供的Q这使您不得不花费宝늚旉和精力来学习和掌握许多不同的用户界面QUIQ、编译器和诊断技术。在旉和资金两斚wQ专有的开发工具都需要很大的投资?br />但是Q如果测试工兗分析器和监视器是开放源码的Q那么会怎么P而且Q如果这些工h可扩展的QQ何厂商或开发h员都可以创徏新工h者对现有工具q行改进Q那么会怎么P如果q些工具能够很好地集成到一U现有的行的开发环境中Q那么会怎么Pq恐怕是白日做梦吧?不,q已l是现实了?br />Eclipse <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> 是一UY件体pȝ构以及几个扩展了 Eclipse q_的组Ӟ到目前ؓ止)Q它?Eclipse q_上提供了试、性能和监视工兗一?Java、C ?C++ 开发h员?<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> 为其他开发h员构建独特的工具Q还有一些开发h员将 <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> 提供的工具和 Eclipse 的其他特性组合v来,构徏和部|供用户使用的应用程序?br /><br /><b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> 提供了什?br />单地_<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> 是一?Eclipse Foundation 目Q它的目标是Q“构Z个通用的可扩展的基于标准的工具q_QY件开发h员可以在q个q_上创Z用的可互操作?..试和性能工具。?换句话说Q?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> 在本质上是一个工P用来构徏对Y件质量控制进行自动化的工兗?br />实际上,<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> 的当前版本包括核心工具和三种核心衍生工具Q?br /><b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b><br /><b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> ?UI 开发、数据收集、基于规则的数据查询以及应用E序的控制提供了基础代码。例如,<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> 提供了其他工具可以重用和扩展的许多向对{它q提供了~程接口和一个守护进E,以便帮助从正在运行的本地或远E进E中攉数据?<br /><b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> Testing Tools <br />q个目是在 <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> 之上构徏的,提供了对应用E序q行各种自动化测试所需的其他服务。当前版本支?JUnit 自动试、一U指向和点击脚本~程pȝQ用于进行手工测试ƈ记录l果Q和一个用于测?Web 应用E序的自动化pȝQ包括一个可以记录和回放 Web 览会话q对l果q行验证的记录器。Eclipse V4.1 q包括一个图形用L面(GUIQ记录器的早期版本,它可以记录和回放Z SWT 的界面中的鼠标和键盘事g?<br /><b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> Monitoring Tools <br />q个目Ҏ自日志文件或来自应用E序攉的统计数据的数据q行攉、分析和囑Ş昄?<br /><b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> Tracing and Profiling Tools <br />q个目也扩展了 <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b>Q用来收集和分析正在q行的应用程序中的资源用数据,包括 CPU 和内存。这个跟t工兯允许与正在运行的q程q行交互。例如,可以手工地实施垃圾收集ƈ查剩余的对象池,从而寻扑֒修复内存 “泄漏”?br />另外Q?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> 包括一个称?Agent Controller 的守护进E。Agent Controller ?Eclipse 工作台和被测试的应用E序之间?“联lh”。它代表 Eclipse 启动本地或远E?Java 应用E序q{发应用程序度量(包括应用E序日志文gQ给 Eclipse?br />本教E的剩余部分演示针对 Java 技术的几种 <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> 分析工具?br />安装必需的Y件和lg<br />在开始学习本教程之前Q必d装和讄 “前提条件?节中列出的软g和组件?br /><br />安装 J2SE ?J2RE<br />下蝲q安?J2SE V1.4 SDK ?V1.4 J2RE。(如果pȝ上已l有 J2SE V1.4.2_10 或更高版本,那么可以跌q一步。)<br /><br />通常QJ2SE SDK ?Java Runtime EnvironmentQJREQ是以自解压的二q制文g形式发布的。Linux 上的安装通常只需执行以下命oQ?br /><br />清单 1. J2SE SDK ?Java Runtime Environment 安装<br /><br /><br />% cd ~<br />% mkdir ~/java<br />% cd ~/java<br />% mv ~/j2sdk-1_4_2_10-linux-i586.bin . <br />% mv ~/j2re-1_4_2_10-linux-i586.bin . <br />% chmod +x j2sdk-1_4_2_10-linux-i586.bin j2re-1_4_2_10-linux-i586.bin<br />% ./j2sdk-1_4_2_10-linux-i586.bin<br />.<br />% ./j2re-1_4_2_10-linux-i586.bin<br />.<br />% ls -F<br />j2re1.4.2_10/   j2sdk1.4.2_10/<br /><br />使用 Eclipse Update Manager 安装 <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b>Q可选)<br />如果已经安装?EclipseQ那么可以?Eclipse Update Manager 安装 <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b>。步骤如下:<br />1.    点击 Help > Software Updates > Find and Install?<br />2.    选择 Search for new features to install 选项Q然后点?Next?<br />3.    点击 New Remote SiteQ然后分别输?<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> Update Site ?<a target="_blank">http://eclipse.org/<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">tptp</b>/updates/site.xml</a> 作ؓ名称?URL。点?Finish?<br />4.    选择要安装的Ҏ,然后点击 Next?<br />5.    接受许可协议Q点?NextQ然后点?Finish?<br />6.    在确认提CZQ点?Install All。当安装完成Ӟ重新启动 Eclipse?<br />现在Q可以蟩q后?“安?Agent Controller?节中描q的安装 Agent ControllerQ它必须手工安装Q的步骤。如果还没有安装 EclipseQ请l箋阅读下文?br /><br />安装 Eclipse V3.1 SDK<br />下蝲适合自己q_?Eclipse 3.1 SDK。可以在 Eclipse Downloads 上找到这?SDK。通常Q安装时只需?Eclipse .tar.gz 文g释放到您选择的目录中。例如,如果使用 LinuxQ那么下?Eclipse V3.1 SDK tarballQ然后用以下命令将它释攑ֈ一个目录中Q比?~/java/Q?br /><br />% cd ~/java<br />% mv ~/eclipse-SDK-3.1.1-linux-gtk.tar.gz . <br />% tar zxvf eclipse-SDK-3.1.1-linux-gtk.tar.gz<br /><br />如果x?Eclipse 是否已经成功安装了,那么留在释放 Eclipse 的目录中Q确?java 可执行文件在 PATH 中ƈq行 java -jar eclipse/startup.jar。例如:<br /><br />清单 2. ?Eclipse 是否已经成功安装?br /><br /><br />% export JAVA_DIR=$HOME/java<br />% export JAVA_HOME=$JAVA_DIR/j2sdk1.4.2_08/sdk<br />% export PATH=$JAVA_HOME/bin<br />% export CLASSPATH=$JAVA_HOME<br />% cd $JAVA_DIR<br />% java -jar eclipse/startup.jar<br /><br />如果提示您ؓ工作I间选择目录Q那么输?$HOME/java/workspace。这个目录将保存您在 Eclipse 中创建的所有项目。(当然Q如果有许多目Q以后可以选择其他目录Q让一个工作空间只包含一个项目。)<br /><br />安装 EMF SDK V2.1<br />如果 Eclipse 正在q行Q就退出它q下?EMF SDK V2.1。(Ҏ EMF Web 站点所_“EMF 是一U徏模框架和代码生成设施Q用于根据结构化数据模型构徏工具和其他应用程序。”)在下载文件之后,q入包含 Eclipse 文g夹的目录q运?unzip emf-sdo-SDK-2.1.0.zip。例如:<br /><br />清单 3. q行 unzip emf-sdo-SDK-2.1.0.zip<br /><br /><br />% cd $JAVA_DIR<br />% ls<br />eclipse j2sdk1.4.2_08<br />% mv ~/emf-sdo-SDK-2.1.0.zip . <br />% unzip emf-sdo-SDK-2.1.0.zip<br />creating: eclipse/features/<br />creating: eclipse/features/org.eclipse.emf.ecore.sdo_2.1.0/<br />creating: eclipse/features/org.eclipse.emf_2.1.0/<br />inflating: ...<br /><br />安装 XSD SDK V2.1<br />下蝲 XSD SDK V2.1。(Ҏ目 Web 站点所_“XSD 是一个库Q它提供了一个应用编E接口(APIQ,用于按照 World Wide Web ConsortiumQW3CQXML Schema 规范的描q操?XML 模式的组件。”)在下载文件之后,q入包含 Eclipse 目录的目录ƈq行 unzip xsd-SDK-2.1.0.zip。下面是一个例子:<br /><br />% cd $JAVA_DIR<br />% mv ~/xsd-SDK-2.1.0.zip .<br />% unzip xsd-SDK-2.1.0.zip<br /><br />如果提示您确认覆盖Q何文Ӟ那么只需?yQ小写)Ҏ个问题回{?Yes?br /><br />安装 UML V2.0 Metamodel Implementation<br />要?<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> ?Unified Modeling LanguageQUMLQ特性,需要安?UML V2.0 Metamodel Implementation。如果正在?Eclipse V3.1.1Q那么下?V1.1.1 of UML2Q然后在包含 Eclipse 的目录中释放它的存文gQ?br /><br />% cd $JAVA_DIR<br />% mv ~/uml2-1.1.1.zip . <br />% unzip uml2-1.1.1.zip<br /><br />安装 <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> q行?br />对于下一步,下蝲 <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> q行Ӟq包含所?<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> Ҏ和集成两个pȝ所需?Eclipse 插g。要安装 <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b>Q进入包?Eclipse 的目录ƈq行 unzip <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">tptp</b>.runtime-<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b>-4.1.0.zip。下面是一个例子:<br /><br />% cd $JAVA_DIR<br />% mv ~/<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">tptp</b>.runtime-<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b>-4.1.0.zip .<br />% unzip <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">tptp</b>.runtime-<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b>-4.1.0.zip       <br /><br />安装 Agent Controller<br />Agent Controller ?<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> 的一个重要组Ӟ它 Eclipse 能够启动应用E序q与q些应用E序q行交互Q从而提取分析数据。下载适合您的操作pȝ?Agent Controller q行时。接下来Q在包含 Eclipse 的目录中创徏一个称?tptpd 的目录,q将 Agent Controller 存文g释放到这个目录中。要q行的命令是Q?br /><br />% mkdir $JAVA_DIR/tptpd<br />% cd $JAVA_DIR/tptpd<br />% mv ~/tptpdc.linux_ia32-<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b>-4.1.0.zip . <br />% unzip tptpdc.linux_ia32-<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b>-4.1.0.zip<br /><br />如果看到两个下面q样的错误:<br /><br />linking: lib/libxerces-c.so     <br />warning: symbolic link (lib/libxerces-c.so) failed<br /><br />linking: lib/libxerces-c.so.24   <br />warning: symbolic link (lib/libxerces-c.so.24) failed<br /><br />那么必须通过输入以下命o来手工重新创两个链接Q?br /><br />% cd $JAVA_DIR/tptpd/lib<br />% rm libxerces-c.so libxerces-c.so.24<br />% ln -s libxerces-c.so.24.0 libxerces-c.so<br />% ln -s libxerces-c.so.24.0 libxerces-c.so.24<br /><br />d Agent Controller 目录<br />要?Agent ControllerQ必d它的 lib 目录d?LD_LIBRARY_PATH 中。例如,如果正在q行 Linux q用以上步骤中l出的目录结构,那么用以下命令添?$JAVA_DIR/tptpd/libQ?br /><br />% export LD_LIBRARY_PATH=$JAVA_DIR/tptpd/lib:$LD_LIBRARY_PATH<br /><br />q必ȝ?Controller ?lib ?bin 目录的内Ҏ可执行的。ؓ此,q行Q?br /><br />% chmod +x $JAVA_DIR/tptpd/{bin,lib}/*<br /><br />现在配|和启动 Agent Controller 的脚本添加到 PATHQ?br /><br />% export PATH=$JAVA_DIR/tptpd/bin:$PATH<br /><br />针对环境配置 Agent Controller<br />最后,要配|?Agent Controller 以便匚w环境。进?Agent Controller ?bin 目录Q然后运?SetConfig.sh?br /><br />% cd $JAVA_DIR/tptpd/bin<br />% ./SetConfig.sh<br /><br />当配|脚本提C您q行选择Ӟ接受默认讄。运行配|脚本会?Agent Controller 的文件层ơ结构中创徏文g config/serviceconfig.xml?br /><br />试 Agent Controller<br />Z试 Agent ControllerQ运?RAStart.sh。ؓ了停?Agent ControllerQ运?RAStop.shQ?br /><br />清单 4. 停止 Agent Controller<br />db% RAStart.sh <br />Starting Agent Controller<br />RAServer started successfully<br />% RAStop.sh <br />RAServer stopped, pid = 5891<br />RAServer stopped, pid = 5892<br />RAServer stopped, pid = 5893<br />RAServer stopped, pid = 5894<br />RAServer stopped, pid = 5895<br />RAServer stopped, pid = 5896<br />RAServer stopped, pid = 5897<br />RAServer stopped, pid = 5898<br />RAServer stopped, pid = 5899<br />RAServer stopped, pid = 5900<br />RAServer stopped, pid = 5901<br />RAServer stopped, pid = 5902<br />RAServer stopped, pid = 5904<br />RAServer stopped, pid = 5905<br />RAServer stopped, pid = 5906<br /><br />现在完成了!重新启动 Eclipse。在 Eclipse 工具栏上应该会看C个新按钮Q如?1 所C。这?<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> Profile 按钮?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> 已经安装了,您可以l学习本教程了?br />?1. <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> Profile 按钮<br /><br /><br />?Java 应用E序q行分析<br />既然已经安装?<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> 和底层YӞ现在p?Eclipse?br /><br />CZ应用E序<br /><br />要分析的 Java 应用E序见清?5?br /><br />清单 5. 由少量对象组成的?Java 应用E序<br /><br /><br />import java.io.BufferedReader;<br />import java.io.IOException;<br />import java.io.InputStreamReader;<br /><br />public class SpaceShipToy {<br />  /* <br />  * To build a spaceship, you need a capsule, a booster,<br />  * three stages, and two monkeys (borrowed<br />  * from a Barrel of Monkeys).<br />  */ <br />  public Capsule capsule = new Capsule();<br />  public Booster booster = new Booster();<br />  public Stage[] stage = new Stage[3];<br />  <br />  public SpaceShipToy()<br />  {<br />    for (int i = 0; i < 3; i++)<br />    stage<i> = new Stage();<br />  }<br /><br />  private void _killTime(int seconds) <br />  {<br />    if (seconds <= 0)<br />      return;<br />      <br />    for (int i = 0; i < seconds; i++);<br />  }<br />  <br />static final int MINUTE = 60;<br />  static final int CAPSULE = 2 * MINUTE;<br />  static final int BOOSTER = 5 * MINUTE;<br />  static final int STAGE = 3 * MINUTE;<br />  static final int MONKEY = 10 * MINUTE;<br />  <br />  class Capsule { <br />    public Monkey chimp1 = new Monkey(), chimp2 = new Monkey();<br /><br />    public Capsule() {<br />      System.out.println("Start building the capsule...");<br />      _killTime(CAPSULE);<br />      chimp1.build();<br />      chimp2.build();<br />      System.out.println("Capsule complete.");<br />    }<br />  }<br />  <br />  class Booster   { <br />    public Booster() {<br />    System.out.println("Start booster...");<br />    _killTime(BOOSTER);<br />    System.out.println("Blast off.");<br />    }   <br />  }<br />  <br />  class Stage { <br />    public Stage() {<br />    System.out.println("start stage...");<br />    _killTime(STAGE);<br />    System.out.println("Stage complete.");<br />    }   <br />  }<br />  <br />  class Monkey {<br />    public void start() {<br />    System.out.println("Start the monkey business...");<br />    }<br />    <br />    public void build() {<br />    start();<br />    _killTime(MONKEY);<br />    finish();<br />    }<br />    <br />    public void finish() {<br />    System.out.println("Monkey business complete.");<br />    }<br />  }<br /><br /><br />  public static void main(String[] args) throws java.io.IOException<br />  {<br />    final int NUMBERTOYS = 9;<br />    <br />    BufferedReader in = new <br />      BufferedReader(new InputStreamReader(System.in));<br />    SpaceShipToy[] toys = new SpaceShipToy[NUMBERTOYS];<br />    String input = in.readLine().trim();<br />    <br />    System.out.println("Toy factory is up and running...");<br />    System.out.flush();<br /><br />    for (int i = 0; i < NUMBERTOYS; i++) <br />      toys<i> = null;<br />      <br />    while (!input.equalsIgnoreCase("q")) {<br />    if (input == null || input.length() != 1 <br />      || !Character.isDigit(input.charAt(0))) {<br />      System.err.println ("Unknown option. Try 0-9, q");<br />      input = in.readLine().trim();<br />      continue;<br />    }<br />    <br />    int number = Integer.valueOf(input).intValue();<br />    if (number == 9) {<br />      new SpaceShipToy();<br />      System.out.println("Whoops... Lost one...");<br />    }<br />    else {<br />      if (toys[number] != null) { <br />        System.out.println("Shipping toy # " + number);<br />        toys[number] = null;<br />      }<br />      else {<br />        System.out.println("Building toy # " + number);<br />        toys[number] = new SpaceShipToy();<br />      }<br />    }<br />    <br />    input = in.readLine().trim();<br />  }<br />} <br />}<br /><br />q个 Java 应用E序很简单:?“构建?玩具飞船q将它们 “发?到商店。每个玩L一?Java 对象代表Q这个对象包含几个其他对象,q些对象各自代表玩具的一个部件。每个玩具部仉要花一定的旉来构建?br />Z使用q个应用E序Q按 0 ?8 数字键来构徏玩具。如果再ơ按同一个键Q构建的玩具p “发”,相关联的对象被取消引用,从而可以被垃圾攉。因此,在Q何时候在内存中最多可以有 9 个玩P如果构徏了所?9 个玩P而且都没有发)?br />?9 键会创徏一个未被引用的对象Q这模拟了内存泄漏。按 qQ小写)可以退出应用程序?br /><br />q行分析会话<br />使用 Eclipse ?<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> 来运行ƈ分析 “玩具工厂”?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> 可以昄zd对象的数量、执行时间等{。要使用 Eclipse ?<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b>Q?br />1.    启动 Agent Controller?<br />2.    q入 Agent Controller bin 目录Q然后运?RAStart.sh:<br />% cd $JAVA_DIR/tptpd/bin<br />% ./RAStart.sh<br />3.    ?Eclipse 中,q入工作台ƈ通过点击 File > New > Project 创徏一个新?Java 目。从选项列表中选择 Java ProjectQ然后点?Next?<br />4.    在下一个窗口中Q输?Toy Maker 作ؓ Project NameQ然后点?Finish。标题ؓ “Toy Maker?的新目应该会出现在 Package Explorer 面板中?<br />5.    在这个项目中Q在 example 包中创徏一个称?SpaceShipToy ?Java cR点?File > New > Class?<br />6.    在弹出的H口中,?Package 域中输入 example q在 Name 域中输入 SpaceShipToy。窗口中的其他设|保持不变?<br />7.    点击 Finish。现在应该会看到新类的骨架?<br />8.    清?1 中的代码复制?Eclipse cȝ辑器中,一定要留下 package example 声明Q但是要替换I的cd义。保存代码以使修Ҏ久化Q这q会?Eclipse 自动地重新编译类的新版本?<br />9.    如果要运行这个应用程序,点击 Run > Run...Q双?Java ApplicationQ选择 SpaceShipToyQ然后点?Run。要与这个应用程序进行交互,点击 Windows > Show View...Q然后选择 Console?<br />10.    输入 1Q数字一Qƈ?Return。屏q应该与?2 怼?br /><br />?2. ?Eclipse 下运行的玩具工厂<br /><br /><br />对同一个应用程序进行分?br />要对同一个应用程序进行分析:<br />1.    点击 <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> ProfileQ然后选择 Profile...?<br />2.    展开 Java Application 以显C?SpaceShipToy。注意,Profile H口与点?Run 时出现的 Run H口怼Q但是多了一个称?Profile 的选项卡?<br />3.    点击 Profile 在分析器下启动这个应用程序。如果透视图没有自动切换,那么点击 Window > Open Perspective > Other...Q然后选择 Profiling and Logging?<br />4.    ?Profiling and Logging 透视囑և现时Q展开 Profiling Monitor 视图的内容,然后选择?<monitoring> 开头的行。在选择q一行时Q出C个控制台视图?<br />5.    输入 0?? ?9。屏q应该与?3 怼?br /><br />?3. Profiling and Logging 透视图与正在q行的应用程?br /><br />6.    点击 Memory Statistics 视图Q然后展开?example 包相兌的行。这个视囑ֺ该与?4 怼。这里有 4 个对象实例:三个代表 “构建的?玩具Q一个代表未被引用的玩具?br /><br />?4. 在构Z个玩具对象和一个未被引用的玩具之后的内存消?br /><br />Memory Statistics 视图中的列记录了实例和内存用统计数据:<br />?   Total Instances 反映一个类的实例L?<br />?   Live Instances 昄有多个实例仍然被引用,q没有被垃圾攉器收集?<br />?   Collected l计垃圾攉器已l收集了多少个类实例?<br />?   Total Size (bytes) ?Active Size (bytes) 分别昄所有实例用的累积内存总量Q一U高水位标志Q和zd实例当前使用的内存量?<br />l束试运?br />要结束这一ơ试q行Q切换回控制台视图,然后再次?0? ?2 数字键。点?Monitoring 视图中的 trash can 图标实施垃圾攉。好的垃圾收集器会收集所有未被引用的对象。在M时候,都可以通过点击 Refresh h当前透视图中的所有视图,见图 5?br />?5. Refresh 按钮<br /><br />L需要的数据<br />Profiling and Logging 透视图提供了许多视图Q其中提供关于应用程序状态的大量数据。要查看视图列表Q点?Window > Show View > Other...Q然后展开 Profiling and Logging 下面的列表。这个列表应该与?6 怼?br /><br />?6. Profiling and Logging 视图的列?br /><br /><br />攉数据来填充视?br />Ҏ您的目标和面对的问题Q可以收集数据来填充所有这些视图或者其中一个视图。在前一节中Q收集的惟一数据是内存统计数据,q些数据填充?Memory Statistics 视图中。Monitoring 视图与图 7 怼?br /><br />?7. Monitoring 视图中的基本l计数据<br /><br />最下面的展开的列表表明,当前的分析配|只包含内存使用情况的统计数据。我们来创徏一个收集尽可能多信息的新的分析配置Q这hp够看到分析和性能工具提供的所有度量:<br />1.    点击 <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> Profile 按钮中的箭_然后选择 Profile...?<br />2.    ?Profile H口中,选择 SpaceShipToyQ然后点ȝ口底部左边的 New?<br />3.    在最双面板的顶部,?Name 域中输入 Lots of Data Q然后点?Apply?<br />4.    点击 Profiling 选项卡,然后点击 Add...?<br />5.    在下一个窗口中Q输?All 作ؓ Profile set name q在 Description 域中输入 All of the data that's available。点?Next?<br />6.    下一个面板让您选择要收集的数据。展开所有选择Q然后选中所有复选框Q如?8 所C?br /><br />?8. 要选择的度?br /><br />7.    点击 Execution Time Analysis?<br />8.    选择 Collect method CPU time information 复选框Q然后选择 Show execution flow graphical details 选项。再ơ点?Next。下一个窗口(见图 9Q允许过滤掉您不感兴的cR?br /><br />?9. 从分析中排除无关的类<br /><br />9.    Zq个例子的目的,点击面板剙?Add... 来添加一个新的过滤器集。将q个qo器集命名?No Monkey Business q点?OK?<br />10.    点击规则列表双?Add... 在过滤器集中d一个新规则。在 Class name 域中输入 example.SpaceShipToy q在 Method name 域中输入 mainQ星PQ选择 EXCLUDE 作ؓ RuleQ见?10Q,然后点击 OK?br /><br />?10. ~辑qo器规?br /><br />11.    在更大的H口中,点击 Apply?<br />12.    现在已经定义了要分析的应用程序和要收集的度量。点?Profile?<br />13.    ?Profiling and Logging 透视图中Q点?Memory Statistics 视图。应该会看到Q根据刚才创建的规则Q没有对Ҏ example.SpaceShipToy.main() 执行度量?<br />提示和技?br /><b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> 工具提供了丰富的Ҏ,可以帮助您深入地了解应用E序。另外,因ؓ <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> ?Eclipse 的其余部分很好地集成在一P您会发现许多方便之处?br />Z帮助您,下面提供一些提C和技巧?br /><br />快速徏立数据过滤器<br />启动一个分析会话ƈ打开 Execution Statistics 视图。这个视图显CZ个应用程序中的所有类和方法(臛_是还没有在过滤器集中qo掉的那些Q。在q个视图中右击,打开?11 所C的快捷菜单?br /><br />?11. 快捷菜单<br /><br />点击 Filter out...Q选择 ProfilingQ然后点?OK。在下一个窗口(见图 12Q中Q输?Monkey Business 作ؓqo器名q输?build 作ؓqo器字W串Q然后选择 Filter by 下面?Method name 选项。点?OK q再ơ点?OK?br />?12. Edit Filter H口<br /><br />视图应该会改为只昄 example.SpaceShipToy$Monkey.build() Ҏ的统计数据?br />要想恢复视图Q再ơ看到所有方法,可以点击 FilterQ见?13Qƈ选择 No filter。要想编辑Q何过滤器Q可以点d一个按钮ƈ选择 Manage filters...?br />?13. Filter 按钮<br /><br /><br /><br />跛_源代?br />仍然留在 Execution Statistics 视图中。双?SpaceShipToy$Booster cR这时就会切换到 Java 透视囑ƈ直接跛_内部c?Booster 的定义。内存分析视囑֒ Eclipse 代码~辑器之间的q种q接是非常有价值的Ҏ?br /><br />高的复杂过滤器<br />可以使用 Edit Filter H口?Advanced 选项卡来构徏L复杂的过滤器。高U过滤器 是一pd规则Q其中每个规则列Z个属性、一个条Ӟ比如 “equal”、“not equal??“like”)和一个倹{您想知道一个实例消耗了多少内存吗?q可以用高qo器来表达?br /><br />l织和排?br />大多数数据视囑֏以按照包、类和方法对数据q行l织。通过点击大多数数据视N部的三个按钮之一Q见?14Q,可以快速地改变数据的组l方式?br />?14. 用于l织数据的三个按?br /><br />从左到右Q分别是按照包、类和方法进行组l的按钮?br />q可以通过点击M列标题,Ҏ有数据进行排序。点d标题一ơ,对q个列按照升序进行排序;再次点击同一个列标题Q就按照降序昄数据?br /><br />使用 UML2 序列图深入了解代?br /><b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> 提供了另一个对了解正在q行的应用程序有帮助的特性:UML2 序列图。这个图不但昄cdҎ之间的调用序列,q可以突出显C热点,也就是消耗了大部分应用程序执行时间的代码部分?br /><br />在序列图中查看代?br />要?UML2 序列图查看代码:<br />1.    退出正在分析的所有玩具工厂应用程序实例?<br />2.    点击 <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> Profiling 按钮中的箭头。选择 Profile...Q选择 SpaceShipToyQ点?Profiling 选项Q然后选择 All?<br />3.    点击 ApplyQ如果需要的话)Q然后点?Profile?<br />4.    当应用程序在 Profiling Monitor 视图中启动时Q右d启动的进Eƈ选择 Open With... > UML2 Thread Interactions 来打开 UML2 class Interactions 视图。因个应用程序刚刚启动,所以这个图只显CZ?main() 的调用,如图 15 所C?br /><br />?15. 只显C?main() 调用的简?UML ?br /><br />5.    切换到控制台视图q与应用E序q行交互Q从而生更多的Ҏ调用。然后切换回 UML2 Trace Interactions 视图。UML 囑ֺ该已l增大了Q可能与?16 怼?br /><br />?16. CZ应用E序?UML2 视图<br /><br />6.    鼠标指针放在左边空白处中的U色条上Q就会显CZ个表C?CPU 旉消耗的d条(见图 17Q?br /><br />?17. CPU 消耗刻度条<br /><br />7.    q色表C最大。在q个应用E序中,SpaceShipToy cȝ构造过E显然是瓉?br />对对象引用进行编?br />另一个对正在q行的应用程序进行分析的有用Ҏ是 Object References 视图Q这个视图显C应用程序中每种对象的引用数量。如果您?Java 代码看v来消耗了q多的内存,那么攉q查看对象引用可以帮助您扑ֈ出问题的代码?br /><br />使用 Object References 视图<br />使用 Object References 视图与用其?<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> 视图一样容易:<br />1.    l止正在分析的所有进E?<br />2.    ?Profiling Monitor 中右dƈ选择 Unload Profiling Data。按照提C删除到目前为止攉的所有数据?<br />3.    选择以前监视的所有进Eƈ?Delete。出现提C窗口时Q选择 Do not delete contentsQ然后点?Yes?<br />4.    对玩具工厂应用程序启动一个新的分析会话。切换到控制台视图,然后?1 2 9 来创Z个玩具和未被引用的第三个 “玩具”?<br />5.    通过?Profiling Monitor 视图中点?Collect object referencesQ收集正在用的对象Q见?18Q?br /><br />?18. Collect Object References 按钮<br /><br />6.    ?Eclipse 工具栏上Q点?Open Object ReferencesQ见?19Q来打开 Object References 视图。Object References 视图列出应用E序中用的每个对象和对应的引用数量?br /><br />?19. Object References 按钮<br /><br />7.    展开 SpaceShipToy。引用表应该与图 20 怼。已l创Z三个玩具Q所以这个表是准的Q因为每个玩具包含一个推q器、一个太IZQ其中有两只猴子Q和三火箭?br /><br />?20. CZ应用E序在某一时刻?Object References 视图<br /><br /><br />Ҏ?Java 应用E序使用 <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b><br />除了寚w过 Eclipse 工作台构建和启动?Java 应用E序q行分析之外Q还可以分析本地计算Z已经在运行的 Java 应用E序Q应用程序也可以在远E计机上,但是q里不讨论分析远E应用程序的q程Q。可以通过 <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> 附着 到进E上。附着之后Q就可以使用前面学习q的所有工h探烦和观察内存分配?br /><br />附着到本?Java 应用E序<br />要附着到本?Java 应用E序Q?br />1.    退出和删除 Profiling Monitor 视图中所有正在运行的q程?<br />2.    打开一个命令窗口ƈ认 PATH ?JAVA_HOME 环境变量指向 JRE?<br />3.    保 LD_LIBRARY_PATH 包含 <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> 库。在试pȝ上,q些变量如下所C(Ҏ您的pȝ配置Q\径名和目录名可能不一PQ?br /><br />% printenv<br />.<br />PATH=/bin:/usr/bin:/usr/X11R6/bin:/home/mstreicher/java/jdk/bin<br />JAVA_HOME=/home/mstreicher/java/jdk<br />JAVA_DIR=/home/mstreicher/java<br />LD_LIBRARY_PATH=/home/mstreicher/java/tptpd/lib:<br /><br />4.    保 <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> Agent Controller 正在q行。进入包?Agent Controller 的目录,然后停止q新启动这个守护进E:<br /><br />% cd $JAVA_DIR/tptpd/bin<br />% ./RAStop.sh<br />RAServer stopped, pid = 3163<br />RAServer stopped, pid = 3164<br />.<br />RAServer stopped, pid = 18108<br />% ./RAStart.sh<br />Starting Agent Controller<br />RAServer started successfully<br /><br />5.    玩具工厂应用程序作为单独的独立 Java 应用E序q行Q?br />o    q入包含CZ应用E序的工作空间目录,可能?$HOME/workspace/Toy Maker。在q个目录中,应该会看C个称?example 的目录,其中包含 SpaceShipToy.java 的代码和相关联的 .class 文g?<br />o    当前工作目录(.Q点PQ添加到 CLASSPATHQ?br /><br />% cd $HOME/workspace/Toy Maker<br />% ls -F<br />example<br />% export CLASSPATH=.:$CLASSPATH<br /><br />6.    ?-XrunpiAgent:server=enabled 选项通过 <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> Agent Controller 启动应用E序。enabled 模式以普通方式启?Java 应用E序q在后台q行控制器。(如果在附着到应用程序之前不x行它Q那么?controlled 模式。)<br /><br />% java -XrunpiAgent:server=enabled example/SpaceShipToy<br /><br />7.    q回?EclipseQ然后点?<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> Profile 按钮中的箭头。选择 Profile...。在左边的列表中Q双?Attach - Java Process?<br />8.    在下一个窗口中Q在 Name 域中输入 ToysQ然后选择 localhost 作ؓL。点?Apply?<br />9.    通过点击 Agents 选项卡选择一个代理,如图 21 所C?br /><br />?21. 选择要附着的代?br /><br />点击昄的代理(如果当前没有在分析其他应用程序或q程Q那么应该有一个代理)Q然后点?>。ؓ了保存这一修改Q再ơ点?Apply?br />10.    通过点击 Profiling 选项卡ƈ选择一个分析集Q从而选择要收集什么数据。可以选择 AllQ就会采用前面创建的分析集?<br />11.    点击 ApplyQ然后点?Profile。Eclipse 应该会切换到 Profiling and Logging 透视图?<br />12.    在大多数pȝ上,q时会出C?22 怼的窗口?br /><br />?22. Profiling 提示<br /><br />q个警告是正常的Q它提醒您尽已l附着Cq个q程Q但是必L工启动监视。ؓ了启动监视,叛_刚启动的分析q程Q然后选择 Start monitoring?br />13.    切换回命令窗口,与应用程序进行交互。再q回 Eclipse 查看正在q行的应用程序的分析数据。完成之后,点击 Terminate Process 按钮Q见?23Q?br /><br />?23. Terminate Process 按钮<br /><br />在命oH口中杀死进E:<br /><br />% java -XrunpiAgent:server=enabled example/SpaceShipToy<br />.<br />Stage complete.<br />Start stage...<br />Stage complete.<br />Start stage...<br />Stage complete.<br />zsh: killed   java -XrunpiAgent:server=enabled example/SpaceShipToy<br />%<br /><br />l束?br />本教E演CZ如何通过分析代码来调整和改进 Java 应用E序。通过使用 Eclipse <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b>Q可以运行代码ƈ探测哪些代码D|费了内存q导致性能降低?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> q提供了其他工具Q可以从大型日志文g中提取信息,以及自动地获取和分析试l果?br /><b style="COLOR: black; BACKGROUND-COLOR: #ffff66">TPTP</b> 中的其他工具包括一个记?回放设施Q可以测试在 Eclipse 下运行的应用E序?GUIQ和一个称?XRay 的特D分析器Q专门用于分析源?Eclipse q_的应用程序)?/i></i></td></tr></tbody></table></td></tr></tbody></table><br /><img src ="http://www.aygfsteel.com/19851985lili/aggbug/94377.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/19851985lili/" target="_blank">☜♥☞MengChuChen</a> 2007-01-17 10:53 <a href="http://www.aygfsteel.com/19851985lili/articles/94377.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse WTPhttp://www.aygfsteel.com/19851985lili/articles/94375.html☜♥☞MengChuChen☜♥☞MengChuChenWed, 17 Jan 2007 02:44:00 GMThttp://www.aygfsteel.com/19851985lili/articles/94375.htmlhttp://www.aygfsteel.com/19851985lili/comments/94375.htmlhttp://www.aygfsteel.com/19851985lili/articles/94375.html#Feedback0http://www.aygfsteel.com/19851985lili/comments/commentRss/94375.htmlhttp://www.aygfsteel.com/19851985lili/services/trackbacks/94375.htmlEclipse WTP
WTP(Web Tools Platform )目在eclipseq_上进行扩展,是一个开发J2EE Web应用E序的工具集?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">WTP包含以下工具Q?br />* 一个源码编辑器可以用来~辑HTML, Javascript, CSS, JSP, SQL, XML, DTD, XSD, 和WSDL?br />* 一个图形编辑器用来~辑XSD与WSDL?br />* J2EE目构徏器和一个J2EE向导工具?br />* 一个Web服务创徏向导和管理器Q和WS-I 试工具?br />* 一个数据库讉KQ查询工L?br />WTP׃个子目构成:WST(Web标准工具? 与JST(J2EE标准工具?

]]>
վ֩ģ壺 ء| ˴| ƽ| | ۲| | Ͻ| ƽ| | ݰ| Ƹ| ߶| ԣ| | º| ͨɽ| | | Դ| | | | ʯ̨| ؼ| | | | | | ͨ| ¹| | | ƽ| ٹ| | | ͺ| Ϻ| Ϫ| ʷ|