初识ActiveMQ

来源:互联网 发布:java tcp编程实例 编辑:程序博客网 时间:2024/06/06 02:55

一、下载与安装部署

1、下载:ActiveMQ

2、解压文件,运行bin目录的win64(64位)/win32(32位)目录下的InstallService.bat。安装服务成功后,再次运行会提示:

wrapper  | CreateService failed - 指定的服务已存在。 (0x431) 

证明服务已经安装成功。

3、运行activemq.bat,启动服务。

         注:第一次启动可能会报java.lang.IllegalStateException: BeanFactory not initialized or already closed - call 'refresh' before accessing beans via the ApplicationContext... ...错误,可以尝试禁用Internet Connection Sharing (ICS)服务来解决。

        启动成功后会提示:access to all MBean is allowed

4、打开浏览器,地址栏输入:http://localhost:8161/admin 即可进入web console

        初始账号密码都为admin。

二、有关持久化消息(AMQ Message Store)

1、AMQ Message Store是AcitveMQ 5及以上的版本提供的存储策略,是一个可嵌入事务消息存储的解决方案。

2、消息会被存储在Data log里面,他是一个放在data\kahadb目录下一个32M大小的log文件,这个文件大小是可以通过配置文件来修改的,当存储在这个文件中的所有消息被成功的消费掉的时候,这个文件会被标记为“删除”或者“归档”状态,删除或归档的动作将在下次clean up时期(默认30sclean一次,可在持久化适配器中更改“cleanupInterval”属性进行配置)被执行。

3、默认情况下ActiveMQ会使用AMQ Store来持久化消息,但可以explictly defining 他的persistence adapter (amqPersistenceAdapter)来改变配置。

<broker brokerName="broker" persistent="true" useShutdownHook="false">   <persistenceAdapter>     <amqPersistenceAdapter directory="${activemq.base}/activemq-data" maxFileLength="32mb"/>   </persistenceAdapter>   <transportConnectors>     <transportConnector uri="tcp://localhost:61616"/>   </transportConnectors> </broker>
将此代码段按自己需求修改后添加在conf/activemq.xml中。

amqPersistenceAdapter的相关属性如下:


三、有关Replicated LevelDB Store

Replicated LevelDB Store作为持久化消息的高性能和高可靠的策略。

其中的LevelDB是一个google实现的非常高效的kv数据库(非关系型(NoSQL)数据库)。

Replicated LevelDB Store使用Apache ZooKeeper

(highly reliable distributed system coordination service)

一种高可靠的分布式系统协调服务来管理Master-Slave式的ActiveMQ Brokers


ZooKeeper来协调集群中哪一个节点作为Master,
被选择的Master Broker节点启动并接受Client的链接,
其他的节点转到Slave模式,连接到Master并同步自己的持久化状态(persistent state “/w it”)。
Slave节点不与Client相连接,所有的持久化操作被复制到(connected)Slave节点。

如果Master挂掉,其中一个Slave节点将晋升为Master,

之前挂掉的Master在Online之后进入Slave模式。

所有需要同步到磁盘的持久化的消息操作,

只有在更新了所有的(quorum)Slave节点成功后才会完成。

这里有点疑问:be replicated to a quorum of the nodes中quorum size的计算

官方网站上写到:如果配置 replicas="3" 则 quorum size = 3/2+1 = 2

意思是说:

At least (replicas/2)+1 nodes must be online to avoid service outage.

Master在报告持久化成功信息之前会存储本地更新并等待Slave保存最近的更新成功。

这个存储操作会同步复制更新到quorum的nodes,然后异步的复制到额外的nodes。

官方建议:
1、最少使用3个复制节点。
2、Client端建议使用Failover Transport来链接broker nodes

例如:

