作者:iamfafa

     前面讲过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区分。

 

[java] view plain copy

  1. import javax.jms.Connection;  

  2. import javax.jms.DeliveryMode;  

  3. import javax.jms.JMSException;  

  4. import javax.jms.Message;  

  5. import javax.jms.MessageConsumer;  

  6. import javax.jms.MessageListener;  

  7. import javax.jms.MessageProducer;  

  8. import javax.jms.Queue;  

  9. import javax.jms.Session;  

  10. import javax.jms.TextMessage;  

  11.   

  12. import org.apache.activemq.ActiveMQConnectionFactory;  

  13. import org.apache.activemq.command.ActiveMQQueue;  

  14.   

  15. public class JMSCorrelationIDTest {  

  16.     private Queue queue;  

  17.     private Session session;  

  18.   

  19.     public JMSCorrelationIDTest() throws JMSException {  

  20.         ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("vm://localhost");  

  21.         Connection connection = factory.createConnection();  

  22.         connection.start();  

  23.         queue = new ActiveMQQueue("testQueue");  

  24.         session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);  

  25.         setupConsumer("ConsumerA");  

  26.         setupConsumer("ConsumerB");  

  27.         setupConsumer("ConsumerC");  

  28.         setupProducer("ProducerA""ConsumerA");  

  29.         setupProducer("ProducerB""ConsumerB");  

  30.         setupProducer("ProducerC""ConsumerC");  

  31.     }  

  32.   

  33.     private void setupConsumer(final String name) throws JMSException {  

  34.         // 创建一个消费者,它只接受属于它自己的消息  

  35.         MessageConsumer consumer = session.createConsumer(queue, "receiver='" + name + "'");  

  36.         consumer.setMessageListener(new MessageListener() {  

  37.             public void onMessage(Message m) {  

  38.                 try {  

  39.                     MessageProducer producer = session.createProducer(queue);  

  40.                     System.out.println(name + " get:" + ((TextMessage) m).getText());  

  41.                     // 回复一个消息  

  42.                     Message replyMessage = session.createTextMessage("Reply from " + name);  

  43.                     // 设置JMSCorrelationID为刚才收到的消息的ID  

  44.                     replyMessage.setJMSCorrelationID(m.getJMSMessageID());  

  45.                     producer.send(replyMessage);  

  46.                 } catch (JMSException e) {  

  47.                 }  

  48.             }  

  49.         });  

  50.     }  

  51.   

  52.     private void setupProducer(final String name, String consumerName)  

  53.             throws JMSException {  

  54.         MessageProducer producer = session.createProducer(queue);  

  55.         producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);  

  56.         // 创建一个消息,并设置一个属性receiver,为消费者的名字。  

  57.         Message message = session.createTextMessage("Message from " + name);  

  58.         message.setStringProperty("receiver", consumerName);  

  59.         producer.send(message);  

  60.         // 等待回复的消息  

  61.         MessageConsumer replyConsumer = session.createConsumer(queue,"JMSCorrelationID='" + message.getJMSMessageID() + "'");  

  62.         replyConsumer.setMessageListener(new MessageListener() {  

  63.             public void onMessage(Message m) {  

  64.                 try {  

  65.                     System.out.println(name + " get reply:" + ((TextMessage) m).getText());  

  66.                 } catch (JMSException e) {  

  67.                 }  

  68.             }  

  69.         });  

  70.     }  

  71.   

  72.     public static void main(String[] args) throws Exception {  

  73.         new JMSCorrelationIDTest();  

  74.     }  

  75. }  

 

运行结果为:
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


欢迎访问肖海鹏老师的课程中心:http://edu.51cto.com/lecturer/user_id-10053053.html

欢迎加入肖海鹏老师技术交流群:2641394058(QQ)