JMS是一U与厂商无关?APIQ用来访问消息收发系l。它
c?/font>
g
JDBC
(Java
Database
Connectivity)Q这里,JDBC 是可以用来访问许多不同关p?/font>
数据?/font>
?APIQ?JMS 则提供同样与厂商无关的访问方法,以访问消息收发服务。许多厂商目前都支持 JMSQ包?IBM ?MQSeries、BEA?Weblogic JMS service?Progress ?SonicMQQ这只是几个例子?
JMS 使您能够通过消息收发服务Q有时称为消息中介程序或路由器)从一?JMS 客户机向另一?JML 客户机发送消息。消息是 JMS 中的一U?/font>
cd
对象
Q由两部分组成:报头和消息主体。报头由路由信息以及有关该消息的
元数?/font>
l成。消息主体则携带着应用E序的数据或有效负蝲。根据有效负载的cd来划分,可以消息分为几U类型,它们分别携带Q简单文?(TextMessage)、可序列化的对象 (ObjectMessage)、属性集?(MapMessage)、字节流 (BytesMessage)、原始值流 (StreamMessage)Q还有无有效负蝲的消?(Message)?
消息收发pȝ是异步的Q也是_JMS 客户机可以发送消息而不必等待回应。比较可知,q完全不同于Z RPC 的(Zq程q程的)pȝQ如 EJB 1.1?a target="_new">CORBA ?Java RMI 的引用实现。在 RPC 中,客户用服务器上某个分布式对象的一个方法。在Ҏ调用q回之前Q该客户dQ该客户机在可以执行下一条指令之前,必须{待Ҏ调用l束。在 JMS 中,客户机将消息发送给一个虚拟通道Q主题或队列Q,而其?JMS 客户机则预订或监听这个虚拟通道。当 JMS 客户机发送消息时Q它q不{待回应。它执行发送操作,然后l箋执行下一条指令。消息可能最l{发到一个或许多个客hQ这些客h都不需要作出回应?
JMS的通用接口集合以异步方式发送或接收消息。异步方式接收消息显然是使用间断|络q接的客hQ诸如移动电话和PDA的最好的选择。另外, JMS采用一U宽杄合方式整合企业系l的ҎQ其主要的目的就是创够用跨q_数据信息的、可UL的企业应用E序Q而把开发h力解攑և来?/font>
Java消息服务支持两种消息模型QPoint-to-Point消息(P2P)和发布订阅消息(Publish Subscribe messagingQ简UPub/SubQ?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS规范q不要求供应商同时支持这两种消息模型Q但开发者应该熟悉这两种消息模型的优势与~点?/font>
P2P消息模型是在点对点之间传递消息时使用。如果应用程序开发者希望每一条消息都能够被处理,那么应该使用P2P消息模型。与Pub/Sub消息模型不同QP2P消息L能够被传送到指定的位|?/font>
Pub/Sub模型在一到多的消息广播时使用。如果一定程度的消息传递的不可靠性可以被接受的话Q那么应用程序开发者也可以使用Pub/Sub消息模型。换句话_它适用于所有的消息消费E序q不要求能够收到所有的信息或者消息消费程序ƈ不想接收CQ何消息的情况?/font>
JMS通过允许创徏持久订阅来简化时间相x,即消息预订者未ȀzM可以接收到消息。此外,使用持久订阅q可通过队列提供灉|性和可靠性,而仍然允许消息被发给许多的接收者?Topic Subscriber topic Subscriber = topicSession.createDurableSubscriber(topic, subscriptionName); Connection对象表示了到两种消息模型中的MU的消息pȝ的连接。服务器端和客户机端对象要求理创徏?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMSq接的状态。连接是由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>
如果session被标Cؓtransactional的话Q确认消息就通过认和校正来自动地处理。如果session没有标记?transactionalQ你有三个用于消息确认的选项?/font>
· AUTO_ACKNOWLEDGE session自动地认收到一则消息?/font>
· CLIENT_ACKNOWLEDGE 客户?/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
注意Q在本例中,一个session目的从连l中创徏Q非值指出session是non-transactional的,q且 session自动地认收到一则消息?/font>
JMS现在有两U传递消息的方式。标CؓNON_PERSISTENT的消息最多投递一ơ,而标CؓPERSISTENT的消息将使用暂存后再转送的机理投递。如果一?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS服务ȝQ那么持久性消息不会丢׃是得{到q个服务恢复联机时才会被传递。所以默认的消息传递方式是非持久性的。即使用非持久性消息可能降低内务和需要的存储器,q且q种传递方式只有当你不需要接收所有的消息时才使用?/font>
虽然 JMS规范q不需?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS供应商实现消息的优先U\U,但是它需要递送加快的消息优先于普通别的消息?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS定义了从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">度量 )。如果生存周期设|ؓӞq则消息永q不会过期。当消息需要时间限制否则将使其无效Ӟ讄生存周期是有用的?/font>
JMS定义了五U不同的消息正文格式Q以及调用的消息cdQ允怽发送ƈ接收以一些不同Ş式的数据Q提供现有消息格式的一些别的兼容性?/font>
· StreamMessage -- Java原始值的数据?
· MapMessage--一套名U?值对
· TextMessage--一个字W串对象
· ObjectMessage--一个序列化?Java对象
· BytesMessage--一个未解释字节的数据流
JMS应用E序接口提供用于创徏每种cd消息和设|荷载的Ҏ例如Qؓ了在一个队列创建ƈ发送一个TextMessage实例Q你可以使用下列语句Q?TextMessage message = queueSession.createTextMessage(); message.setText(textMsg); 以异步方式接收消息,需要创Z个消息监听器然后注册一个或多个使用MessageConsumer?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS MessageListener接口。会?主题或队?负责产生某些消息Q这些消息被传送到使用onMessageҎ的监听者那里?import javax.jms.*; public class 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
当一条消息被捕捉Ӟ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序逻辑 }
停止消息的传递,无论是Pub/Subq是P2PQ都调用stopҎ?TopicConnection.start( ); //pub-sub QueueConnection.start( ); //P2P TopicConnection.start ( );// pub-sub QueueConnection.start ( );// P2P 其他?a target="_new">J2EElg--servlet或EJB--可以当作消息生者;然而,它们可能只能同步操作Q这可能是因为它们的h-应答的性质军_的。虽?a target="_new">XML目前q不是被支持的消息类型,发送一个XML文g和创Z条文本类型消息以及把XML文gd到消息的有效负蝲都一L单,都是以非专有的方式传送数据。值得注意的是Q一?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS供应厂商已经提供了可用的XML消息cd。但是用非标准的消息类型可能会出现可移植性问题?String reportData; //reportData内容为XML 文 TextMessage message; message = session.createTextMessage(); message.setText (reportData);
消息驱动lg(MDB)是一个当消息到达时被容器调用的异步消息消费程序。和entity和session EJB不同QMDB没有本地和远E接口ƈ且是匿名的;它们对于客户是不可见的。MDB?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMSpȝ的一部分Q作为消费者实现服务器上的商业逻辑E序?一个客L序可能通过使用JNDI定位一个与MDB相关联的JMS?例如Q?Context initialContext = new InitialContext(); Queue reportInfoQueue = (javax.jms.Queue)initialContext.lookup (“java:comp/env/jms/reportInfoQueue?; MDB是由Beancd相应的XML部v描述W组成?Bean cd现MessageDriveBean 接口Q?import javax.ejb.*; import jms.Message.*; public interface MessageDriveBean { public void ejbCreate(); public void ejbRemove(); public void setMessageDrivenContext(MessageDrivenContext ctx); } 消息监听器接口: import javax.jms.*; public interface MessageListener { public void onMessage( ); }
部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-destination-typeQjavax.jms.QueueQ?jms-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>
既然我们现在已经有了一些基本的JMS知识Q那么我们可以?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS做什么呢QQ何事情都可以?/font>
例如Q分别用于销售、库存、客h务和账目处理的系l。这些部门之间的pȝ很可能已l存在了很长旉Q这些处理要求把事务Ud到系l中去,qƈ不是一个小的工作。这是消息服务适用的地炏V?/font>
当售货员完成销售的时候,一条消息被发给库存pȝQ一旦订单消息发送给收发货h员,可以按照订单出货了。当订单成功地发货,pȝ通知֮服务和会计系l这个订单已l成功的交易了。所有对应的每个子系l?/a>都自动地Ҏ收到的消息进行更新?/font>
JMS一般都不是用来整合一个系l,而是整合许多可能参与消息驱动环境的系l?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS是一个用于开发和集成企业应用E序的重要的工具。因多公叔R有以前遗留下来的pȝ和新q开发的pȝl合h的系l,消息的用是整合整个企业的重要的步骤?
JMS接口描述
JMS 支持两种消息cdPTP 和Pub/SubQ分别称作:PTP Domain 和Pub/Sub DomainQ这两种接口都承统一?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS Parent 接口Q?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS 主要接口如下所C:
JMS Parent | PTPDomain | Pub/Sub Domain |
ConnectionFactory | QueueConnectionFactory | TopicConnectionFactory |
Connection | QueueConnection | TopicConnection |
Destination | Queue | Topic |
Session | QueueSession | TopicSession |
MessageProducer | QueueSender | TopicPublisher |
MessageConsumer | QueueReceiver,QueueBrowser | TopicSubscriber |
以下是对q些接口的简单描qͼ
ConnectionFactory Q连接工厂,JMS 用它创徏q接
Connection Q?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS 客户端到JMS Provider 的连?br /> Destination Q消息的目的?br /> SessionQ?一个发送或接收消息?a target="_new">U程
MessageProducerQ?由Session 对象创徏的用来发送消息的对象
MessageConsumerQ?由Session 对象创徏的用来接收消息的对象
JMS消息模型
JMS 消息׃下几部分l成Q消息头Q属性,消息体?/font>
消息?Header) - 消息头包含消息的识别信息和\׃息,消息头包含一些标准的属性如QJMSDestination,JMSMessageID {?
消息?/i>
p讄
JMSDestination
send ?publish Ҏ
JMSDeliveryMode
send ?publish Ҏ
JMSExpiration
send ?publish Ҏ
JMSPriority
send ?publish Ҏ
JMSMessageID
send ?publish Ҏ
JMSTimestamp
send ?publish Ҏ
JMSCorrelationID
客户
JMSReplyTo
客户
JMSType
客户
JMSRedelivered
JMS Provider
属?Properties) - 除了消息头中定义好的标准属性外Q?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS 提供一U机制增加新属性到消息头中Q这U新属性包含以下几U:
1. 应用需要用到的属?
2. 消息头中原有的一些可选属?
3. JMS Provider 需要用到的属性?br /> 标准?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS 消息头包含以下属性:
JMSDestination --消息发送的目的?
JMSDeliveryMode --传?a target="_new">模式Q?有两U模式: PERSISTENT 和NON_PERSISTENTQPERSISTENT 表示该消息一定要被送到目的圎ͼ否则会导致应用错误。NON_PERSISTENT 表示偶然丢失该消息是被允许的Q这两种模式使开发者可以在消息传递的可靠性和吞吐量之间找到^衡点?br /> JMSMessageID 唯一识别每个消息的标识,?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS Provider 产生?br /> JMSTimestamp 一个消息被提交l?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS 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 style="COLOR: black; BACKGROUND-COLOR: #ffff66">JMS Provider 严格按照q十个优先发送消息,但必M证加急消息要先于普通消息到达?/font>
消息?Body) - JMS API 定义?U消息体格式Q也叫消息类型,你可以用不同Ş式发送接收数据ƈ可以兼容现有的消息格式,下面描述q?U类型:
消息cd | 消息?/i> |
TextMessage | java.lang.String对象Q如xml文g内容 |
MapMessage | ?值对的集合,名是String对象Q值类型可以是JavaM基本cd |
BytesMessage | 字节?/td> |
StreamMessage | Java中的输入输出?/td> |
ObjectMessage | Java中的可序列化对象 |
Message | 没有消息体,只有消息头和属性?/td> |
TextMessage message = queueSession.createTextMessage(); message.setText(msg_text); // msg_text is a String queueSender.send(message);
Message m = queueReceiver.receive(); if (m instanceof TextMessage) { TextMessage message = (TextMessage) m; System.out.println("Reading message: " + message.getText()); } else { // Handle error }
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>
|
|
|