(十):JMSCorrelationID与Selector

本文介绍如何利用JMSCorrelationID实现消息的发送与回复功能。通过具体实例展示了如何配置生产者与消费者,使用同一队列进行交互,并通过选择器区分不同消息流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前面讲过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();

}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值