日期:2014-5-16 浏览次数:20232次

Apache ActiveMQ Queue Topic 详解 教程 加入代码解释说明

一、特性及优势


1、实现 JMS1.1 规范,支持 J2EE1.4以上
2、可运行于任何 jvm和大部分 web 容器(ActiveMQ works great in any JVM)
3、支持多种语言客户端(java, C, C++, AJAX, ACTIONSCRIPT 等等)
4、支持多种协议(stomp,openwire,REST)
5、良好的 spring 支持(ActiveMQ has great Spring Support)
6、速度很快,JBossMQ的十倍(ActiveMQ is very fast; often 10x faster than
JBossMQ.)
7、与 OpenJMS、JbossMQ等开源jms provider 相比,ActiveMQ有 Apache 的支
持,持续发展的优势明显。

?

二、下载部署

1、下载
http://activemq.apache.org/activemq-510-release.html ,下载 5.1.0 Windows
Distribution版本
2、安装
直接解压至任意目录(如:d:\ apache-activemq-5.1.0)
3、启动 ActiveMQ服务器
方法 1:
直接运行 bin\activemq.bat
方法 2(在 JVM 中嵌套启动):
cd example
ant embedBroker
4、ActiveMQ消息管理后台系统:
http://localhost:8161/admin

?

?

三、运行附带的示例程序

1、Queue 消息示例:(点对点)
*? 启动 Queue 消息消费者
cd example ant consumer
*? 启动 Queue 消息生产者
cd example
ant producer
简要说明:生产者(producer)发消息,消费者(consumer)接消息,发送/接
收 2000 个消息后自动关闭
2、Topic 消息示例:(群组订阅)
*? 启动 Topic 消息消费者
cd example
ant topic-listener
*? 启动 Topic 消息生产者
cd example
ant topic-publisher
简要说明:重复 10 轮,publisher每轮发送2000 个消息,并等待获取 listener
的处理结果报告,然后进入下一轮发送,最后统计全局发送时间。


四、Queue与 Topic 的比较


1、JMS Queue 执行 load balancer语义:
一条消息仅能被一个 consumer(消费者) 收到。如果在 message 发送的时候没有可用的
consumer,那么它将被保存一直到能处理该 message 的 consumer 可用。如果一
个 consumer 收到一条 message 后却不响应它,那么这条消息将被转到另一个
consumer 那儿。一个 Queue 可以有很多 consumer,并且在多个可用的 consumer
中负载均衡。?

?

?

注:


点对点消息传递域的特点如下:
?? 每个消息只能有一个消费者。?
?? 消息的生产者和消费者之间没有时间上的相关性。无论消费者在生产者发
送消息的时候是否处于运行状态,它都可以提取消息。


2、Topic 实现 publish和 subscribe 语义:
一条消息被 publish时,它将发到所有感兴趣的订阅者,所以零到多个subscriber
将接收到消息的一个拷贝。但是在消息代理接收到消息时,只有激活订阅的
subscriber能够获得消息的一个拷贝。

?

注:

?

发布/订阅消息传递域的特点如下:
?? 每个消息可以有多个消费者。?
?? 生产者和消费者之间有时间上的相关性。订阅一个主题的消费者只能消费
自它订阅之后发布的消息。JMS 规范允许客户创建持久订阅,这在一定程
度上放松了时间上的相关性要求。持久订阅允许消费者消费它在未处于激
活状态时发送的消息。


3、分别对应两种消息模式:
Point-to-Point (点对点),Publisher/Subscriber Model (发布/订阅者) 其中在 Publicher/Subscriber 模式下又有Nondurable subscription(非持久订阅)
和 durable subscription (持久化订阅)2种消息处理方式(支持离线消息)。

?

注:

在点对点消息传递域中,目的地被成为队列(queue);在发布/订阅消息传递
域中,目的地被成为主题(topic)。


五、Point-to-Point (点对点)消息模式开发流程


1、生产者(producer)开发流程(ProducerTool.java):

1.1? 创建 Connection:
根据 url,user 和 password 创建一个 jms Connection。

?

ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(user, password, url);
            connection = connectionFactory.createConnection();
            connection.start();
?

?

1.2? 创建 Session:
在 connection的基础上创建一个 session,同时设置是否支持事务和
ACKNOWLEDGE 标识。

?
Session session = connection.createSession(transacted, Session.AUTO_ACKNOWLEDGE);
?


1.3? 创建 Destination对象:
需指定其对应的主题(subject)名称,producer 和 consumer 将根据 subject
来发送/接收对应的消息。

?

            if (topic) {
                destination = session.createTopic(subject);
            } else {
                destination = session.createQueue(subject);
            }
?


1.4? 创建 MessageProducer:
根据 Destination创建MessageProducer 对象,同时设置其持久模式。

?

            MessageProducer producer = session.createProducer(destination);         ?


1.5? 发送消息到队列(Queue):
封装 TextMessage 消息, 使用 MessageProducer 的 send 方法将消息发送出去。

?