`

深入掌握JMS(九):Selector

阅读更多

        前面的例子中创建一个消息消费者使用的是:

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

    JAVA面试题集.rar

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

    JAVA面试试题大全

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

    JAVA面试核心知识点

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

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

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

    JAVA 面试题库

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

    java通信入门学习

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

    大数据技术之Flume教程

    ### 大数据技术之Flume教程 #### 一、Flume概述 Flume是由Cloudera公司提供的一个高效、可靠且分布式...通过以上内容的学习与实践,可以全面掌握Flume的使用方法,并在企业环境中有效地利用Flume进行日志管理和分析。

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

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

    ActiveMQ-Topic订阅发布模式Demo

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

    java常用面试题集锦

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

    Java文档500篇 Java文档

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

    Java Network Programming and Distributed Computing 及源码

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

    java网络编程与分布式计算

    Java网络编程是Java开发中的重要领域,它涵盖了网络通信的基础概念...通过深入学习"Java网络编程与分布式计算",开发者可以掌握构建大规模、高性能网络应用和分布式系统的技能,为现代互联网和云计算环境打下坚实基础。

    Java面试宝典2012版

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

    Java 集成开发实例精解

    《Java集成开发实例精解》一书主要涵盖了Java在实际项目中的综合应用,旨在通过具体的实例帮助读者深入理解和掌握Java编程技术。以下是对这个主题的详细解析: Java是一种广泛使用的面向对象的编程语言,由Sun ...

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

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

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

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

    JAVA-works-class.zip_计算机网络

    在这个大二上学期的Java课程中,我们深入探讨了如何利用Java语言来实现计算机网络的相关功能。Java以其平台独立性、丰富的类库和强大的网络编程能力,成为了构建网络应用程序的首选语言之一。 1. **Socket编程**:...

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

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

Global site tag (gtag.js) - Google Analytics