ActiveMQ 的JMS教程.docx
《ActiveMQ 的JMS教程.docx》由会员分享,可在线阅读,更多相关《ActiveMQ 的JMS教程.docx(34页珍藏版)》请在冰点文库上搜索。
ActiveMQ的JMS教程
ActiveMQ的安装和使用总结
一、ActiveMQ安装与配置
一.window下安装activeMQ
1、下载
http:
//activemq.apache.org/activemq-510-release.html,下载5.1.0WindowsDistribution版本
2、安装
直接解压至任意目录(如:
d:
\apache-activemq-5.1.0)
3、启动ActiveMQ服务器
方法1:
直接运行bin\activemq.bat
方法2(在JVM中嵌套启动):
cdexample
antembedBroker
4、ActiveMQ消息管理后台系统:
http:
//localhost:
8161/admin
二.linux下安装ActiveMQ
1.下载
http:
//activemq.apache.org/download.html
2.解压
将下载下来的apache-activemq-5.2.0-bin.tar.gz放置于/usr/local
tarzxvfapache-activemq-5.2.0-bin.tar.gz
3.进入apache-activemq-5.2.0/bin目录下:
运行./activemqstart命令即可启动activemq,使用ps–ef|grepactivemq查看activemq的进程。
修改持久化配置
JMS消息传递是一种异步过程,如果没有接受者JMSProvider应该选择将消息持久化,策略主要有文件持久化和基于数据库的持久化两种,下文是关于将未消费的消息持久化到Oarcle数据库的。
1.我们要做的是将Oracle数据库的驱动包(oracle-jdbc-driver-14.jar)放置到ActiveMQ的安装目录下的lib(/activeMQ/apache-activemq-5.5.0/lib)里。
2.其次,我们需要改写activemq.xml文件,它在ActiveMQ的conf目录中
(也可以修改conf/activemq-jdbc.xml配置文件中的数据源配置实现,通过bin/activemqstartxbean:
conf/activemqjdbc.xml命名启动,试过但没成功希望大家有兴趣可以研究下)。
下面是activemq.xml具体修改部分:
--
Configure message persistence for the broker. The default persistence
mechanism is the KahaDB store (identified by the kahaDB tag).
For more information, see:
http:
//activemq.apache.org/persistence.html
-->
---->
--useoracledataSource,persistencethejmsmessagetoOracleDB-->
—OracledataSource 新添加一个数据源-->
destroy-method="close">
oracle:
thin:
@192.168.1.1:
1521/orcl"/>
3.重启activeMQ(./activemqstart),就会在数据库中看到三张表了,向队列发送几条消息后,数据库表中就会有消息的记录了。
二、消息中间件和JMS
当前,CORBA、DCOM、RMI等RPC中间件技术已广泛应用于各个领域。
但是面对规模和复杂度都越来越高的分布式系统,这些技术也显示出其局限性:
(1)同步通信:
客户发出调用后,必须等待服务对象完成处理并返回结果后才能继续执行;
(2)客户和服务对象的生命周期紧密耦合:
客户进程和服务对象进程都必须正常运行;如果由于服务对象崩溃或者网络故障导致客户的请求不可达,客户会接收到异常;(3)点对点通信:
客户的一次调用只发送给某个单独的目标对象。
面向消息的中间件(MessageOrientedMiddleware,MOM)较好的解决了以上问题。
发送者将消息发送给消息服务器,消息服务器将消息存放在若干队列中,在合适的时候再将消息转发给接收者。
这种模式下,发送和接收是异步的,发送者无需等待;二者的生命周期未必相同:
发送消息的时候接收者不一定运行,接收消息的时候发送者也不一定运行;一对多通信:
对于一个消息可以有多个接收者。
已有的MOM系统包括IBM的MQSeries、Microsoft的MSMQ和BEA的MessageQ等。
由于没有一个通用的标准,这些系统很难实现互操作和无缝连接。
JavaMessageService(JMS)是SUN提出的旨在统一各种MOM系统接口的规范,它包含点对点(PointtoPoint,PTP)和发布/订阅(Publish/Subscribe,pub/sub)两种消息模型,提供可靠消息传输、事务和消息过滤等机制。
1.JMS
JAVA消息服务(JMS)定义了Java中访问消息中间件的接口。
JMS只是接口,并没有给予实现,实现JMS接口的消息中间件称为JMSProvider,iLink实现了JMS接口,用户可以通过使用JMS接口,在iLink中进行JMS编程。
iLink支持JMS1.0.2版本。
2.JMS接口描述
JMS支持两种消息类型PTP和Pub/Sub,分别称作:
PTPDomain和Pub/SubDomain,这两种接口都继承统一的JMS父接口,JMS主要接口如下所示:
MS父接口
PTP
Pub/Sub
ConnectionFactory
QueueConnectionFactory
TopicConnectionFactory
Connection
QueueConnection
TopicConnection
Destination
Queue
Topic
Session
QueueSession
TopicSession
MessageProducer
QueueSender
TopicPublisher
MessageConsumer
QueueReceiver,QueueBrowser
TopicSubscriber
ConnectionFactory:
连接工厂,JMS用它创建连接
Connection:
JMS客户端到JMSProvider的连接
Destination:
消息的目的地
Session:
一个发送或接收消息的线程
MessageProducer:
由Session对象创建的用来发送消息的对象
MessageConsumer:
由Session对象创建的用来接收消息的对象
3.JMS消息模型
JMS消息由以下几部分组成:
消息头,属性,消息体。
3.1消息头(Header)-消息头包含消息的识别信息和路由信息,消息头包含一些标准的属性如:
JMSDestination,JMSMessageID等。
消息头
由谁设置
JMSDestination
send或publish方法
JMSDeliveryMode
send或publish方法
JMSExpiration
send或publish方法
JMSPriority
send或publish方法
JMSMessageID
send或publish方法
JMSTimestamp
send或publish方法
JMSCorrelationID
客户
JMSReplyTo
客户
JMSType
客户
JMSRedelivered
JMSProvider
3.2属性(Properties)-除了消息头中定义好的标准属性外,JMS提供一种机制增加新属性到消息头中,这种新属性包含以下几种:
1.应用需要用到的属性;
2.消息头中原有的一些可选属性;
3.JMSProvider需要用到的属性。
标准的JMS消息头包含以下属性:
JMSDestination
消息发送的目的地
JMSDeliveryMode
传递模式,有两种模式:
PERSISTENT和NON_PERSISTENT,PERSISTENT表示该消息一定要被送到目的地,否则会导致应用错误。
NON_PERSISTENT表示偶然丢失该消息是被允许的,这两种模式使开发者可以在消息传递的可靠性和吞吐量之间找到平衡点。
JMSMessageID
唯一识别每个消息的标识,由JMSProvider产生。
JMSTimestamp
一个消息被提交给JMSProvider到消息被发出的时间。
JMSCorrelationID
用来连接到另外一个消息,典型的应用是在回复消息中连接到原消息。
JMSReplyTo
提供本消息回复消息的目的地址
JMSRedelivered
如果一个客户端收到一个设置了JMSRedelivered属性的消息,则表示可能该客户端曾经在早些时候收到过该消息,但并没有签收(acknowledged)。
JMSType
消息类型的识别符。
JMSExpiration
消息过期时间,等于QueueSender的send方法中的timeToLive值或TopicPublisher的publish方法中的timeToLive值加上发送时刻的GMT时间值。
如果timeToLive值等于零,则JMSExpiration被设为零,表示该消息永不过期。
如果发送后,在消息过期时间之后消息还没有被发送到目的地,则该消息被清除。
JMSPriority
消息优先级,从0-9十个级别,0-4是普通消息,5-9是加急消息。
JMS不要求JMSProvider严格按照这十个优先级发送消息,但必须保证加急消息要先于普通消息到达。
3.3消息体(Body)-JMSAPI定义了5种消息体格式,也叫消息类型,你可以使用不同形式发送接收数据并可以兼容现有的消息格式,下面描述这5种类型:
消息类型
消息体
TextMessage
java.lang.String对象,如xml文件内容
MapMessage
名/值对的集合,名是String对象,值类型可以是Java任何基本类型
BytesMessage
字节流
StreamMessage
Java中的输入输出流
ObjectMessage
Java中的可序列化对象
Message
没有消息体,只有消息头和属性
下例演示创建并发送一个TextMessage到一个队列:
TextMessagemessage=queueSession.createTextMessage();
message.setText(msg_text);//msg_textisaString
queueSender.send(message);
下例演示接收消息并转换为合适的消息类型:
Messagem=queueReceiver.receive();
if(minstanceofTextMessage){
TextMessagemessage=(TextMessage)m;
System.out.println("Readingmessage:
"+message.getText());
}else{
//Handleerror
}
4.消息的同步异步接收
消息的同步接收是指客户端主动去接收消息,JMS客户端可以采用MessageConsumer的receive方法去接收下一个消息。
消息的异步接收是指当消息到达时,主动通知客户端。
JMS客户端可以通过注册一个实现MessageListener接口的对象到MessageConsumer,这样,每当消息到达时,JMSProvider会调用MessageListener中的onMessage方法。
5.PTP模型
PTP(Point-to-Point)模型是基于队列的,发送方发消息到队列,接收方从队列接收消息,队列的存在使得消息的异步传输成为可能。
和邮件系统中的邮箱一样,队列可以包含各种消息,JMSProvider提供工具管理队列的创建、删除。
JMSPTP模型定义了客户端如何向队列发送消息,从队列接收消息,浏览队列中的消息。
下面描述JMSPTP模型中的主要概念和对象:
名称
描述
Queue
由JMSProvider管理,队列由队列名识别,客户端可以通过JNDI接口用队列名得到一个队列对象。
TemporaryQueue
由QueueConnection创建,而且只能由创建它的QueueConnection使用。
QueueConnectionFactory
客户端用QueueConnectionFactory创建QueueConnection对象。
QueueConnection
一个到JMSPTPprovider的连接,客户端可以用QueueConnection创建QueueSession来发送和接收消息。
QueueSession
提供一些方法创建QueueReceiver、QueueSender、QueueBrowser和TemporaryQueue。
如果在QueueSession关闭时,有一些消息已经被收到,但还没有被签收(acknowledged),那么,当接收者下次连接到相同的队列时,这些消息还会被再次接收。
QueueReceiver
客户端用QueueReceiver接收队列中的消息,如果用户在QueueReceiver中设定了消息选择条件,那么不符合条件的消息会留在队列中,不会被接收到。
QueueSender
客户端用QueueSender发送消息到队列。
QueueBrowser
客户端可以QueueBrowser浏览队列中的消息,但不会收走消息。
QueueRequestor
JMS提供QueueRequestor类简化消息的收发过程。
QueueRequestor的构造函数有两个参数:
QueueSession和queue,QueueRequestor通过创建一个临时队列来完成最终的收发消息请求。
可靠性(Reliability)
队列可以长久地保存消息直到接收者收到消息。
接收者不需要因为担心消息会丢失而时刻和队列保持激活的连接状态,充分体现了异步传输模式的优势。
6.PUB/SUB模型
JMSPub/Sub模型定义了如何向一个内容节点发布和订阅消息,这些节点被称作主题(topic)。
主题可以被认为是消息的传输中介,发布者(publisher)发布消息到主题,订阅者(subscribe)从主题订阅消息。
主题使得消息订阅者和消息发布者保持互相独立,不需要接触即可保证消息的传送。
下面描述JMSPub/Sub模型中的主要概念和对象:
名称
描述
订阅(subscription)
消息订阅分为非持久订阅(non-durablesubscription)和持久订阅(durablesubscrip-tion),非持久订阅只有当客户端处于激活状态,也就是和JMSProvider保持连接状态才能收到发送到某个主题的消息,而当客户端处于离线状态,这个时间段发到主题的消息将会丢失,永远不会收到。
持久订阅时,客户端向JMS注册一个识别自己身份的ID,当这个客户端处于离线时,JMSProvider会为这个ID保存所有发送到主题的消息,当客户再次连接到JMSProvider时,会根据自己的ID得到所有当自己处于离线时发送到主题的消息。
Topic
主题由JMSProvider管理,主题由主题名识别,客户端可以通过JNDI接口用主题名得到一个主题对象。
JMS没有给出主题的组织和层次结构的定义,由JMSProvider自己定义。
TemporaryTopic
临时主题由TopicConnection创建,而且只能由创建它的TopicConnection使用。
临时主题不能提供持久订阅功能。
TopicConnectionFactory
客户端用TopicConnectionFactory创建TopicConnection对象。
TopicConnection
TopicConnection是一个到JMSPub/Subprovider的连接,客户端可以用TopicConnection创建TopicSession来发布和订阅消息。
TopicSession
TopicSession提供一些方法创建TopicPublisher、TopicSubscriber、TemporaryTopic。
它还提供unsubscribe方法取消消息的持久订阅。
TopicPublisher
客户端用TopicPublisher发布消息到主题。
TopicSubscriber
客户端用TopicSubscriber接收发布到主题上的消息。
可以在TopicSubscriber中设置消息过滤功能,这样,不符合要求的消息不会被接收。
DurableTopicSubscriber
如果一个客户端需要持久订阅消息,可以使用DurableTopicSubscriber,TopSession提供一个方法createDurableSubscriber创建DurableTopicSubscriber对象。
恢复和重新派送(RecoveryandRedelivery)
非持久订阅状态下,不能恢复或重新派送一个未签收的消息。
只有持久订阅才能恢复或重新派送一个未签收的消息。
TopicRequestor
JMS提供TopicRequestor类简化消息的收发过程。
TopicRequestor的构造函数有两个参数:
TopicSession和topic。
TopicRequestor通过创建一个临时主题来完成最终的发布和接收消息请求。
可靠性(Reliability)
当所有的消息必须被接收,则用持久订阅模式。
当丢失消息能够被容忍,则用非持久订阅模式。
7.开发JMS的步骤
广义上说,一个JMS应用是几个JMS客户端交换消息,开发JMS客户端应用由以下几步构成:
用JNDI得到ConnectionFactory对象;
用JNDI得到目标队列或主题对象,即Destination对象;
用ConnectionFactory创建Connection对象;
用Connection对象创建一个或多个JMSSession;
用Session和Destination创建MessageProducer和MessageConsumer;
通知Connection开始传递消息。
三、深入掌握JMS
1.JMS基础
1.JMS基本概念
JMS(JavaMessageService)
即Java消息服务。
它提供标准的产生、发送、接收消息的接口简化企业应用的开发。
它支持两种消息通信模型:
点到点(point-to-point)(P2P)模型和发布/订阅(Pub/Sub)模型。
P2P
模型规定了一个消息只能有一个接收者;Pub/Sub模型允许一个消息可以有多个接收者。
对于点到点模型,消息生产者产生一个消息后,把这个消息发送到一个Queue(队列)中,然后消息接收者再从这个Queue中读取,一旦这个消息被一个接收者读取之后,它就在这个Queue中消失了,所以一个消息只能被一个接收者消费。
与点到点模型不同,发布/订阅模型中,消息生产者产生一个消息后,把这个消息发送到一个Topic中,这个Topic可以同时有多个接收者在监听,当一个消息到达这个Topic之后,所有消息接收者都会收到这个消息。
简单的讲,点到点模型和发布/订阅模型的区别就是前者是一对一,后者是一对多。
2.几个重要概念
Destination:
消息发送的目的地,也就是前面说的Queue和Topic。
创建好一个消息之后,只需要把这个消息发送到目的地,消息的发送者就可以继续做自己的事情,而不用等待消息被处理完成。
至于这个消息什么时候,会被哪个消费者消费,完全取决于消息的接受者。
Message:
从字面上就可以看出是被发送的消息。
它有下面几种类型:
StreamMessage:
Java数据流消息,用标准流操作来顺序的填充和读取。
MapMessage:
一个Map类型的消息;名称为string类型,而值为Java的基本类型。
TextMessage:
普通字符串消息,包含一个String。
ObjectMessage:
对象消息,包含一个可序列化的Java对象
BytesMes