activeMQJMS学习资料.docx
《activeMQJMS学习资料.docx》由会员分享,可在线阅读,更多相关《activeMQJMS学习资料.docx(26页珍藏版)》请在冰豆网上搜索。
activeMQJMS学习资料
1JMS
JMS源于企业应用对于消息中间件的需求,使应用程序可以通过消息进行异步处理而互不影响。
Sun公司和它的合作伙伴设计的JMSAPI定义了一组公共的应用程序接口和相应语法,使得Java程序能够和其他消息组件进行通信。
1.1JMS的基本构件
1.1.1连接工厂
连接工厂是客户用来创建连接的对象,例如ActiveMQ提供的ActiveMQConnectionFactory。
1.1.2连接
JMSConnection封装了客户与JMS提供者之间的一个虚拟的连接。
1.1.3会话
JMSSession是生产和消费消息的一个单线程上下文。
会话用于创建消息生产者(producer)、消息消费者(consumer)和消息(message)等。
会话提供了一个事务性的上下文,在这个上下文中,一组发送和接收被组合到了一个原子操作中。
1.1.4目的地
目的地是客户用来指定它生产的消息的目标和它消费的消息的来源的对象。
JMS1.0.2规范中定义了两种消息
传递域:
点对点(PTP)消息传递域和发布/订阅消息传递域。
点对点消息传递域的特点如下:
●每个消息只能有一个消费者。
●消息的生产者和消费者之间没有时间上的相关性。
无论消费者在生产者发送消息的时候是否处于运行状态,它都可以提取消息。
发布/订阅消息传递域的特点如下:
●每个消息可以有多个消费者。
●生产者和消费者之间有时间上的相关性。
订阅一个主题的消费者只能消费自它订阅之后发布的消息。
JMS规范允许客户创建持久订阅,这在一定程度上放松了时间上的相关性要求。
持久订阅允许消费者消费它在未处于激活状态时发送的消息。
在点对点消息传递域中,目的地被成为队列(queue);在发布/订阅消息传递域中,目的地被成为主题(topic)。
1.1.5消息生产者
消息生产者是由会话创建的一个对象,用于把消息发送到一个目的地。
1.1.6消息消费者
消息消费者是由会话创建的一个对象,它用于接收发送到目的地的消息。
消息的消费可以采用以下两种方法之一:
●同步消费。
通过调用消费者的receive方法从目的地中显式提取消息。
receive方法可以一直阻塞到消息到达。
●异步消费。
客户可以为消费者注册一个消息监听器,以定义在消息到达时所采取的动作。
1.1.7消息
JMS消息由以下三部分组成:
●消息头。
每个消息头字段都有相应的getter和setter方法。
●消息属性。
如果需要除消息头字段以外的值,那么可以使用消息属性。
●消息体。
JMS定义的消息类型有TextMessage、MapMessage、BytesMessage、StreamMessage和ObjectMessage。
1.2JMS的可靠性机制
1.2.1消息确认
JMS消息只有在被确认之后,才认为已经被成功地消费了。
消息的成功消费通常包含三个阶段:
客户接收消息、客户处理消息和消息被确认。
在事务性会话中,当一个事务被提交的时候,确认自动发生。
在非事务性会话中,消息何时被确认取决于创建会话时的应答模式(acknowledgementmode)。
该参数有以下三个可选值:
●Session.AUTO_ACKNOWLEDGE。
当客户成功的从receive方法返回的时候,或者从MessageListener.onMessage方法成功返回的时候,会话自动确认客户收到的消息。
●Session.CLIENT_ACKNOWLEDGE。
客户通过消息的acknowledge方法确认消息。
需要注意的是,在这种模式中,确认是在会话层上进行:
确认一个被消费的消息将自动确认所有已被会话消费的消息。
例如,如果一个消息消费者消费了10个消息,然后确认第5个消息,那么所有10个消息都被确认。
●Session.DUPS_ACKNOWLEDGE。
该选择只是会话迟钝第确认消息的提交。
如果JMSprovider失败,那么可能会导致一些重复的消息。
如果是重复的消息,那么JMSprovider必须把消息头的JMSRedelivered字段设置为true。
1.2.2持久性
JMS支持以下两种消息提交模式:
●PERSISTENT。
指JMSprovider持久保存消息,以保证消息不会因为JMSprovider的失败而丢失。
●NON_PERSISTENT。
不要求JMSprovider持久保存消息。
1.2.3优先级
可以使用消息优先级来指示JMSprovider首先提交紧急的消息。
优先级分10个级别,从0(最低)到9(最高)。
如果不指定优先级,默认级别是4。
需要注意的是,JMSprovider并不一定保证按照优先级的顺序提交消息。
1.2.4消息过期
可以设置消息在一定时间后过期,默认是永不过期。
1.2.5本地事务
在一个JMS客户端,可以使用本地事务来组合消息的发送和接收。
JMSSession接口提供了commit和rollback方法。
事务提交意味着生产的所有消息被发送,消费的所有消息被确认;事务回滚意味着生产的所有消息被销毁,消费的所有消息被恢复并重新提交,除非它们已经过期。
事务性的会话总是牵涉到事务处理中,commit或rollback方法一旦被调用,一个事务就结束了,而另一个事务被开始。
关闭事务性会话将回滚其中的事务。
需要注意的是,如果使用请求/回复机制,即发送一个消息,同时希望在同一个事务中等待接收该消息的回复,那么程序将被挂起,因为知道事务提交,发送操作才会真正执行。
需要注意的还有一个,消息的生产和消费不能包含在同一个事务中。
2ActiveMQ
ActiveMQ是apache旗下开源消息中间件,是目前最流行的开源的消息中间件。
ActiveMQ功能特点:
●支持跨语言的客户端,如:
Java,C和C++,C#,Ruby,Perl,Python和PHP。
●在JMS客户端和消息代理都全面支持企业集成模式。
●支持许多高级功能,如:
信息组,虚拟目的地,通配符和复合目的地。
●完全支持JMS1.1和J2EE1.4。
●支持Spring,以便ActiveMQ可以很容易地嵌入到Spring应用程序和使用Spring的XML配置机制。
●通过了常见J2EE服务器(如Geronimo,JBoss4,GlassFish,WebLogic)的测试。
●支持可插拔传输协议,如:
in-VM,TCP,SSL,NIO,UDP,multicast,JGroupsandJXTA传输。
●支持通过JDBC和journal提供高速的消息持久化。
●设计基于高性能集群,客户端服务器,对等通信。
●Ajax支持网络流媒体,支持使用纯DHTML的Web浏览器,允许Web浏览器成为消息传递结构的一部分。
●支持CXF和Axis,以便ActiveMQ可以很容易地进入这些Web服务并提供可靠的消息传递。
●可作为一个在内存中的JMS提供者,是JMS的单元测试的理想选择。
2.1安装ActiveMQ
可以从官方网站(http:
//activemq.apache.org/)下载最新版的ActiveMQ。
(最新版的为:
5.4.2)
2.2启动ActiveMQ
在下载最新的ActiveMQ将其解压到相应的目录就可以了。
需要启动ActiveMQ只要找到${activemq.home}/bin目录,双击运行activemq.bat就可以了(windows版本)。
启动后的界面如上图。
(ActiveMQ5.3.0版本启动后的截图,不同版本会有所不同)
Listeningforconnectionsat:
tcp:
//10.10.40.174:
61616(这里的IP显示的是机器名称)
tcp:
//10.10.40.174:
61616表示监听的端口地址,也就是编写程序时,获取连接进用到的URL。
ActiveMQConsoleathttp:
//10.10.40.174:
8161/admin
http:
//10.10.40.174:
8161/admin这个是新版本的activeMQ提供的管理工具访问地址,可以查看队列详情,生产者,消费者等信息。
2.3配置ActiveMQ
2.3.1基本配置说明
ActiveMQ默认使用的是XML格式配置,配置文件在${activemq.home}/conf目录下,文件名为activemq.xml
xmlversion="1.0"encoding="GBK"?
>
--STARTSNIPPET:
example-->
xmlns="http:
//www.springframework.org/schema/beans"
xmlns:
amq="http:
//activemq.apache.org/schema/core"
xmlns:
xsi="http:
//www.w3.org/2001/XMLSchema-instance"
xsi:
schemaLocation="http:
//www.springframework.org/schema/beanshttp:
//www.springframework.org/schema/beans/spring-beans-2.0.xsd
http:
//activemq.apache.org/schema/corehttp:
//activemq.apache.org/schema/core/activemq-core.xsd">
--Allowsustousesystempropertiesasvariablesinthisconfigurationfile-->
file:
${activemq.base}/conf/credentials.properties
--
TheelementisusedtoconfiguretheActiveMQbroker.
-->
--persistent="true"表示要持久化存储消息,和子元素persistenceAdapter结合使用-->
--dataDirectory默认的存储持久化数据的目录-->
--brokerName设置broker的name,在注意在网络上必须是唯一的-->
//activemq.apache.org/schema/core"brokerName="Test_ActiveMQ"persistent="false"dataDirectory="${activemq.base}/data"destroyApplicationContextOnStop="true">
--
ForbetterperformancesuseVMcursorandsmallmemorylimit.
Formoreinformation,see:
http:
//activemq.apache.org/message-cursors.html
Also,ifyourproduceris"hanging",it'sprobablyduetoproducerflowcontrol.
Formoreinformation,see:
http:
//activemq.apache.org/producer-flow-control.html
-->
"producerFlowControl="true"memoryLimit="1mb">
"producerFlowControl="true"memoryLimit="1mb">
--UseVMcursorforbetterlatency
Formoreinformation,see:
http:
//activemq.apache.org/message-cursors.html
-->
--
ThemanagementContextisusedtoconfigurehowActiveMQisexposedin
JMX.Bydefault,ActiveMQusestheMBeanserverthatisstartedby
theJVM.Formoreinformation,see:
http:
//activemq.apache.org/jmx.html
-->
--与jmx相关的配置,是否启用jmx-->
--
Configuremessagepersistenceforthebroker.Thedefaultpersistence
mechanismistheKahaDBstore(identifiedbythekahaDBtag).
Formoreinformation,see:
http:
//activemq.apache.org/persistence.html
-->
--消息持久化方式建议使用kahadb-->
--
ThesystemUsagecontrolsthemaximumamountofspacethebrokerwill
usebeforeslowingdownproducers.Formoreinformation,see:
http:
//activemq.apache.org/producer-flow-control.html
-->
--
ThetransportconnectorsexposeActiveMQoveragivenprotocolto
clientsandotherbrokers.Formoreinformation,see:
http:
//activemq.apache.org/configuring-transports.html
-->
--ActiveMQ监听地址,用于收发消息-->
//0.0.0.0:
61616"/>
--
Enablewebconsoles,RESTandAjaxAPIsanddemos
ItalsoincludesCamel(withitswebconsole),see${ACTIVEMQ_HOME}/conf/camel.xmlformoreinfo
Takealookat${ACTIVEMQ_HOME}/conf/jetty.xmlformoredetails
-->
--引入jetty配置,与管理工具控制台相关-->
--ENDSNIPPET:
example-->
2.3.1.1Kahadb配置说明
配置示例:
journalMaxFileLength="32mb"
checksumJournalFiles="true"
checkForCorruptJournalFiles="true"
/>
KahaDB的各个可配置属性:
属性
默认值
描述
directory
activemq-data
保存messagestore数据文件的目录
indexWriteBatchSize
1000
批量更新索引的阀值,当要更新的索引到达这个索引时,批量更新到metadatastore中
indexCacheSize
10000
指定metadatacache的大小
enableIndexWriteAsync
false
写入索引文件到metadatastore中的方式是否采用异步写入
journalMaxFileLength
32mb
消息持久数据文件的大小
enableJournalDiskSyncs
true
如果为true,保证使用同步写入的方式持久化消息到journal文件中
cleanupInterval
30000
清除(清除或归档)不再使用的journal文件的时间周期(毫秒)。
checkpointInterval
5000
写入索引信息到metadatastore中的时间周期(毫秒)
ignoreMissingJournalfiles
false
是否忽略丢失的journal文件。
如果为false,当丢失了journal文件时,broker启动时会抛异常并关闭
checkForCorruptJournalFiles
false
如果为true,broker在启动的时候会检测journal文件是否损坏,若损坏便尝试恢复它。
checksumJournalFiles
false
如果为true。
KahaDB为journal文件生产一个checksum,以便能够检测journal文件是否损坏。
archiveDataLogs
false
如果为true,当达到cleanupInterval周期时,会归档journal文件而不是删除
directoryArchive
null
指定归档journal文件存放的路径
databaseLockedWaitDelay
10000
在使用主从数据库备份时,等待获取DB上的lock的延迟时间。
maxAsyncJobs
10000
等待写入journal文件的任务队列的最大数量。
应该大于或等于最大并发producer的数量。
配合并行存储转发属性使用。
concurrentStoreAndDispatchTransactions
false
如果为true,转发消息的时候同时提交事务
concurrentStoreAndDispatchTopics
false
如果为true,转发Topic消息的时候同时存储消息的messagestore中。
concurrentStoreAndDispatchQueues
true
如果为true,转发Queue消息的时候同时存储消息到messagestore中。
2.3.2安全性配置说明
(以5.3.0的版本为例,各个版本配置会有所不同,需查阅相应资料)
访问activeMQ权限配置是在${activemq.home}/conf目录下的activemq.xml中配置的,默认是没有进行配置,任何用户都是可以访问activeMQ。
如果需要对访问权限进行控制可以进行相应配置,可以指定到相应队列的访问权限。
1.配置activemq.xml
配置权限需要在,activemq.xml的元素中加入以下部分。
//queue=">"对应的是所有队列
//read=”admins”表示admins组的所有用户都可以消费前面queue属性指定的队列的消息
//write="admins"表示admins组的所有用户都可以向前面queue属性指定的队列发送消息
//admin="admins"表示admins组的所有用户可以在前面queue属性指定的队列不存在的情况创建队列
"read="admins"write="admins"admin="admins"/>
//queue="TEST.>"表示队列名称所有以”TEST.”(包含“.”)开头的队列,(这里建议队列名称以“.”作分隔符)
"read="users"write="users"admin="users"/>
"read="users"write="users"admin="users"/>
//write="guests,users"adm