本文转自:
http://blog.csdn.net/iamfafa/article/details/6265357
前面讲过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.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;
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
分享到:
相关推荐
我这样做是因为 :P_button_selector: :registered::O_button_(blood_type)::copyright::registered::A_button_(blood_type): :heavy_dollar_sign: :heavy_plus_sign: :information_selector: :Leo: :A_button_...
:warning_selector: 不再支持该项目。 :warning_selector: bigSlide是一个很小的jQuery(压缩后约为1kb)插件,用于创建屏幕外的幻灯片面板导航。 它将滑动导航面板以及给定.push类(或您在设置中选择的类)的所有...
:sun_selector: :sun_behind_small_cloud: :cloud_with_lightning_and_rain: :snowflake_selector: 使用React,Redux,TypeScript,Webpack4,Ant Design,ECharts和firebase的天气Web应用程序。目录介绍该项目演示...
JMS Selector是JMS中一个重要的概念,它是用来过滤消息的表达式,允许消费者只接收符合特定条件的消息。Selector解析器是处理这些选择器的关键组件。 在JMS Selector解析器的设计中,采用了两遍解析的策略,这是...
-[AppDelegate setWindow:]: unrecognized selector sent to instance 0x60000002b440 修改方法: 在AppDelegate.h里加声明window @property (nonatomic, strong) UIWindow * window; 运行问题解决 兼容13和13以前...
:warning_selector: :warning_selector: :warning_selector: :warning_selector: :warning_selector: :warning_selector: :warning_selector: :warning_selector: :warning_selector: :warning_selector: :warning_...
:joystick_selector: 这是游戏开发学习的资料库 :video_game: :joystick_selector: 第一步:游戏开发 :alien_monster: 游戏设计文件(GDD) 原型提示 发展历程 测试 验证方式 :joystick_selector: 第二步:专业...
2. **路由与过滤**:`:envelope_selector:`可能用于实现消息的智能路由和过滤,确保消息到达正确的目的地。 3. **API设计**:httpMQ可能会提供一套RESTful API,以便于开发者通过HTTP请求发送和接收消息。 4. **安全...
标题中的"函数式反应终端在c++:high_voltage::keyboard_selector:"揭示了我们要讨论的核心概念——函数式反应编程(Functional Reactive Programming, FRP)在C++中的应用,具体到一个名为`high_voltage::keyboard_...
:warning_selector: :warning_selector: :warning_selector: :warning_selector: :warning_selector: :warning_selector: :warning_selector: :warning_selector: :warning_selector: :warning_selector: :warning_...
不和谐杂草我的兄弟们,一个抽了一些笨蛋杂草的机器人! 它也会告诉你你有多高。 很好吗? xd甚至可以将杂草图片从#weedpics文字频道上传至Dropbox,圣洁的莫莉我从获得了灵感要求为了使自己的,您将需要: discord....
:airplane_selector: 仅使用代理提升电报视图 安装 pip install -U teleboost 用法 python -m teleboost 作者 :bust_in_silhouette: in 网站: : : :bust_in_silhouette: 伊尔贝根 : :handshake: 贡献 ...
因此,`bin-master`可能包含`:wastebasket_selector:`脚本的可执行版本,或者是与之相关的其他脚本和工具。 详细知识点: 1. **变量**:Bash支持环境变量、位置参数、局部变量等,用于存储和传递数据。 2. **...
:red_heart_selector: :red_heart_selector: :smiling_face_with_halo: :smiling_face_with_heart-eyes: :sign_of_the_horns: :red_heart_selector: :red_heart_selector: 描述 Swift中的SVG 使用来自XML解析器 ...
AWS的项目要点::cloud_selector:AWS总结要点
标题"点文件::keyboard_selector:"可能指的是一个关于如何在Vim编辑器中自定义键盘映射(keyboard mapping)的教程或者项目。在Vim中,`:keyboard_selector`可能是一个工具或脚本,用于选择和管理不同的键盘布局或...
reason-ethereum::alembic_selector:实验性以太坊客户端
shield.cr::warning_selector:不可用-Crystal Concept密码生成器
:comet_selector: 简约的零配置GraphQL服务器在CodeSandbox上查看演示: ://codesandbox.io/s/k3qrkl8qlv包含什么? Graphpack允许您使用零配置创建GraphQL服务器。 它在使用带有和 ,因此我们可以立即使用Live ...
:satellite_selector: 天气应用。 使用创建以与和交互。 是具有以下功能的网站: 调用开放天气API。 对于那些想要查找天气预报数据的人(无论是5天甚至16天的当前天气预报), 简单,清晰且免费。 还有其他可用...