failover:(tcp://broker1:61616, tcp://broker2:61616, tcp://broker3:61616)

3、建议至少run起来3个ZooKeeper来确保服务的高可用性。

4、建议使用主机名或者ip地址配置hostname属性,

因为自动配置的hostname不能确保其他集群成员

一定能够访问到以建立与Master用来同步持久化信息的会话

关于配置:

可以通过LevelDB的persistence adapter来配置ActiveMQ

如下:

<broker brokerName="broker" ... >      ...     <persistenceAdapter>       <replicatedLevelDB         directory="activemq-data"         replicas="3"         bind="tcp://0.0.0.0:0"         zkAddress="zoo1.example.org:2181,zoo2.example.org:2181,zoo3.example.org:2181"         zkPassword="password"         zkPath="/activemq/leveldb-stores"         hostname="broker1.example.org"         />  </persistenceAdapter>  ...</broker>

persistence adapter的详细属性见下图:



Warning:

LevelDB还不支持“Delay and Schedule Message Delivery”;

Delay and Schedule Message 存储在分离的

“non-replicated”(非复制的)“kahaDB data files”中;

如果将这类消息用于Replicated LevelDB Store 中会发生不可预知的结果。


四、有关Delay and Schedule Message Delivery

5.4版本开始,ActiveMQ开始支持持久化Schedule到broker,需在XML配置文件中设置broker的SchedulerSupport属性为“ture”。

Warning:

message属性“scheduledJobId”是一个为“Job Schedule”保留的一个属性,如果在发送消息前,给这个属性赋值,那么消息会立即被发送出去并且没有Schedule;

Also,在一个Schedule Message被接收到以后,属性“scheduleJobId”将会被赋值(?)。

So be careful!(keep this in mind if using something like a Camel Route which might automatically copy properties over when re-sending a message.)

有关Cron表达式:

Cron是一个字符串,格式如下:


Seconds Minutes Hours DayofMonth Month DayofWeek Year” 

Seconds Minutes Hours DayofMonth Month DayofWeek


每个字段描述如下:

字段

定义域

特殊字符

0-59

, - * /

分钟

0-59

, - * /

小时

0-23

, - * /

日期

1-31

, - * ? / L W C

月份

1-12/JAN-DEC

, - * /

星期

1-7/SUN-SAT

, - * ? / L C #

年(可选)

1970-2099

, - * /













“,”   :列表元素间隔符;如:1,2,3;

“-”   :连续区间间隔符;如:1-3;

“*”  :通配符,代表所有可能的值;

“/”  :后跟间隔时间;如:(8-18)/4,每隔4(小时/分钟/...)触发一次;

“?”  :只能用在DayofMonth和DayofWeek两个域;两个中必有一个“?”;

“L”  :只能出现在DayofWeek和DayofMonth域,如在DayofWeek域使用5L,意味着在最后的一个星期四触发;

“W” :表示有效工作日(周一到周五),只能出现在DayofMonth域,系统将在离指定日期的最近的有效工作日触发事件。例如:在 DayofMonth使用5W,如果5日是星期六,则将在最近的工作日:星期五,即4日触发。如果5日是星期天,则在6日(周一)触发;如果5日在星期一到星期五中的一天,则就在5日触发。另外一点,W的最近寻找不会跨过月份;

“LW”:表示在某个月最后一个工作日,即最后一个星期五;

“#”  :表示每个月第几个星期几,只能出现在DayofMonth域。例如在1#2,表示某月的第二个星期日。

注:星期是从“周日-周六” == “1-7”。

Message Delivery示例代码:

1、 AMQ_SCHEDULED_DELAY

MessageProducer producer = session.createProducer(destination);TextMessage message = session.createTextMessage("test msg");long time = 60 * 1000;message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, time);producer.send(message);

2、AMQ_SCHEDULED_REPEAT 

AMQ_SCHEDULED_PERIOD 

AMQ_SCHEDULED_DELAY

MessageProducer producer = session.createProducer(destination);TextMessage message = session.createTextMessage("test msg");long delay = 30 * 1000;long period = 10 * 1000;int repeat = 9;message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, delay);message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_PERIOD, period);message.setIntProperty(ScheduledMessage.AMQ_SCHEDULED_REPEAT, repeat);producer.send(message);

3、AMQ_SCHEDULED_CRON(每小时的0秒开始触发10次,每次间隔1秒触发)

MessageProducer producer = session.createProducer(destination);TextMessage message = session.createTextMessage("test msg");message.setStringProperty(ScheduledMessage.AMQ_SCHEDULED_CRON, "0 * * * *");message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, 1000);message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_PERIOD, 1000);message.setIntProperty(ScheduledMessage.AMQ_SCHEDULED_REPEAT, 9);producer.send(message);






0 0
原创粉丝点击