JMS详解ActiveMQ.docx

上传人:b****6 文档编号:5171516 上传时间:2022-12-13 格式:DOCX 页数:25 大小:2.32MB
下载 相关 举报
JMS详解ActiveMQ.docx_第1页
第1页 / 共25页
JMS详解ActiveMQ.docx_第2页
第2页 / 共25页
JMS详解ActiveMQ.docx_第3页
第3页 / 共25页
JMS详解ActiveMQ.docx_第4页
第4页 / 共25页
JMS详解ActiveMQ.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

JMS详解ActiveMQ.docx

《JMS详解ActiveMQ.docx》由会员分享,可在线阅读,更多相关《JMS详解ActiveMQ.docx(25页珍藏版)》请在冰豆网上搜索。

JMS详解ActiveMQ.docx

JMS详解ActiveMQ

基本概念

JMS是java的消息服务,JMS的客户端之间可以通过JMS服务进行异步的消息传输。

消息模型

○Point-to-Point(P2P)

○Publish/Subscribe(Pub/Sub)

即点对点和发布订阅模型

P2P

P2P模式图 

涉及到的概念 

消息队列(Queue)

发送者(Sender)

接收者(Receiver)

每个消息都被发送到一个特定的队列,接收者从队列中获取消息。

队列保留着消息,直到他们被消费或超时。

P2P的特点

每个消息只有一个消费者(Consumer)(即一旦被消费,消息就不再在消息队列中)

发送者和接收者之间在时间上没有依赖性,也就是说当发送者发送了消息之后,不管接收者有没有正在运行,它不会影响到消息被发送到队列

接收者在成功接收消息之后需向队列应答成功

如果你希望发送的每个消息都应该被成功处理的话,那么你需要P2P模式。

Pub/Sub

Pub/Sub模式图 

涉及到的概念 

主题(Topic)

发布者(Publisher)

订阅者(Subscriber) 

客户端将消息发送到主题。

多个发布者将消息发送到Topic,系统将这些消息传递给多个订阅者。

Pub/Sub的特点

每个消息可以有多个消费者

发布者和订阅者之间有时间上的依赖性。

针对某个主题(Topic)的订阅者,它必须创建一个订阅者之后,才能消费发布者的消息,而且为了消费消息,订阅者必须保持运行的状态。

为了缓和这样严格的时间相关性,JMS允许订阅者创建一个可持久化的订阅。

这样,即使订阅者没有被激活(运行),它也能接收到发布者的消息。

如果你希望发送的消息可以不被做任何处理、或者被一个消息者处理、或者可以被多个消费者处理的话,那么可以采用Pub/Sub模型

消息的消费 

在JMS中,消息的产生和消息是异步的。

对于消费来说,JMS的消息者可以通过两种方式来消费消息。

 

○同步 

订阅者或接收者调用receive方法来接收消息,receive方法在能够接收到消息之前(或超时之前)将一直阻塞 

○异步 

订阅者或接收者可以注册为一个消息监听器。

当消息到达之后,系统自动调用监听器的onMessage方法。

JMS编程模型

(1)ConnectionFactory

创建Connection对象的工厂,针对两种不同的jms消息模型,分别有QueueConnectionFactory和TopicConnectionFactory两种。

可以通过JNDI来查找ConnectionFactory对象。

(2)Destination

Destination的意思是消息生产者的消息发送目标或者说消息消费者的消息来源。

对于消息生产者来说,它的Destination是某个队列(Queue)或某个主题(Topic);对于消息消费者来说,它的Destination也是某个队列或主题(即消息来源)。

所以,Destination实际上就是两种类型的对象:

Queue、Topic可以通过JNDI来查找Destination。

(3)Connection

Connection表示在客户端和JMS系统之间建立的链接(对TCP/IPsocket的包装)。

Connection可以产生一个或多个Session。

跟ConnectionFactory一样,Connection也有两种类型:

QueueConnection和TopicConnection。

(4)Session

Session是我们操作消息的接口。

可以通过session创建生产者、消费者、消息等。

Session提供了事务的功能。

当我们需要使用session发送/接收多个消息时,可以将这些发送/接收动作放到一个事务中。

同样,也分QueueSession和TopicSession。

(5)消息的生产者

消息生产者由Session创建,并用于将消息发送到Destination。

同样,消息生产者分两种类型:

QueueSender和TopicPublisher。

