您好,欢迎来到步遥情感网。
搜索
您的当前位置:首页ActiveMQ文档

ActiveMQ文档

来源:步遥情感网
调研一下Apache ActiveMQ。 目标:

1,整理一下收集的资料;

2,部署一个Apache ActiveMQ Server; 3,简单的应用;

资料收集与整理:

1。JMS简介:

JMS(Java Message Service,Java消息服务)是一组Java应用程序接口(Java API),它提供创建、发送、接收、读取消息的服务。 由Sun公司和它的合作伙伴设计的JMS API定义了一组公共的应用程序接口和相应语法,使得Java程序能够和其他消息组件进行通信。 JMS是一种与厂商无关的 API,用来访问消息收发系统。它类似于 JDBC (Java Database Connectivity):这里,JDBC 是可以用来访问许多不同关系数据库的 API,而 JMS 则提供同样与厂商无关的访问方法,以访问消息收发服务。(引自:http://www.itisedu.com/phrase/200604261605045.html)

JMS API 是 J2EE 平台的整体组成部分,允许在松耦合组件之间进行基于消息的通信。通过客户机、Web 层组件、业务层企业 JavaBeans (EJB) 和企业信息系统 (EIS) 层服务之间的 J2EE 堆栈可以发送和接收消息。这些消息是异步发送的,消息发出后,发送方能够继续使用其他应用程序逻辑,消息代理 (message broker) 负责代表发送方传递消息。消息可以在特定的端点(发送方和接收方)之间发送和接收,或通过公共/订阅交互模式在生产者与消费者之间进行匿名传递。在 J2EE 架构内部,通过 JMS 进行通信的组件可以使用容器提供的安全和事物处理功能。

JMS规范目前支持两种消息模型:点对点(point to point, queue)和发布/订阅(publish/subscribe,topic)。 点对点:

消息生产者生产消息发送到queue中,然后消息消费者从queue中取出并且消费消息。这里要注意:

消息被消费以后,queue中不再有存储,所以消息消费者不可能消费到已经被消费的消息。

Queue支持存在多个消费者,但是对一个消息而言,只会有一个消费者可以消费。 发布/订阅

消息生产者(发布)将消息发布到topic中,同时有多个消息消费者(订阅)消费该消息。和点对点方式不同,发布到topic的消息会被所有订阅者消费。 在使用JMS服务时,可以通过需求来确定是使用queue还是topic。

2。ActiveMQ简介 (1)基础知识:

ActiveMQ is an Apache 2.0 licensed open source Message Broker with full support for JMS 1.1 and JCA

ActiveMQ是一个JMS Provider的实现, 是一个JMS 服务器或消息代理,可运行于任何jvm和大部分web容器,支持多种语言、传输(如 TCP、SSL、UDP、多点传送、内部 JVM

和 NIO)和客户机交互(如推、拉和发行/订阅)。

ActiveMQ定义了两种消息:Queue消息和Topic消息,它们分别对应两种消息模式:Point-to-Point (点对点),Publisher/Subscriber Model (发布/订阅者)。

一条Queue消息(假设由producer发出)只能被一个consumer接收,如果在消息发送的时候没有可用的consumer,那么它将被保存直到能处理该消息的consumer可用。如果一个consumer收到一条message后却不响应它,那么这条消息将被转到另一个consumer那儿。一个Queue可以有很多consumer,并且在多个可用的consumer中负载均衡,因此对应了P2P的消息模式。

Topic实现了publish和subscribe语义,一条消息被publish时,它将发到所有感兴趣的订阅者,所以零到多个subscriber将接收到消息的一个拷贝。

(2)ActiveMQ的下载与安装: 下载5.1.0 Windows Distribution版本 安装:直接解压至任意目录 启动ActiveMQ服务器:直接运行bin\\activemq.bat

3。部署Apache ActiveMQ Server: 将ActiveMQ lib目录下的5个jar包复制到Tomcat lib目录下: activemq-core-5.1.0.jar activemq-web-5.1.0.jar geronimo-j2ee-management_1.0_spec-1.0.jar geronimo-jms_1.1_spec-1.1.1.jar geronimo-jta_1.0.1B_spec-1.0.1.jar 修改Tomcat的conf/context.xml文件(Tomcat 6.0.16),在节点中添加一些内容,:以JNDI的方式定义了ActiveMQ的broker连接url,Topic和Queue。ActiveMQ目前支持的transport有:VM Transport、TCP Transport、SSL Transport等多种连接方式: a)VM transport允许在VM内部通信,从而避免了网络传输的开销。这时候采用的连接不是socket连接,而是直接地方法调用。 b)TCP transport 允许客户端通过TCP socket连接到远程的broker。 c)Failover Transport是一种重新连接的机制,它工作于其它transport的上层,用于建立可靠的传输。它的配置语法允许制定任意多个复合的URI。Failover transport会自动选择其中的一个URI来尝试建立连接。如果没有成功,那么会选择一个其它的URI来建立一个新的连接。 具体内容如下: 特别强调一下,这里定义了一种连接方式叫jms/ FailoverConnectionFactory, localhost:61616为ActiveMQ服务器的地址,initialReconnectDelay为连接超时时间, maxReconnectAttempts为连接失败后的尝试次数,当连接中断或者连接失败时,会自动的进行重连。

