`

深入掌握JMS(九)Selector

    博客分类:
  • JMS
阅读更多

前面的例子中创建一个消息消费者使用的是:
          sesssion
.createConsumer(destination)
  另外,还提供了另一种方式:
    
sesssion
.createConsumer(destination, selector)
  这里selector是一个字符串,用来过滤消息。也就是说,这种方式可以创建一个可以只接收特定消息的一个消费者。Selector的格式是类似于SQL-92的一种语法。可以用来比较消息头信息和属性。

  下面的例子中,创建两个消费者,共同监听同一个Queue,但是它们的Selector不同,然后创建一个消息生产者,来发送多个消息。

import javax.jms.Connection;
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 JMSSelectorTest {

    public static void main(String[] args) throws Exception {
        ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("vm://localhost");
   
        Connection connection = factory.createConnection();
        connection.start();
       
        Queue queue = new ActiveMQQueue("testQueue");
       
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
       
        MessageConsumer comsumerA = session.createConsumer(queue, "receiver = 'A'");
        comsumerA.setMessageListener(new MessageListener(){
            public void onMessage(Message m) {
                try {
                    System.out.println("ConsumerA get " + ((TextMessage) m).getText());
                } catch (JMSException e1) { }
            }
        });
       
        MessageConsumer comsumerB = session.createConsumer(queue, "receiver = 'B'");
        comsumerB.setMessageListener(new MessageListener(){
            public void onMessage(Message m) {
                try {
                    System.out.println("ConsumerB get " + ((TextMessage) m).getText());
                } catch (JMSException e) { }
            }
        });
       
        MessageProducer producer = session.createProducer(queue);
        for(int i=0; i<10; i++) {
            String receiver = (i%3 == 0 ? "A" : "B");
            TextMessage message = session.createTextMessage("Message" + i + ", receiver:" + receiver);
            message.setStringProperty("receiver", receiver);
            producer.send(message );
        }
    }
}

结果如下:
ConsumerA get Message0, receiver:A
ConsumerB get Message1, receiver:B
ConsumerB get Message2, receiver:B
ConsumerA get Message3, receiver:A
ConsumerB get Message4, receiver:B
ConsumerB get Message5, receiver:B
ConsumerA get Message6, receiver:A
ConsumerB get Message7, receiver:B
ConsumerB get Message8, receiver:B
ConsumerA get Message9, receiver:A

可以看出,消息消费者只会取走它自己感兴趣的消息。

分享到:
评论

相关推荐

    JMS学习笔记精心总结

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

    Java高级技术结课文件 (1).zip

    "Java高级技术结课文件 (1).zip"很可能包含了深入学习Java的一些关键主题和实践项目,这通常涵盖了许多Java开发者在进阶阶段需要掌握的知识点。下面我们将详细探讨这些可能涉及的高级Java技术。 首先,Java文档...

    北京圣思园java课堂笔记 (javaSE和javaee)(Word+PDF版)

    【Java基础篇】 Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(后被Oracle收购)于...通过深入学习这些知识点,不仅可以扎实地掌握Java编程技能,也为进一步研究Java框架和分布式系统打下坚实的基础。

    JAVA面试题集.rar

    以上只是部分核心知识点,实际面试题集可能还会涵盖更多主题,例如JMS(Java消息服务)、分布式、微服务架构、容器化技术(Docker、Kubernetes)等。持续学习和实践这些知识,将有助于你在Java面试中取得优异的表现...

    Java面试宝典2012版

    虽然Java面试通常不会深入到算法竞赛的难度,但基础的排序算法(冒泡、快速、归并)、查找算法(二分查找、哈希查找)以及常用数据结构(链表、树、队列、栈)的知识是必备的。 十二、面试技巧 除了技术知识外,...

    java网络编程第三版

    《Java网络编程第三版》是一本深入探讨Java平台上的网络编程技术的专业书籍,适用于初学者和有经验的开发者。本书全面覆盖了Java网络编程的基础概念、API和实践应用,旨在帮助读者理解并掌握如何利用Java进行高效且...

    部分java有关的API

    jQuery API 1.4的文档详细介绍了这个版本中的函数和方法,如`$(selector)`的选择器用于选取DOM元素,`.click()`用于绑定点击事件,`.animate()`用于创建平滑的动画效果。熟悉jQuery API可以让开发者编写更简洁、高效...

    ActiveMQ-Topic订阅发布模式Demo

    在实际应用中,理解和掌握这些知识点将有助于开发人员有效地利用ActiveMQ的发布/订阅模式来实现灵活、可靠的分布式通信。通过阅读提供的博客和实践提供的Demo,你可以深入理解ActiveMQ的Topic订阅发布模式,并将其...

    高并发、分布式、高可用、微服务、海量数据处理知识

    本文将深入探讨这些主题,并结合Java技术栈进行详细解析。 首先,高并发是指系统能够同时处理大量用户请求的能力。在Java中,我们可以通过多线程、异步编程、线程池等方式来实现高并发。例如,Java的...

    java面试题-外企软件工程师面试题大全

    这份"java面试题-外企软件工程师面试题大全"包含了广泛而深入的Java相关问题,旨在评估候选人在Java编程、设计模式、并发处理、内存管理、框架应用等多个方面的知识掌握程度。 1. **基础语法**:面试中可能会涉及...

    java通信入门学习

    通过4天的学习,你将掌握如何在Java中实现各种通信机制。 首先,我们从基础开始,讲解Java的Socket编程。Socket是网络通信的基础,它提供了应用程序间的双向通信通道。在Java中,`java.net.Socket` 和 `java.net....

    JAVA面试核心知识点

    以上只是Java面试核心知识点的一部分,实际面试中还可能涉及反射、注解、设计模式、Spring框架、数据库连接池、JMS消息队列等更深入的内容。对于求职者来说,全面理解和熟练掌握这些知识点,将有助于在面试中表现...

    Java文档500篇 Java文档

    "Java文档500篇"集合了前人的智慧结晶,为Java爱好者提供了深入理解和掌握这门语言的宝贵资料。以下是对这些文档可能包含的一些核心知识点的详细说明: 1. **基础语法**:Java的基础语法包括变量声明、数据类型、...

    java常用面试题集锦

    Java是一种广泛使用的面向对象的编程...这些知识点只是Java面试题中的一部分,实际面试可能会涉及更深入的技术,如设计模式、JMS、分布式缓存、微服务架构等。通过不断学习和实践,才能在面试中展现出扎实的Java技能。

    java高手真经:网络开发卷源码

    8. **分布式服务**:Java在分布式计算中的应用,如RMI(Remote Method Invocation)、JMS(Java Message Service)和Dubbo等,用于实现跨网络的服务调用和消息传递。 9. **网络调试工具**:熟悉Wireshark、jconsole...

    JAVA 面试题库

    Java面试题库是每个准备Java开发职位面试的求职者都需要深入了解的内容。这个题库涵盖了Java语言的核心概念、高级特性、多线程、集合框架、IO流、网络编程、设计模式等多个方面,旨在帮助求职者全面掌握Java技术栈,...

    JAVA面试试题大全

    Java是世界上最流行的编程语言之一,尤其在企业...这些知识点构成了Java面试的核心部分,对于求职者来说,深入理解和熟练应用这些概念是必不可少的。通过不断学习和实践,可以提升自己的Java技能,以应对各种面试挑战。

    java工程师面试题

    此外,面试者还应掌握并发容器,如ConcurrentHashMap和CopyOnWriteArrayList。 对于内存管理,面试者需要理解Java内存模型(JMM),包括堆内存、栈内存、方法区(元空间)以及垃圾回收机制。GC的原理,比如分代收集...

    activemq-cpp发送接收消息,消息过滤器

    在本文中,我们将深入探讨如何使用`activemq-cpp`库在C++环境中发送和接收消息,并利用消息过滤器来实现特定的消息处理。`activemq-cpp`是Apache ActiveMQ的一个C++客户端,它提供了与ActiveMQ服务器进行交互的能力...

    Java Network Programming and Distributed Computing 及源码

    这本书深入浅出地介绍了如何使用Java语言进行网络通信和构建分布式系统,对于想要掌握这些技术的开发者来说,是一份宝贵的资源。 Java网络编程是Java平台的核心特性之一,它允许程序在不同计算机之间交换数据和进行...

Global site tag (gtag.js) - Google Analytics