前面讲过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区分。
/**
*
*/
package correlation;
import javax.jms.Connection;
import javax.jms.DeliveryMode;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQQueue;
/**
* @author Wang Sheng(Josh)
*
*/
public class JMSCorrelationTest {
private Queue queue;
private Session session;
public JMSCorrelationTest() throws JMSException {
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory();
Connection connection = factory.createConnection();
connection.start();
queue = new ActiveMQQueue("JoshCorrelationQueue");
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 {
// Create a receiver will receive its message
MessageConsumer consumer = session.createConsumer(queue, "receiver = '" + name +"'");
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
try {
MessageProducer producer = session.createProducer(queue);
System.out.println(name + "get: " + ((TextMessage)message).getText());
// reply the message
Message replyMessage = session.createTextMessage("Reply from " + name);
// Set JMSCorrelationID is the receive message's Id
replyMessage.setJMSCorrelationID(message.getJMSMessageID());
// producer.send(message); // this will cause producer won't receive the reply message
producer.send(replyMessage);
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
private void setupProducer(final String name, String consumerName) throws JMSException {
MessageProducer producer = session.createProducer(queue);
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
// Create a message and set a property:receiver with the value consumer name
Message message = session.createTextMessage("Message from: " + name);
message.setStringProperty("receiver", consumerName);
producer.send(message);
// wait the reply 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 JMSCorrelationTest();
}
}
简图如下:
生产者A-----发送----〉消费者A-----回复------〉生产者A
生产者B-----发送----〉消费者B-----回复------〉生产者B
生产者C-----发送----〉消费者C-----回复------〉生产者C
需要注意的是,所有的发送和回复都使用同一个Queue,通过Selector区分。
/**
*
*/
package correlation;
import javax.jms.Connection;
import javax.jms.DeliveryMode;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQQueue;
/**
* @author Wang Sheng(Josh)
*
*/
public class JMSCorrelationTest {
private Queue queue;
private Session session;
public JMSCorrelationTest() throws JMSException {
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory();
Connection connection = factory.createConnection();
connection.start();
queue = new ActiveMQQueue("JoshCorrelationQueue");
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 {
// Create a receiver will receive its message
MessageConsumer consumer = session.createConsumer(queue, "receiver = '" + name +"'");
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
try {
MessageProducer producer = session.createProducer(queue);
System.out.println(name + "get: " + ((TextMessage)message).getText());
// reply the message
Message replyMessage = session.createTextMessage("Reply from " + name);
// Set JMSCorrelationID is the receive message's Id
replyMessage.setJMSCorrelationID(message.getJMSMessageID());
// producer.send(message); // this will cause producer won't receive the reply message
producer.send(replyMessage);
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
private void setupProducer(final String name, String consumerName) throws JMSException {
MessageProducer producer = session.createProducer(queue);
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
// Create a message and set a property:receiver with the value consumer name
Message message = session.createTextMessage("Message from: " + name);
message.setStringProperty("receiver", consumerName);
producer.send(message);
// wait the reply 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 JMSCorrelationTest();
}
}