﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-初一七月-随笔分类-Java</title><link>http://www.blogjava.net/caojianhua/category/46514.html</link><description>你必须承认，我们生存的这个世界取决于自身的能力而非别人的保护(AW)</description><language>zh-cn</language><lastBuildDate>Thu, 26 Jul 2012 16:27:12 GMT</lastBuildDate><pubDate>Thu, 26 Jul 2012 16:27:12 GMT</pubDate><ttl>60</ttl><item><title>JMS规范及相关实现</title><link>http://www.blogjava.net/caojianhua/archive/2012/07/26/384095.html</link><dc:creator>初一七月</dc:creator><author>初一七月</author><pubDate>Thu, 26 Jul 2012 09:41:00 GMT</pubDate><guid>http://www.blogjava.net/caojianhua/archive/2012/07/26/384095.html</guid><wfw:comment>http://www.blogjava.net/caojianhua/comments/384095.html</wfw:comment><comments>http://www.blogjava.net/caojianhua/archive/2012/07/26/384095.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caojianhua/comments/commentRss/384095.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caojianhua/services/trackbacks/384095.html</trackback:ping><description><![CDATA[JMS是一种应用于异步消息传递的标准API，作为Java平台的一部分，JMS可以允许不同应用、不同模块之间实现可靠、异步数据通信。<br /><br /><strong>一些概念</strong><br /><div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee; "><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><br />JMS&nbsp;provider<br />&nbsp;&nbsp;&nbsp;&nbsp;An&nbsp;implementation&nbsp;of&nbsp;the&nbsp;JMS&nbsp;interface&nbsp;for&nbsp;a&nbsp;Message&nbsp;Oriented&nbsp;Middleware&nbsp;(MOM).&nbsp;Providers&nbsp;are&nbsp;implemented&nbsp;as&nbsp;either&nbsp;a&nbsp;Java&nbsp;JMS&nbsp;implementation&nbsp;or&nbsp;an&nbsp;adapter&nbsp;to&nbsp;a&nbsp;non-Java&nbsp;MOM.<br />JMS&nbsp;client<br />&nbsp;&nbsp;&nbsp;&nbsp;An&nbsp;application&nbsp;or&nbsp;process&nbsp;that&nbsp;produces&nbsp;and/or&nbsp;receives&nbsp;messages.<br />JMS&nbsp;producer/publisher<br />&nbsp;&nbsp;&nbsp;&nbsp;A&nbsp;JMS&nbsp;client&nbsp;that&nbsp;creates&nbsp;and&nbsp;sends&nbsp;messages.<br />JMS&nbsp;consumer/subscriber<br />&nbsp;&nbsp;&nbsp;&nbsp;A&nbsp;JMS&nbsp;client&nbsp;that&nbsp;receives&nbsp;messages.<br />JMS&nbsp;message<br />&nbsp;&nbsp;&nbsp;&nbsp;An&nbsp;object&nbsp;that&nbsp;contains&nbsp;the&nbsp;data&nbsp;being&nbsp;transferred&nbsp;between&nbsp;JMS&nbsp;clients.<br />JMS&nbsp;queue<br />&nbsp;&nbsp;&nbsp;&nbsp;A&nbsp;staging&nbsp;area&nbsp;that&nbsp;contains&nbsp;messages&nbsp;that&nbsp;have&nbsp;been&nbsp;sent&nbsp;and&nbsp;are&nbsp;waiting&nbsp;to&nbsp;be&nbsp;read.&nbsp;Note&nbsp;that,&nbsp;contrary&nbsp;to&nbsp;what&nbsp;the&nbsp;name&nbsp;queue&nbsp;suggests,&nbsp;messages&nbsp;don't&nbsp;have&nbsp;to&nbsp;be&nbsp;delivered&nbsp;in&nbsp;the&nbsp;order&nbsp;sent.&nbsp;A&nbsp;JMS&nbsp;queue&nbsp;only&nbsp;guarantees&nbsp;that&nbsp;each&nbsp;message&nbsp;is&nbsp;processed&nbsp;only&nbsp;once.<br />JMS&nbsp;topic<br />&nbsp;&nbsp;&nbsp;&nbsp;A&nbsp;distribution&nbsp;mechanism&nbsp;for&nbsp;publishing&nbsp;messages&nbsp;that&nbsp;are&nbsp;delivered&nbsp;to&nbsp;multiple&nbsp;subscribers.&nbsp;</div><br />在JMS中，支持两种消息模型，点对点（Point-to-point）和发布-订阅(Publish and subscribe)，这两种模式分别对应于JMS中的两种消息目标（Message Destination）:队列及主题。<br /><br />在点对点模型中，每个消息都有一个发送者和一个接收者，消息中介（broker）收到发送者的消息，会将消息放入队列中，而接收者请求并接收队列中的一条消息后，这条消息就会从队列中删除。消息队列中的每条消息只能投递给一个接收者，但并不意味着只能使用一个接收者从队列中取消息，根据业务需要，可以使用多个接收者同时从队列中请求消息，分担处理压力。但是需要注意的是，单个接收者收到的消息是按照发送顺序的，多个接收者因为多线程的关系，并不能保证收到的消息一定是原序的。<br /><br />在发布-订阅模式中，消息会发送给一个主题，但是与点对点模式不同的是消息不再只被投递给一个接收者，而是所有此主题的订阅者都会收到该消息。<br /><br /><strong>JMS消息类型<br /><br /></strong>在JMS1.1规范中，定义了五种消息类型，分别为：<br />1.StreamMessage ：消息体是 Java 流，写入和读出都是顺序的<br />2.MapMessage ：消息体包含 key-value 对， key 为 String ， value 为基本类型，可以通过迭代器访问<br />3.TextMessage ：消息体是 String<br />4.ObjectMessage ：消息体是可序列化的 Java 对象<br />5.BytesMessage ：消息体是字节数组<br /><div>可以通过 message.clearBody() 来清除消息体；但在消费端，消息体是只读的，针对消息的写操作都会抛出 MessageNotWritableException 异常</div><br /><strong>JMS消息头</strong><br /><div>所有消息的消息头都具体相同的字段，用于 JMS Client 以及 JMS Provider 对它们进行区别以及进行消息路由</div>1.JMSDestination<br /><div>消息发送的目的地（队列或主题）；创建消息时可以设置 JMSDestination ，但是在发送完成时其值会更新为发送方所指定的 JMSDestination ，也就是说发送前该字段会被忽略；当消息被消费时，该字段的值与在它被发送时被设置的值是相同的</div>以下所有示例均基于ActiveMQ<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->Session&nbsp;session&nbsp;=&nbsp;connection.createSession(<span style="color: #0000FF; ">false</span>,&nbsp;Session.AUTO_ACKNOWLEDGE);<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;创建2个目的地</span><span style="color: #008000; "><br /></span>Destination&nbsp;destination&nbsp;=&nbsp;session.createQueue("JMS.DEMO");<br />Destination&nbsp;destination2&nbsp;=&nbsp;session.createQueue("JMS.DEMO2");<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;创建生产者</span><span style="color: #008000; "><br /></span>MessageProducer&nbsp;publisher&nbsp;=&nbsp;session.createProducer(destination);<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;设置传输模式</span><span style="color: #008000; "><br /></span>publisher.setDeliveryMode(DeliveryMode.PERSISTENT);<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;创建消息</span><span style="color: #008000; "><br /></span>TextMessage&nbsp;message&nbsp;=&nbsp;session.createTextMessage("Test&nbsp;Message");<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;设置消息的目的地为destination2</span><span style="color: #008000; "><br /></span>message.setJMSDestination(destination2);<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;发送消息</span><span style="color: #008000; "><br /></span>publisher.send(message);<br /><br />System.out.println(message.getJMSDestination());</div><br /><div>代码中，通过 message.setJMSDestination(destination2); 设置了 message 的 JMSDestination 消息头属性值，我们再看看其输出结果<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->queue:<span style="color: #008000; ">//</span><span style="color: #008000; ">JMS.DEMO</span></div><br /><div>通过这个例子可以看出，虽然在发送前设置了消息的目的地，但是发送后消息的目的地被重置了</div>2.JMSDeliveryMode<br /><div>指明消息的传输模式，有两种：</div><div>DeliveryMode.PERSISTENT ：保证消息仅传一次， JMS Provider 服务停止后消息不会丢失；</div><div>DeliveryMode.NON_PERSISTENT ：消息最多传一次，消息会因 JMS Provider 停止后丢失；</div><div>同 JMSDestination 一样，在发送前设置的会被忽略</div><br />看下面的例子<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->Session&nbsp;session&nbsp;=&nbsp;connection.createSession(<span style="color: #0000FF; ">false</span>,&nbsp;Session.AUTO_ACKNOWLEDGE);<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;创建目的地</span><span style="color: #008000; "><br /></span>Destination&nbsp;destination&nbsp;=&nbsp;session.createQueue("JMS.DEMO");<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;创建生产者</span><span style="color: #008000; "><br /></span>MessageProducer&nbsp;publisher&nbsp;=&nbsp;session.createProducer(destination);<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;设置传输模式</span><span style="color: #008000; "><br /></span>publisher.setDeliveryMode(DeliveryMode.PERSISTENT);<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;发送PERSISTENT消息</span><span style="color: #008000; "><br /></span>publisher.send(session.createTextMessage("PERSISTENT&nbsp;MESSAGE"));<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;设置传输模式</span><span style="color: #008000; "><br /></span>publisher.setDeliveryMode(DeliveryMode.NON_PERSISTENT);<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;发送PERSISTENT消息</span><span style="color: #008000; "><br /></span>publisher.send(session.createTextMessage("NON_PERSISTENT&nbsp;MESSAGE"));</div><br /><div>例子中分别发送了一条 PERSISTENT 的消息和一条 NON_PERSISTENT 的消息；当 Active MQ 重启后，启动消费端，收到的消息如下<br /><div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee; "><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->PERSISTENT&nbsp;MESSAGE</div></div></div><br /><div>该例子说明，在 JMS Provider 重启后， NON_PERSISTENT 消息丢失了，而 PERSISTENT 消息能正常被消费者消费</div>3.JMSMessageID<br /><div>由 JMS Provider 指定的消息的唯一标识符；同上面的字段一样，在发送前设置的会被忽略，在发送完成时，由 JMS Provider 重置该字段<br /><br />4.JMSReplyTo</div><div>发送端在发送消息时，可以指定该属性（为一个 JMSDestination ），表示期望收到客户端的响应；是否响应由消费端决定</div><div></div><div>如下面的例子：</div><div>发送端：&nbsp;</div><div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee; "><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->Session&nbsp;session&nbsp;=&nbsp;connection.createSession(<span style="color: #0000FF; ">false</span>,&nbsp;Session.AUTO_ACKNOWLEDGE);<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;创建目的地</span><span style="color: #008000; "><br /></span>Destination&nbsp;destination&nbsp;=&nbsp;session.createQueue("JMS.DEMO");<br />Destination&nbsp;destination2&nbsp;=&nbsp;session.createQueue("JMS.DEMO3");<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;创建生产者</span><span style="color: #008000; "><br /></span>MessageProducer&nbsp;publisher&nbsp;=&nbsp;session.createProducer(destination);<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;设置传输模式</span><span style="color: #008000; "><br /></span>publisher.setDeliveryMode(DeliveryMode.PERSISTENT);<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;创建消息</span><span style="color: #008000; "><br /></span>TextMessage&nbsp;message&nbsp;=&nbsp;session.createTextMessage("Test&nbsp;Message");<br />message.setJMSReplyTo(destination2);<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;发送消息</span><span style="color: #008000; "><br /></span>publisher.send(message);</div><br /><div>接收端（可以根据情况决定是否需要回复）<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;onMessage(Message&nbsp;message)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Receive&nbsp;message:&nbsp;"&nbsp;+&nbsp;message);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(message.getJMSReplyTo()&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.createProducer(message.getJMSReplyTo()).send(session.createTextMessage("This&nbsp;is&nbsp;a&nbsp;reply&nbsp;to"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;message.getJMSReplyTo()));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(Exception&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div><br />5.JMSRedelivered<br /><div>当消费者收到带有 JMSRedelivered 的消息头时，表明该消息在过去传输过但没有被确认</div><div>JMS Provider 必须对该字段进行设置，当为 true 时即告知消费者该消息是重传的，消费者需要自行处理重复的消息</div><br />6.JMSExpiration<br /><div>消息的过期时间，其值为当前时间加上存活时间（毫秒）；当存活时间设置为 0 时，该字段的值也被设置为 0 ，表示永不过期；</div><div>消费端在一般情况下都不会接收到过期的消息，但 JMS Provider 并不保证这一点；</div><div></div><div>下面的例子说明了如何设置消息的过期时间</div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->Session&nbsp;session&nbsp;=&nbsp;connection.createSession(<span style="color: #0000FF; ">false</span>,&nbsp;Session.AUTO_ACKNOWLEDGE);<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;创建目的地</span><span style="color: #008000; "><br /></span>Destination&nbsp;destination&nbsp;=&nbsp;session.createQueue("JMS.DEMO");<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;创建生产者</span><span style="color: #008000; "><br /></span>MessageProducer&nbsp;publisher&nbsp;=&nbsp;session.createProducer(destination);<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;设置传输模式</span><span style="color: #008000; "><br /></span>publisher.setDeliveryMode(DeliveryMode.PERSISTENT);<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;创建消息</span><span style="color: #008000; "><br /></span>TextMessage&nbsp;message&nbsp;=&nbsp;session.createTextMessage("Test&nbsp;Message");<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;发送消息</span><span style="color: #008000; "><br /></span>publisher.setTimeToLive(5000);<br />publisher.send(message);</div><br />7.JMSPriority<br /><div>消息的优先级， 0 代表最低优先级， 9 代表最高优先级；一般 0~4 为普通优先级， 5~9 为加快优先级</div><div>JMS 规范里并没有要求 JMS Provider 严格按这个优先级来实现，但是尽可能实现加快优先级消息的传输在普通消息的前面</div><div>同 JMSDestination 一样，该字段在发送前被忽略，在发送完成时重置</div><br /><br /><strong>消息属性</strong><br /><br /><div>除了前面提到的消息头以外， JMS 消息还提供了对&#8220;属性值对&#8221;的支持，以对消息头进行扩展；消息属性主要用于消息选择器 (message selector 详见下文 )&nbsp;</div><br />1.属性名<br /><span style="font-size: small;">属性名必须服务消息选择器的命名规则</span><br /><br />2.属性值<br /><div>可以是基本类型及其对象类型以及 Map 、 List 和 String</div><br /><div>下面的例子中，消息带 HashMap 的属性</div><div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee; "><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->Session&nbsp;session&nbsp;=&nbsp;connection.createSession(<span style="color: #0000FF; ">false</span>,&nbsp;Session.AUTO_ACKNOWLEDGE);<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;创建目的地</span><span style="color: #008000; "><br /></span>Destination&nbsp;destination&nbsp;=&nbsp;session.createQueue("JMS.DEMO");<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;创建生产者</span><span style="color: #008000; "><br /></span>MessageProducer&nbsp;publisher&nbsp;=&nbsp;session.createProducer(destination);<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;设置传输模式</span><span style="color: #008000; "><br /></span>publisher.setDeliveryMode(DeliveryMode.PERSISTENT);<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;创建消息</span><span style="color: #008000; "><br /></span>TextMessage&nbsp;message&nbsp;=&nbsp;session.createTextMessage("Test&nbsp;Message");<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;发送消息</span><span style="color: #008000; "><br /></span>message.setObjectProperty("myProp",&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;HashMap()&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.put("key1",&nbsp;"value1");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.put("key2",&nbsp;"value2");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />});<br />publisher.send(message);</div><br />3.清除属性<br /><div>JMS 不能清除单个属性，但可以通过 Message.clearProperties() 方法清除所有消息属性</div><br /><strong>JMS实现（Provider implementations）</strong><br /><br />要使用JMS，必须要有相应的实现来管理session以及队列，从Java EE1.4开始，所有的Java EE应用服务器必须包含一个JMS实现。</div>以下是一些JMS实现：<br /><div>&nbsp; &nbsp; Apache ActiveMQ</div><div>&nbsp; &nbsp; Apache Qpid, using AMQP</div><div>&nbsp; &nbsp; BEA Weblogic (part of the Fusion Middleware suite) and Oracle AQ from Oracle</div><div>&nbsp; &nbsp; EMS from TIBCO</div><div>&nbsp; &nbsp; FFMQ, GNU LGPL licensed</div><div>&nbsp; &nbsp; JBoss Messaging and HornetQ from JBoss</div><div>&nbsp; &nbsp; JORAM, from the OW2 Consortium</div><div>&nbsp; &nbsp; Open Message Queue, from Sun Microsystems</div><div>&nbsp; &nbsp; OpenJMS, from The OpenJMS Group</div><div>&nbsp; &nbsp; RabbitMQ, using AMQP</div><div>&nbsp; &nbsp; Solace JMS from Solace Systems</div><div>&nbsp; &nbsp; SonicMQ from Progress Software</div><div>&nbsp; &nbsp; StormMQ, using AMQP</div><div>&nbsp; &nbsp; SwiftMQ</div><div>&nbsp; &nbsp; Tervela</div><div>&nbsp; &nbsp; Ultra Messaging from 29 West (acquired by Informatica)</div><div>&nbsp; &nbsp; webMethods from Software AG</div><div>&nbsp; &nbsp; WebSphere Application Server from IBM, which provides an inbuilt default messaging provider known as the Service Integration Bus (SIBus), or which can connect to WebSphere MQ as a JMS provider [5]</div><div>&nbsp; &nbsp; WebSphere MQ (formerly MQSeries) from IBM</div><br />Ref from:<br />1.http://en.wikipedia.org/wiki/Java_Message_Service<br />2.Spring in Action<br />3.http://goldendoc.iteye.com/blog/1155647<br /><img src ="http://www.blogjava.net/caojianhua/aggbug/384095.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caojianhua/" target="_blank">初一七月</a> 2012-07-26 17:41 <a href="http://www.blogjava.net/caojianhua/archive/2012/07/26/384095.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>