测试安装:

将ActiveMQ源代码中\\src\\activemq-web-demo\\src\\main\\webapp下的内容部署到Tomcat下,并运行ActiveMQ以及Tomcat服务器,访问该站点下的页面,然后再访问http://localhost:8161/admin/topics.jsp查看消息日志,若有相关的发送和接受记录,则表示Apache ActiveMQ Server部署成功。

4。简单应用:

新建了一个简单的应用,编写了一个Servlet使该应用在应用加载时自动连接ActiveMQ broker,建立一个Connection,设置它的ClientID为MyClient,并定义一个consumer用于消息监听,然后再通过一个JSP页面定义一个producer产生消息,用于与consumer通信,应用中consumer与producer之间即Servlet与JSP之间并没有直接的联系和通信,它们之间的消息是经过ActiveMQ Server的处理,并在后台打印通信消息。访问

http://localhost:8161/admin/topics.jsp查看MY.TEST.FOO的消息日志,分别发送和接收2条。

先启动ActiveMQ,然后再启动Tomcat服务器,应用中Servlet将自动连接ActiveMQ broker,日志信息如下表示连接成功: 2008-7-8 12:52:27 org.apache.activemq.transport.failover.FailoverTransport doReconnect 信息: Successfully connected to tcp://localhost:61616 应用的JSP界面:

Servlet接收到ActiveMQ转发的消息后,经过处理,在后台打印的内容: 接收刷新消息A,ID=test 接收刷新消息B,ID=testing ActiveMQ的Topic管理界面:

5.跨应用消息通信

(1)首先考虑跨平台的两个producer的情况:

在原有应用A的基础上进行修改,再新建一个应用B,构造一个消息的发送者,然后让A中的Servlet处理两个应用发出的消息。 分别提交如下两个页面:

后台打印的内容: 接收刷新消息A:A 接收刷新消息B:B 接收刷新消息C:C 接收刷新消息D:D (2)跨平台的两个comsumer的情况:

在应用B的web.xml中也加入如下配置,使其在加载时也自动连接ActiveMQ broker,并建立一个新的Connection,设置它的ClientID为MyTestClient。B中的Servlet的定义和A中完全相同。 jms-listener com.flvcd.servlet.JMSListener 1 目前就有两个Subscriber连到ActiveMQ,若访问应用A中的JSP页面,则应用A后台会打印出:

接收刷新消息A:AAA 接收刷新消息B:BBB 而应用B的后台也打印出相应内容: 这是另一个应用,接收刷新消息A:AAA 这是另一个应用,接收刷新消息B:BBB 可以看出在跨应用的情况下,通过ActiveMQ的服务,消息可以在不同的应用下进行传输。 (3)跨主机的两个producer的情况与(1)的情况基本一样,不再重复了。 (4)跨主机的两个comsumer的情况: 在跨主机的情况下创建应用,只需要修改Tomcat的配置文件context.xml,将brokerURL中的IP地址改为ActiveMQ服务器所在的机器的IP地址。

同时运行应用的时候,在两台机器的Tomcat后台都会有相应的信息输出,结果与(2)中相同。

6.消息失败的处理:

通过对activemq.xml中节点下persistenceAdapter子节点的配置可以使消息支持持久化存储: …… 持久化存储的意义在于,当Listener还未启动,消息将保存在ActiveMQ的bin\\activemq-data

目录下,当启动Listener所在Web服务器时,将自动接收到ActiveMQ的持久消息并处理。 在跨主机跨应用的情况下,若某台需要接收消息的机器当掉了,那么这个时候需要考虑消息重发的问题,这个时候如果采用持久化消息,则可以很好的解决该问题。

7.消息接收者的指定:

不同的应用之间进行通信的时候一般都会涉及到消息接收者的指定,因为一般情况下一条消息不希望所有的应用都能接收。对于这个问题,我发现了一种简单的方法,就是在Tomcat的配置文件context.xml中,设置jms/topic/MyTopic和jms/queue/MyQueue的physicalName属性,这个属性的作用是ActiveMQ Server依据这个值来对消息进行分发。所以需要共享消息的两个应用可以将该属性设为相同的值,而不想让消息传输给其它应用的需要将该值设为唯一的。

还有一种解决方案,就是通过调用Message对象的setJMSDestination方法设置接收者,这样可以将使发送者更为主动,它可以自己选择消息的接收者。

相反,若想让comsumer自主选择消息并进行接收,则可调用Message对象的getJMSDestination(),然后进行判断即可。

上面是我在学习ActiveMQ时收集和整理的一些资料,以及自己实践时的一些经验和总结,不对之处还望指正!

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- obuygou.com 版权所有 赣ICP备2024042798号-5

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务