可以调用消息生产者的方法(send或publish方法)发送消息。

(6)消息消费者

消息消费者由Session创建,用于接收被发送到Destination的消息。

两种类型:

QueueReceiver和TopicSubscriber。

可分别通过session的createReceiver(Queue)或createSubscriber(Topic)来创建。

当然,也可以session的creatDurableSubscriber方法来创建持久化的订阅者。

(7)MessageListener

消息监听器。

如果注册了消息监听器,一旦消息到达,将自动调用监听器的onMessage方法。

EJB中的MDB(Message-DrivenBean)就是一种MessageListener。

企业消息系统的好处

我们先来看看下图,应用程序A将Message发送到服务器上,然后应用程序B从服务器中接收A发来的消息,通过这个图我们一起来分析一下JMS的好处:

 

提供消息灵活性

松散耦合

异步性

现实的企业中,对于消息通信的应用一直都非常的火热,而且在J2EE的企业应用中扮演着特殊的角色,所以对于它研究是非常有必要的。

我们介绍了消息通信的规范JMS,我们这篇博文介绍一款开源的JMS具体实现——ActiveMQ。

ActiveMQ是一个易于使用的消息中间件。

消息中间件

我们简单的介绍一下消息中间件,对它有一个基本认识就好,消息中间件(MOM:

MessageOrientmiddleware)。

消息中间件有很多的用途和优点:

 

1.将数据从一个应用程序传送到另一个应用程序,或者从软件的一个模块传送到另外一个模块; 

2.负责建立网络通信的通道,进行数据的可靠传送。

 

3.保证数据不重发,不丢失 

4.能够实现跨平台操作,能够为不同操作系统上的软件集成技工数据传送服务

MQ

首先简单的介绍一下MQ,MQ英文名MessageQueue,中文名也就是大家用的消息队列,干嘛用的呢,说白了就是一个消息的接受和转发的容器,可用于消息推送。

下面进入我们今天的主题,为大家介绍ActiveMQ:

ActiveMQ

简要概述ActiveMQ

ApacheActiveMQ™isthemostpopularandpowerfulopensourcemessagingandIntegrationPatternsserver.

ApacheActiveMQisfast,supportsmanyCrossLanguageClientsandProtocols,comeswitheasytouseEnterpriseIntegrationPatternsandmanyadvancedfeatureswhilefullysupportingJMS1.1andJ2EE1.4.

ActiveMQ是由Apache出品的,一款最流行的,能力强劲的开源消息总线。

ActiveMQ是一个完全支持JMS1.1和J2EE1.4规范的JMSProvider实现,它非常快速,支持多种语言的客户端和协议,而且可以非常容易的嵌入到企业的应用环境中,并有许多高级功能。

下面我们下载一个版本,玩一玩。

下载ActiveMQ

官方网站:

http:

//activemq.apache.org/ 

现在ActiveMQ最新的版本是5.11.1,下载挺简单的,就不再截图了。

运行ActiveMQ服务

下载,解压缩 

大家现在好之后,将apache-activemq-5.11.1-bin.zip解压缩,我们可以看到它的整体目录结构:

 

 

从它的目录来说,还是很简单的:

 

bin存放的是脚本文件

conf存放的是基本配置文件

data存放的是日志文件

docs存放的是说明文档

examples存放的是简单的实例

lib存放的是activemq所需jar包

webapps用于存放项目的目录

启动ActiveMQ 

我们了解activemq的基本目录,下面我们运行一下activemq服务,双击bin目录下的activemq.bat脚本文件或运行自己电脑版本下的activemq.bat,就可以看下图的效果。

 

从上图我们可以看到activemq的存放地址,以及浏览器要访问的地址. 

3.测试

ActiveMQ默认使用的TCP连接端口是61616,通过查看该端口的信息可以测试ActiveMQ是否成功启动netstat-an|find“61616”

C:

\DocumentsandSettings\Administrator>netstat-an|find"61616"

TCP0.0.0.0:

616160.0.0.0:

0LISTENING

4.监控 

ActiveMQ默认启动时,启动了内置的jetty服务器,提供一个用于监控ActiveMQ的admin应用。

 

admin:

http:

//127.0.0.1:

8161/admin/

用户名和密码都是admin

JMS其实并没有想象的那么高大上,看完这篇博文之后,你就知道什么叫简单,下面直接进入主题。

