前面的例子中创建一个消息消费者使用的是:
sesssion.createConsumer(destination);
另外,还提供了另一种方式:
sesssion.createConsumer(destination, selector);
这里selector是一个字符串,用来过滤消息。也就是说,这种方式可以创建一个可以只接收特定消息的一个消费者。Selector的格式是类似于SQL-92的一种语法,可以用来比较消息头信息和属性。
下面的例子中,创建两个消费者,共同监听同一个Queue,但是它们的Selector不同,然后创建一个消息生产者,来发送多个消息。
package com.bijian.study; 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("tcp://localhost:61616"); 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
可以看出,消息消费者只会取走它自己感兴趣的消息。
文章来源:http://www.cnblogs.com/guthing/archive/2010/06/12/1757172.html
相关推荐
总的来说,JMS是构建高可用、分布式系统的重要工具,理解和掌握JMS对于提升Java开发者在企业级应用开发中的能力至关重要。通过深入学习和实践,我们可以更好地利用JMS来解决复杂系统的异步通信问题。
以上只是部分核心知识点,实际面试题集可能还会涵盖更多主题,例如JMS(Java消息服务)、分布式、微服务架构、容器化技术(Docker、Kubernetes)等。持续学习和实践这些知识,将有助于你在Java面试中取得优异的表现...
Java是世界上最流行的编程语言之一,尤其在企业...这些知识点构成了Java面试的核心部分,对于求职者来说,深入理解和熟练应用这些概念是必不可少的。通过不断学习和实践,可以提升自己的Java技能,以应对各种面试挑战。
以上只是Java面试核心知识点的一部分,实际面试中还可能涉及反射、注解、设计模式、Spring框架、数据库连接池、JMS消息队列等更深入的内容。对于求职者来说,全面理解和熟练掌握这些知识点,将有助于在面试中表现...
8. **分布式服务**:Java在分布式计算中的应用,如RMI(Remote Method Invocation)、JMS(Java Message Service)和Dubbo等,用于实现跨网络的服务调用和消息传递。 9. **网络调试工具**:熟悉Wireshark、jconsole...
Java面试题库是每个准备Java开发职位面试的求职者都需要深入了解的内容。这个题库涵盖了Java语言的核心概念、高级特性、多线程、集合框架、IO流、网络编程、设计模式等多个方面,旨在帮助求职者全面掌握Java技术栈,...
通过4天的学习,你将掌握如何在Java中实现各种通信机制。 首先,我们从基础开始,讲解Java的Socket编程。Socket是网络通信的基础,它提供了应用程序间的双向通信通道。在Java中,`java.net.Socket` 和 `java.net....
### 大数据技术之Flume教程 #### 一、Flume概述 Flume是由Cloudera公司提供的一个高效、可靠且分布式...通过以上内容的学习与实践,可以全面掌握Flume的使用方法,并在企业环境中有效地利用Flume进行日志管理和分析。
这份"java面试题-外企软件工程师面试题大全"包含了广泛而深入的Java相关问题,旨在评估候选人在Java编程、设计模式、并发处理、内存管理、框架应用等多个方面的知识掌握程度。 1. **基础语法**:面试中可能会涉及...
在实际应用中,理解和掌握这些知识点将有助于开发人员有效地利用ActiveMQ的发布/订阅模式来实现灵活、可靠的分布式通信。通过阅读提供的博客和实践提供的Demo,你可以深入理解ActiveMQ的Topic订阅发布模式,并将其...
Java是一种广泛使用的面向对象的编程...这些知识点只是Java面试题中的一部分,实际面试可能会涉及更深入的技术,如设计模式、JMS、分布式缓存、微服务架构等。通过不断学习和实践,才能在面试中展现出扎实的Java技能。
"Java文档500篇"集合了前人的智慧结晶,为Java爱好者提供了深入理解和掌握这门语言的宝贵资料。以下是对这些文档可能包含的一些核心知识点的详细说明: 1. **基础语法**:Java的基础语法包括变量声明、数据类型、...
这本书深入浅出地介绍了如何使用Java语言进行网络通信和构建分布式系统,对于想要掌握这些技术的开发者来说,是一份宝贵的资源。 Java网络编程是Java平台的核心特性之一,它允许程序在不同计算机之间交换数据和进行...
Java网络编程是Java开发中的重要领域,它涵盖了网络通信的基础概念...通过深入学习"Java网络编程与分布式计算",开发者可以掌握构建大规模、高性能网络应用和分布式系统的技能,为现代互联网和云计算环境打下坚实基础。
虽然Java面试通常不会深入到算法竞赛的难度,但基础的排序算法(冒泡、快速、归并)、查找算法(二分查找、哈希查找)以及常用数据结构(链表、树、队列、栈)的知识是必备的。 十二、面试技巧 除了技术知识外,...
《Java集成开发实例精解》一书主要涵盖了Java在实际项目中的综合应用,旨在通过具体的实例帮助读者深入理解和掌握Java编程技术。以下是对这个主题的详细解析: Java是一种广泛使用的面向对象的编程语言,由Sun ...
"Java高级技术结课文件 (1).zip"很可能包含了深入学习Java的一些关键主题和实践项目,这通常涵盖了许多Java开发者在进阶阶段需要掌握的知识点。下面我们将详细探讨这些可能涉及的高级Java技术。 首先,Java文档...
在本文中,我们将深入探讨如何使用`activemq-cpp`库在C++环境中发送和接收消息,并利用消息过滤器来实现特定的消息处理。`activemq-cpp`是Apache ActiveMQ的一个C++客户端,它提供了与ActiveMQ服务器进行交互的能力...
在这个大二上学期的Java课程中,我们深入探讨了如何利用Java语言来实现计算机网络的相关功能。Java以其平台独立性、丰富的类库和强大的网络编程能力,成为了构建网络应用程序的首选语言之一。 1. **Socket编程**:...
【Java基础篇】 Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(后被Oracle收购)于...通过深入学习这些知识点,不仅可以扎实地掌握Java编程技能,也为进一步研究Java框架和分布式系统打下坚实的基础。