前面讲过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
分享到:
相关推荐
在JMS Selector解析器的设计中,采用了两遍解析的策略,这是为了提高性能和效率。第一遍解析通常是对选择器字符串进行语法分析,检查其语法是否正确,并将其转换为抽象语法树(AST,Abstract Syntax Tree)。这个...
在Android开发中,按钮(Button)的样式设计是界面交互中的重要组成部分。...熟练掌握这一技巧,可以让你的App界面更具有吸引力和用户体验。实践中,你可以根据实际需求调整状态和颜色,创造出更多个性化的按钮效果。
本文将深入探讨如何通过自定义Selector实现在RocketMQ中进行消息通道定向的发送和拉取。 在RocketMQ中,Selector是用于过滤和选择消息的关键组件,它允许消费者根据特定的条件从队列中选择要消费的消息。默认的...
总的来说,JMS是构建高可用、分布式系统的重要工具,理解和掌握JMS对于提升Java开发者在企业级应用开发中的能力至关重要。通过深入学习和实践,我们可以更好地利用JMS来解决复杂系统的异步通信问题。
在simulink上进行BusCreator和BusSelector的简单实验
本教程将深入探讨Android中的Selector及其使用方法,通过一个完整的Demo来帮助你理解和掌握这个核心概念。 首先,我们需要了解Selector的基本结构。一个Selector通常是一个XML文件,位于项目的res/drawable目录下。...
在插件使用方面,file_selector插件可以方便地实现文件选择功能,支持多选和所有类型的文件,并且在选择文件后可以获取到文件的路径和其他信息。 在使用file_selector插件时,需要注意以下几点: 在Android系统中...
通过查看和分析源代码,我们可以学习如何将iconfont与selector结合,以及如何在实际项目中应用这一技术。 总的来说,"iconFont 实现selector的Demo"是一个实用的案例,它展示了如何利用阿里巴巴的iconfont服务来...
通过深入学习和理解Selector机制,开发者可以有效地设计和实现高性能的服务器应用,比如网络服务器、聊天服务器等,充分利用系统资源,提高并发处理能力。结合实际项目需求,合理运用Java NIO的Selector机制,可以...
本教程将详细介绍如何使用Selector来设置Button在可用和不可用状态下的样式,以提高应用的视觉效果和交互性。 Selector在Android中是一种基于状态的选择器,它可以为不同状态下的View定义不同的样式。它允许开发者...
Java消息服务(Java Message Service,简称JMS)是Java平台中用于企业级应用集成的API,主要用于在...通过下载并研究"JMS1.1规范(中文).pdf",开发者可以深入理解JMS的工作原理,提高其在企业级应用开发中的实践能力。
JavaSelector在Java NIO(非阻塞I/O)中扮演着关键角色,它允许程序...为了深入了解Java Selector的并发测试,需要查看`src`目录下的源代码,分析其中的`Selector`、`SelectionKey`和`SelectableChannel`的使用情况。
描述中提到的"Selector"可能是在讨论与字体相关的选择器,这可能是关于如何在CSS中控制文本的样式和显示方式。CSS中的字体选择器允许开发者指定页面上文字的字体家族、大小、颜色、行高、对齐方式等属性。 标签...
SelectorGadget插件与R语言的结合,使得网页数据抓取变得更加便捷和高效。通过熟练掌握这一技巧,你可以轻松应对各种网页结构,从中获取丰富的数据资源,为数据分析和挖掘提供强大支持。 总结来说,SelectorGadget...
SelectorGadget是一款强大的Chrome浏览器插件,主要用于网页元素选择,特别是在网页抓取和网络爬虫领域发挥着重要作用。它的设计目标是简化CSS选择器的创建和测试,使得开发者和数据挖掘者能更轻松地定位和选取网页...
SelectorGadget是一款强大的浏览器插件,专为网页开发者和设计师设计,主要功能是自动化生成CSS选择器。在网页开发过程中,我们经常需要精确地定位HTML元素以便进行样式修改或JavaScript操作,而SelectorGadget则能...
值得注意的是,虽然这个库简化了开发流程,但仍然需要理解Selector的基本概念,以便正确配置和使用。例如,了解如何定义不同状态的效果,以及如何与View的状态关联。同时,合理地运用此库可以提高代码的可读性和可...
通过查看该项目的源代码,开发者可以更深入地了解Selector的用法和实现细节,例如如何创建自定义的Selector,如何动态改变Selector状态等。对于初学者来说,这是一个很好的学习资源,可以帮助他们理解并熟练运用...
### JMS规范详解 #### 一、JMS基础概览 **1.1 何为JMS(Java Message Service)?** JMS,即Java消息服务,是Java平台中的...通过对JMS规范的深入理解,开发者能够更有效地利用其特性,实现高效、可靠的消息通信。
在Laravel框架中,开发一个名为"selector"的组件,我们可以深入理解其背后的原理和应用场景。选择器模式(Selector Pattern)是一种设计模式,它允许在运行时动态地选择算法或行为,提供了一种灵活的方式来应对多态...