开发环境

我们使用的是ActiveMQ5.11.1Release的Windows版,官网最新版是ActiveMQ5.12.0Release,大家可以自行下载,下载地址。

需要注意的是,开发时候,要将apache-activemq-5.11.1-bin.zip解压缩后里面的activemq-all-5.11.1.jar包加入到classpath下面,这个包包含了所有jms接口api的实现。

搭建开发环境

建立项目 

我们只需要建立一个java项目就可以了,导入jar包,项目截图:

 

点对点的消息模型,只需要一个消息生成者和消息消费者,下面我们编写代码。

编写生产者

packagecom.tgb.activemq;

importjavax.jms.Connection;

importjavax.jms.ConnectionFactory;

importjavax.jms.Destination;

importjavax.jms.JMSException;

importjavax.jms.MessageProducer;

importjavax.jms.Session;

importjavax.jms.TextMessage;

importorg.apache.activemq.ActiveMQConnection;

importorg.apache.activemq.ActiveMQConnectionFactory;

/**

*消息的生产者(发送者)

*@authorliang

*

*/

publicclassJMSProducer{

//默认连接用户名

privatestaticfinalStringUSERNAME=ActiveMQConnection.DEFAULT_USER;

//默认连接密码

privatestaticfinalStringPASSWORD=ActiveMQConnection.DEFAULT_PASSWORD;

//默认连接地址

privatestaticfinalStringBROKEURL=ActiveMQConnection.DEFAULT_BROKER_URL;

//发送的消息数量

privatestaticfinalintSENDNUM=10;

publicstaticvoidmain(String[]args){

//连接工厂

ConnectionFactoryconnectionFactory;

//连接

Connectionconnection=null;

//会话接受或者发送消息的线程

Sessionsession;

//消息的目的地

Destinationdestination;

//消息生产者

MessageProducermessageProducer;

//实例化连接工厂

connectionFactory=newActiveMQConnectionFactory(JMSProducer.USERNAME,JMSProducer.PASSWORD,JMSProducer.BROKEURL);

try{

//通过连接工厂获取连接

connection=connectionFactory.createConnection();

//启动连接

connection.start();

//创建session

session=connection.createSession(true,Session.AUTO_ACKNOWLEDGE);

//创建一个名称为HelloWorld的消息队列

destination=session.createQueue("HelloWorld");

//创建消息生产者

messageProducer=session.createProducer(destination);

//发送消息

sendMessage(session,messageProducer);

mit();

}catch(Exceptione){

e.printStackTrace();

}finally{

if(connection!

=null){

try{

connection.close();

}catch(JMSExceptione){

e.printStackTrace();

}

}

}

}

/**

*发送消息

*@paramsession

*@parammessageProducer消息生产者

*@throwsException

*/

publicstaticvoidsendMessage(Sessionsession,MessageProducermessageProducer)throwsException{

for(inti=0;i

//创建一条文本消息

TextMessagemessage=session.createTextMessage("ActiveMQ发送消息"+i);

System.out.println("发送消息:

Activemq发送消息"+i);

//通过消息生产者发出消息

messageProducer.send(message);

}

}

}

编写消费者

packagecom.tgb.activemq;

importjavax.jms.Connection;

importjavax.jms.ConnectionFactory;

importjavax.jms.Destination;

importjavax.jms.JMSException;

importjavax.jms.MessageConsumer;

importjavax.jms.Session;

importjavax.jms.TextMessage;

importorg.apache.activemq.ActiveMQConnection;

importorg.apache.activemq.ActiveMQConnectionFactory;

/**

*消息的消费者(接受者)

*@authorliang

*

*/

publicclassJMSConsumer{

privatestaticfinalStringUSERNAME=ActiveMQConnection.DEFAULT_USER;//默认连接用户名

privatestaticfinalStringPASSWORD=ActiveMQConnection.DEFAULT_PASSWORD;//默认连接密码

privatestaticfinalStringBROKEURL=ActiveMQConnection.DEFAULT_BROKER_URL;//默认连接地址

publicstaticvoidmain(String[]args){

ConnectionFactoryconnectionFactory;//连接工厂

Connectionconnection=null;//连接

Sessionsession;//会话接受或者发送消息的线程

Destinationdestination;//消息的目的地

MessageConsumermessageConsumer;//消息的消费者

//实例化连接工厂

connectionFactory=newActiveMQConnectionFactory(JMSConsumer.USERNAME,JMSConsumer.PASSWORD,JMSConsumer.BROKEURL);

try{

//通过连接工厂获取连接

connection=connectionFactory.createConnection();

//启动连接

connection.start();

//创建session

session=connection.createSession(false,Session.AUTO_ACKNOWLEDGE);

//创建一个连接HelloWorld的消息队列

destination=session.createQueue("HelloWorld");

//创建消息消费者

messageConsumer=session.createConsumer(destination);

while(true){

TextMessagetextMessage=(TextMessage)messageConsumer.receive(100000);

if(textMessage!

=null){

System.out.println("收到的消息:

"+textMessage.getText());

}else{

break;

}

}

 

}catch(JMSExceptione){

e.printStackTrace();

}

}

}

运行

首先,启动ActiveMQ,如何启动ActiveMQ如何启动,请看第二篇博文。

在浏览器中输入:

http:

//localhost:

8161/admin/,然后开始执行:

运行发送者,eclipse控制台输出,如下图:

 

 

此时,我们先看一下ActiveMQ服务器,Queues内容如下:

 

我们可以看到创建了一个名称为HelloWorld的消息队列,队列中有10条消息未被消费,我们也可以通过Browse查看是哪些消息,如下图:

 

如果这些队列中的消息,被删除,消费者则无法消费。

我们继续运行一下消费者,eclipse控制台打印消息,如下:

 

 

此时,我们先看一下ActiveMQ服务器,Queues内容如下:

 

我们可以看到HelloWorld的消息队列发生变化,多一个消息者,队列中的10条消息被消费了,点击Browse查看,已经为空了。

 

点击ActiveConsumers,我们可以看到这个消费者的详细信息:

 

我们的实例到此就结束了,大家可以自己多点ActiveMQ服务器的内容,进一步熟悉ActiveMQ。

总结

这篇博文我们实现了点对点的消息模型以及发送的一个同步消息,是不是非常的简单?

5.至此,服务端启动完毕

停止服务器,只需要按着Ctrl+Shift+C,之后输入y即可。

我们简单说说ActiveMQ特性,网上很多,只是为了保证博文的完整。

ActiveMQ特性列表

多种语言和协议编写客户端。

语言:

Java,C,C++,C#,Ruby,Perl,Python,PHP。

应用协议:

OpenWire,StompREST,WSNotification,XMPP,AMQP

完全支持JMS1.1和J2EE1.4规范(持久化,XA消息,事务)

对Spring的支持,ActiveMQ可以很容易内嵌到使用Spring的系统里面去,而且也支持Spring2.0的特性

通过了常见J2EE服务器(如Geronimo,JBoss4,GlassFish,WebLogic)的测试,其中通过JCA1.5resourceadaptors的配置,可以让ActiveMQ可以自动的部署到任何兼容J2EE1.4商业服务器上

支持多种传送协议:

in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA

支持通过JDBC和journal提供高速的消息持久化

从设计上保证了高性能的集群,客户端-服务器,点对点

支持Ajax

支持与Axis的整合

可以很容易得调用内嵌JMSprovider,进行测试

什么情况下使用ActiveMQ?

多个项目之间集成 

(1)跨平台 

(2)多语言 

(3)多项目

降低系统间模块的耦合度,解耦 

(1)软件扩展性

系统前后端隔离 

(1)前后端隔离,屏蔽高安全区

其实ActiveMQ的应用还有很多,大家可以上网查查,不再一一举例。

总结

ActiveMQ并不难,具有很多的优势。

环境准备

工具

JDK1.6或1.7

Spring4.1.0

ActiveMQ5.11.1

Tomcat7.x

目录结构

所需jar包

项目的配置

配置ConnectionFactory

connectionFactory是Spring用于创建到JMS服务器链接的,Spring提供了多种connectionFactory,我们介绍两个SingleConnectionFactory和CachingConnectionFactory。

SingleConnectionFactory:

对于建立JMS服务器链接的请求会一直返回同一个链接,并且会忽略Connection的close方法调用。

CachingConnectionFactory:

继承了SingleConnectionFactory,所以它拥有SingleConnectionFactory的所有功能,同时它还新增了缓存功能,它可以缓存Session、MessageProducer和MessageConsumer。

我们使用CachingConnectionFactory来作为示例。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 艺术

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1