惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Help Net Security
Help Net Security
G
Google Developers Blog
雷峰网
雷峰网
WordPress大学
WordPress大学
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Engineering at Meta
Engineering at Meta
Security Latest
Security Latest
T
Threat Research - Cisco Blogs
AWS News Blog
AWS News Blog
F
Full Disclosure
C
Cybersecurity and Infrastructure Security Agency CISA
T
The Exploit Database - CXSecurity.com
J
Java Code Geeks
U
Unit 42
C
Cyber Attacks, Cyber Crime and Cyber Security
V
V2EX
C
Cisco Blogs
博客园 - 司徒正美
Project Zero
Project Zero
L
LINUX DO - 热门话题
阮一峰的网络日志
阮一峰的网络日志
Blog — PlanetScale
Blog — PlanetScale
Scott Helme
Scott Helme
A
About on SuperTechFans
Hugging Face - Blog
Hugging Face - Blog
S
Securelist
小众软件
小众软件
aimingoo的专栏
aimingoo的专栏
S
Schneier on Security
G
GRAHAM CLULEY
酷 壳 – CoolShell
酷 壳 – CoolShell
Cyberwarzone
Cyberwarzone
MongoDB | Blog
MongoDB | Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 叶小钗
T
Threatpost
Recorded Future
Recorded Future
C
CXSECURITY Database RSS Feed - CXSecurity.com
宝玉的分享
宝玉的分享
N
News and Events Feed by Topic
人人都是产品经理
人人都是产品经理
The Register - Security
The Register - Security
S
Security Archives - TechRepublic
博客园 - Franky
N
News | PayPal Newsroom
Simon Willison's Weblog
Simon Willison's Weblog
S
SegmentFault 最新的问题
W
WeLiveSecurity
A
Arctic Wolf
B
Blog

博客园 - wolfman

正则表达式Pattern 字符串分割成一维数组、二维数组,一维数组与二维数组之间的转换 ActiveMQ在C#中的应用 深入掌握JMS(十二):MDB 深入掌握JMS(十一):TemporaryQueue和TemporaryTopic 深入掌握JMS(九):Selector 深入掌握JMS(八):JMSReplyTo 深入掌握JMS(七):DeliveryMode例子 深入掌握JMS(六):消息头 深入掌握JMS(四):实战Queue 深入掌握JMS(五):实战Topic 深入掌握JMS(三):MessageListener 深入掌握JMS(二):一个JMS例子 深入掌握JMS(一):JSM基础 oracle 分区表(转) Application,Session,Cookie,ViewState,Cache的区别(转) 网络编程基础 VS2008+Oracle92 网站发布注意问题 Windows Service开发应用
深入掌握JMS(十):JMSCorrelationID与Selector
wolfman · 2010-06-12 · via 博客园 - wolfman

前面讲过JMSCorrelationID主要是用来关联多个Message,例如需要回复一个消息的时候,通常把回复的消息的
           JMSCorrelationID设置为原来消息的ID。在下面这个例子中,创建了三个消息生产者A,B,C和三个消息消费者A,B,C。生产者A给消费者A发送一个消息,同时需要消费者A给它回复一个消息。B、C与A类似。
               简图如下:
                  生产者A-----发送----〉消费者A-----回复------〉生产者A
                   生产者B-----发送----〉消费者B-----回复------〉生产者B
                   生产者C-----发送----〉消费者C-----回复------〉生产者C
               需要注意的是,所有的发送和回复都使用同一个Queue,通过Selector区分。

           import javax.jms.*;
           import org.apache.activemq.ActiveMQConnectionFactory;
           import org.apache.activemq.command.ActiveMQQueue;

           public class JMSCorrelationIDTest {
               private Queue queue;
               private Session session;
               public JMSCorrelationIDTest() throws JMSException{
                   ActiveMQConnectionFactory factory = new
           ActiveMQConnectionFactory("vm://localhost");
                   Connection connection = factory.createConnection();
                   connection.start();
                   queue = new ActiveMQQueue("testQueue");
                   session = connection.createSession(false,
           Session.AUTO_ACKNOWLEDGE);
                   setupConsumer("ConsumerA");
                   setupConsumer("ConsumerB");
                   setupConsumer("ConsumerC");
                   setupProducer("ProducerA", "ConsumerA");
                   setupProducer("ProducerB", "ConsumerB");
                   setupProducer("ProducerC", "ConsumerC");
               }
               private void setupConsumer(final String name) throws
           JMSException {
                   //创建一个消费者,它只接受属于它自己的消息
                   MessageConsumer consumer = session.createConsumer(queue,
           "receiver='" + name + "'");
                   consumer.setMessageListener(new MessageListener(){
                       public void onMessage(Message m) {
                           try {
                               MessageProducer producer =
           session.createProducer(queue);
                               System.out.println(name + " get:" +
           ((TextMessage)m).getText());
                               //回复一个消息
                               Message replyMessage =
           session.createTextMessage("Reply from " + name);
                               //设置JMSCorrelationID为刚才收到的消息的ID
           replyMessage.setJMSCorrelationID(m.getJMSMessageID());
                               producer.send(replyMessage);
                           } catch (JMSException e) { }
                       }
                   });
               }

               private void setupProducer(final String name, String
           consumerName) throws JMSException {
                   MessageProducer producer = session.createProducer(queue);
                   producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
                   //创建一个消息,并设置一个属性receiver,为消费者的名字。
                   Message message = session.createTextMessage("Message from "
           + name);
                   message.setStringProperty("receiver", consumerName);
                   producer.send(message);
                   //等待回复的消息
                   MessageConsumer replyConsumer =
           session.createConsumer(queue, "JMSCorrelationID='" +
           message.getJMSMessageID() + "'");
                   replyConsumer.setMessageListener(new MessageListener(){
                       public void onMessage(Message m) {
                           try {
                               System.out.println(name + " get reply:" +
           ((TextMessage)m).getText());
                           } catch (JMSException e) { }
                       }
                   });
               }
               public static void main(String[] args) throws Exception {
                   new JMSCorrelationIDTest ();
               }
           }

           运行结果为:
           ConsumerA get:Message from ProducerA
           ProducerA get reply:Reply from ConsumerA
           ConsumerB get:Message from ProducerB
           ProducerB get reply:Reply from ConsumerB
           ConsumerC get:Message from ProducerC
           ProducerC get reply:Reply from ConsumerC