前面的例子中创建一个消息消费者使用的是:
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对于提升Java开发者在企业级应用开发中的能力至关重要。通过深入学习和实践,我们可以更好地利用JMS来解决复杂系统的异步通信问题。
"Java高级技术结课文件 (1).zip"很可能包含了深入学习Java的一些关键主题和实践项目,这通常涵盖了许多Java开发者在进阶阶段需要掌握的知识点。下面我们将详细探讨这些可能涉及的高级Java技术。 首先,Java文档...
【Java基础篇】 Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(后被Oracle收购)于...通过深入学习这些知识点,不仅可以扎实地掌握Java编程技能,也为进一步研究Java框架和分布式系统打下坚实的基础。
以上只是部分核心知识点,实际面试题集可能还会涵盖更多主题,例如JMS(Java消息服务)、分布式、微服务架构、容器化技术(Docker、Kubernetes)等。持续学习和实践这些知识,将有助于你在Java面试中取得优异的表现...
虽然Java面试通常不会深入到算法竞赛的难度,但基础的排序算法(冒泡、快速、归并)、查找算法(二分查找、哈希查找)以及常用数据结构(链表、树、队列、栈)的知识是必备的。 十二、面试技巧 除了技术知识外,...
《Java网络编程第三版》是一本深入探讨Java平台上的网络编程技术的专业书籍,适用于初学者和有经验的开发者。本书全面覆盖了Java网络编程的基础概念、API和实践应用,旨在帮助读者理解并掌握如何利用Java进行高效且...
jQuery API 1.4的文档详细介绍了这个版本中的函数和方法,如`$(selector)`的选择器用于选取DOM元素,`.click()`用于绑定点击事件,`.animate()`用于创建平滑的动画效果。熟悉jQuery API可以让开发者编写更简洁、高效...
在实际应用中,理解和掌握这些知识点将有助于开发人员有效地利用ActiveMQ的发布/订阅模式来实现灵活、可靠的分布式通信。通过阅读提供的博客和实践提供的Demo,你可以深入理解ActiveMQ的Topic订阅发布模式,并将其...
本文将深入探讨这些主题,并结合Java技术栈进行详细解析。 首先,高并发是指系统能够同时处理大量用户请求的能力。在Java中,我们可以通过多线程、异步编程、线程池等方式来实现高并发。例如,Java的...
这份"java面试题-外企软件工程师面试题大全"包含了广泛而深入的Java相关问题,旨在评估候选人在Java编程、设计模式、并发处理、内存管理、框架应用等多个方面的知识掌握程度。 1. **基础语法**:面试中可能会涉及...
通过4天的学习,你将掌握如何在Java中实现各种通信机制。 首先,我们从基础开始,讲解Java的Socket编程。Socket是网络通信的基础,它提供了应用程序间的双向通信通道。在Java中,`java.net.Socket` 和 `java.net....
以上只是Java面试核心知识点的一部分,实际面试中还可能涉及反射、注解、设计模式、Spring框架、数据库连接池、JMS消息队列等更深入的内容。对于求职者来说,全面理解和熟练掌握这些知识点,将有助于在面试中表现...
"Java文档500篇"集合了前人的智慧结晶,为Java爱好者提供了深入理解和掌握这门语言的宝贵资料。以下是对这些文档可能包含的一些核心知识点的详细说明: 1. **基础语法**:Java的基础语法包括变量声明、数据类型、...
Java是一种广泛使用的面向对象的编程...这些知识点只是Java面试题中的一部分,实际面试可能会涉及更深入的技术,如设计模式、JMS、分布式缓存、微服务架构等。通过不断学习和实践,才能在面试中展现出扎实的Java技能。
8. **分布式服务**:Java在分布式计算中的应用,如RMI(Remote Method Invocation)、JMS(Java Message Service)和Dubbo等,用于实现跨网络的服务调用和消息传递。 9. **网络调试工具**:熟悉Wireshark、jconsole...
Java面试题库是每个准备Java开发职位面试的求职者都需要深入了解的内容。这个题库涵盖了Java语言的核心概念、高级特性、多线程、集合框架、IO流、网络编程、设计模式等多个方面,旨在帮助求职者全面掌握Java技术栈,...
Java是世界上最流行的编程语言之一,尤其在企业...这些知识点构成了Java面试的核心部分,对于求职者来说,深入理解和熟练应用这些概念是必不可少的。通过不断学习和实践,可以提升自己的Java技能,以应对各种面试挑战。
此外,面试者还应掌握并发容器,如ConcurrentHashMap和CopyOnWriteArrayList。 对于内存管理,面试者需要理解Java内存模型(JMM),包括堆内存、栈内存、方法区(元空间)以及垃圾回收机制。GC的原理,比如分代收集...
在本文中,我们将深入探讨如何使用`activemq-cpp`库在C++环境中发送和接收消息,并利用消息过滤器来实现特定的消息处理。`activemq-cpp`是Apache ActiveMQ的一个C++客户端,它提供了与ActiveMQ服务器进行交互的能力...
这本书深入浅出地介绍了如何使用Java语言进行网络通信和构建分布式系统,对于想要掌握这些技术的开发者来说,是一份宝贵的资源。 Java网络编程是Java平台的核心特性之一,它允许程序在不同计算机之间交换数据和进行...