`

深入掌握JMS(十)JMSCorrelationID和Selector

    博客分类:
  • JMS
阅读更多

前面讲过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:JMS Selector解析器,这是一个两遍解析器,它将选择器编译为最简单的形式,从而可以更快地执行

    在JMS Selector解析器的设计中,采用了两遍解析的策略,这是为了提高性能和效率。第一遍解析通常是对选择器字符串进行语法分析,检查其语法是否正确,并将其转换为抽象语法树(AST,Abstract Syntax Tree)。这个...

    Android设置button背景selector和字体selector

    在Android开发中,按钮(Button)的样式设计是界面交互中的重要组成部分。...熟练掌握这一技巧,可以让你的App界面更具有吸引力和用户体验。实践中,你可以根据实际需求调整状态和颜色,创造出更多个性化的按钮效果。

    RocketMQ自定义selector实现消息通道定向发送和拉取

    本文将深入探讨如何通过自定义Selector实现在RocketMQ中进行消息通道定向的发送和拉取。 在RocketMQ中,Selector是用于过滤和选择消息的关键组件,它允许消费者根据特定的条件从队列中选择要消费的消息。默认的...

    JMS学习笔记精心总结

    总的来说,JMS是构建高可用、分布式系统的重要工具,理解和掌握JMS对于提升Java开发者在企业级应用开发中的能力至关重要。通过深入学习和实践,我们可以更好地利用JMS来解决复杂系统的异步通信问题。

    BusCreator和BusSelector的简单实验

    在simulink上进行BusCreator和BusSelector的简单实验

    Android selector 完整demo

    本教程将深入探讨Android中的Selector及其使用方法,通过一个完整的Demo来帮助你理解和掌握这个核心概念。 首先,我们需要了解Selector的基本结构。一个Selector通常是一个XML文件,位于项目的res/drawable目录下。...

    flutter file-selector

    在插件使用方面,file_selector插件可以方便地实现文件选择功能,支持多选和所有类型的文件,并且在选择文件后可以获取到文件的路径和其他信息。 在使用file_selector插件时,需要注意以下几点: 在Android系统中...

    iconFont 实现selector的Demo

    通过查看和分析源代码,我们可以学习如何将iconfont与selector结合,以及如何在实际项目中应用这一技术。 总的来说,"iconFont 实现selector的Demo"是一个实用的案例,它展示了如何利用阿里巴巴的iconfont服务来...

    Java NIO——Selector机制解析三(源码分析)

    通过深入学习和理解Selector机制,开发者可以有效地设计和实现高性能的服务器应用,比如网络服务器、聊天服务器等,充分利用系统资源,提高并发处理能力。结合实际项目需求,合理运用Java NIO的Selector机制,可以...

    用selector设置button可用和不可用的样式

    本教程将详细介绍如何使用Selector来设置Button在可用和不可用状态下的样式,以提高应用的视觉效果和交互性。 Selector在Android中是一种基于状态的选择器,它可以为不同状态下的View定义不同的样式。它允许开发者...

    JMS1.1规范(中文)

    Java消息服务(Java Message Service,简称JMS)是Java平台中用于企业级应用集成的API,主要用于在...通过下载并研究"JMS1.1规范(中文).pdf",开发者可以深入理解JMS的工作原理,提高其在企业级应用开发中的实践能力。

    java selector 测试并发

    JavaSelector在Java NIO(非阻塞I/O)中扮演着关键角色,它允许程序...为了深入了解Java Selector的并发测试,需要查看`src`目录下的源代码,分析其中的`Selector`、`SelectionKey`和`SelectableChannel`的使用情况。

    Selector

    描述中提到的"Selector"可能是在讨论与字体相关的选择器,这可能是关于如何在CSS中控制文本的样式和显示方式。CSS中的字体选择器允许开发者指定页面上文字的字体家族、大小、颜色、行高、对齐方式等属性。 标签...

    selectorgadget插件.zip

    SelectorGadget插件与R语言的结合,使得网页数据抓取变得更加便捷和高效。通过熟练掌握这一技巧,你可以轻松应对各种网页结构,从中获取丰富的数据资源,为数据分析和挖掘提供强大支持。 总结来说,SelectorGadget...

    SelectorGadget Chrome插件文件信息

    SelectorGadget是一款强大的Chrome浏览器插件,主要用于网页元素选择,特别是在网页抓取和网络爬虫领域发挥着重要作用。它的设计目标是简化CSS选择器的创建和测试,使得开发者和数据挖掘者能更轻松地定位和选取网页...

    SelectorGadget CSS选择器

    SelectorGadget是一款强大的浏览器插件,专为网页开发者和设计师设计,主要功能是自动化生成CSS选择器。在网页开发过程中,我们经常需要精确地定位HTML元素以便进行样式修改或JavaScript操作,而SelectorGadget则能...

    android selector注入器

    值得注意的是,虽然这个库简化了开发流程,但仍然需要理解Selector的基本概念,以便正确配置和使用。例如,了解如何定义不同状态的效果,以及如何与View的状态关联。同时,合理地运用此库可以提高代码的可读性和可...

    Android selector

    通过查看该项目的源代码,开发者可以更深入地了解Selector的用法和实现细节,例如如何创建自定义的Selector,如何动态改变Selector状态等。对于初学者来说,这是一个很好的学习资源,可以帮助他们理解并熟练运用...

    jms规范说明

    ### JMS规范详解 #### 一、JMS基础概览 **1.1 何为JMS(Java Message Service)?** JMS,即Java消息服务,是Java平台中的...通过对JMS规范的深入理解,开发者能够更有效地利用其特性,实现高效、可靠的消息通信。

    Laravel开发-selector

    在Laravel框架中,开发一个名为"selector"的组件,我们可以深入理解其背后的原理和应用场景。选择器模式(Selector Pattern)是一种设计模式,它允许在运行时动态地选择算法或行为,提供了一种灵活的方式来应对多态...

Global site tag (gtag.js) - Google Analytics