前面讲过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相关的硕士学位论文的研究方向及主要内容。JMS(Java Message ...通过对这些论文的学习和研究,可以全面了解JMS技术的最新发展动态及其在企业级应用中的重要作用。
同时,ActiveMQ具备良好的Spring框架支持,运行速度快,性能比JBossMQ高出十倍,并且有Apache社区的强大支持,这意味着它拥有持续发展的潜力。 下载和安装ActiveMQ非常简单,可以从官方网站...
7. **JMS路由**:《JBoss_ESB学习笔记9——第八个ESB应用JMS_Router.doc》和《JBoss_ESB学习笔记10——第九个ESB应用JMS_Topic.doc》涉及到了JMS(Java Message Service)在ESB中的应用,讲解了如何利用ESB进行消息...
WebLogic的主要功能包括:应用服务器、JMS消息队列、数据源管理、集群支持、安全管理、监控和诊断工具等。 二、WebLogic安装与配置 学习资料中可能包含WebLogic的安装步骤,包括下载、安装、配置环境变量等。配置...
- **重点**:学习如何使用JMS Router组件实现消息路由。 - **实现**:配置JMS Router,使其能够根据规则将消息路由到不同的目的地。 #### 十、第九个ESB应用JMS Topic - **重点**:使用JMS Topic组件实现发布订阅...
在本篇博客“JEE、Spring、Spring MVC、MyBatis 学习(十)”中,作者深入探讨了这四个关键的Java企业级开发技术,它们是构建现代Web应用程序的基础。下面将对这些技术进行详细阐述。 1. JEE(Java Enterprise ...
十、JMS(Java Message Service) JMS是Java的消息中间件标准,用于异步消息传递和解耦应用程序。 通过这个J2EE学习课件,学习者可以系统地了解并掌握这些核心概念,逐步提升在企业级应用开发中的技能。深入学习...
- 通过阅读源代码和文档,可以学习到如何配置JMS连接、创建生产者和消费者、处理不同类型的JMS消息等。 总结,JMS在移动运营商的基础设施中扮演了关键角色,它提供了高效、可靠的消息传递机制,以支持各种业务操作...
熟悉JNDI、JMS、JTA/JTS、JMX、JavaMail等J2EE技术,对于构建企业级应用和服务至关重要。 #### 十四、企业级JavaBeans(EJB) 最后,深入理解EJB(Stateless/Stateful Session Bean、Message-Driven Bean)的组件模式...
WebLogic是Oracle公司的一款...通过这十个部分的学习,无论你是初入Java世界还是已有一定经验的开发者,都能从这套"WebLogic视频教程"中收获丰富的知识,提升自己的技能水平,为成为专业的Java EE开发者奠定坚实基础。
- **JMS**:掌握Java Message Service,学会使用JMS进行消息传递。 - **JTA/JTS**:了解Java Transaction API/Java Transaction Service,学会使用JTA进行事务管理。 - **JMX**:掌握Java Management Extensions,...
以下是对标题“java的三十个目标”中所提及的一些主要学习目标的详细解释: 1. **面向对象编程**:理解 OOA/OOD(面向对象分析与设计),熟悉设计模式,如 GOF 模式和 J2EE 设计模式,以及 UML(统一建模语言)的...
【标题】"我的j2EE成功之路源码第十一章"揭示了作者在学习和实践j2EE技术过程中积累的宝贵经验。j2EE(Java 2 Platform, Enterprise Edition),是Oracle公司推出的用于构建企业级分布式应用的Java平台。本章节的...
熟悉Java EE标准,包括JNDI、JMS、JTA/JTS、JMX等服务接口,以及使用Tomcat、Resin、JRun等Web容器部署Web应用,是成为一名合格的Java企业级开发者不可或缺的技能。 ### 八、XML与Web服务 学习XML相关API,如JAXP...
- **JTA/JMS**:理解Java事务服务(JTA)与Java消息服务(JMS)的概念及应用场景。 #### 十、面向服务体系(SOA) - **设计模式**:学习常用的设计模式,如工厂模式、策略模式等。 - **面向对象分析与设计**:掌握面向...
5. **Java EE组件**:包括JNDI(Java Naming and Directory Interface)用于服务查找,EJB(Enterprise JavaBeans)用于构建可部署的服务器端组件,JMS(Java Message Service)用于异步通信,以及JTA(Java ...
Java EE(Enterprise Edition)提供了许多企业级开发组件,如EJB(Enterprise JavaBeans)、JMS(Java Message Service)和JPA(Java Persistence API)。学习这些技术可以构建更复杂的应用,如分布式系统、消息队列...
20. **第二十章:JMS消息队列** - 通过Java Message Service(JMS)进行消息传递,实现应用间的解耦。 21. **第二十一章:缓存技术** - 如何使用Ehcache、Redis等缓存技术提高Web应用性能。 22. **第二十二章:...
Java企业版(Java EE)是用于开发企业级应用的平台,包括Servlet、JSP、EJB、JMS等技术,提供了Web服务器和应用服务器的开发框架。 以上只是Java基础知识的冰山一角,实际的学习过程中,还会涉及到网络编程、数据库...
自己做的一个MQ-PPT,通过学习,应用之后的总结,理论和实践,例子都做了一一说明,希望对初学者有所帮助。