ActiveMQ 1
下载安装ActiveMQ网上有N多例子,就不说什么了..
只有这点不同.我在使用5.9版本时,启动时需要./activemqstart,网上说./activemq直接就可以.
JMS确认机制
Session javax.jms.Connection.createSession(boolean transacted, int acknowledgeMode) throws JMSException
transacted是决定是否启动事务,
true启动事务
事务被提交的时候,确认自动发生.
false非事务
非事务何时确认取决于:acknowledgeMode
这段摘自ActiveMQ
在非事务性会话中,消息何时被确认取决于创建会话时的应答模式(acknowledgementmode)。
该参数有以下三个可选值:
Session.AUTO_ACKNOWLEDGE。当客户成功的从receive方法返回的时候,
或者从MessageListener.onMessage方法成功返回的时候,会话自动确认
客户收到的消息。
Session.CLIENT_ACKNOWLEDGE。客户通过消息的acknowledge方法确认消
息。需要注意的是,在这种模式中,确认是在会话层上进行:确认一个被
消费的消息将自动确认所有已被会话消费的消息。例如,如果一个消息消
费者消费了10个消息,然后确认第5个消息,那么所有10个消息都被确
认。
Session.DUPS_ACKNOWLEDGE。该选择只是会话迟钝的确认消息的提交。如
果JMSprovider失败,那么可能会导致一些重复的消息。如果是重复的
消息,那么JMSprovider必须把消息头的JMSRedelivered字段设置为
true。
发送和接收,以及Persistence
JMS有两种模式
Queue
session.createQueue("Test")
当1个发送者P,2个消费者C1,C2
需要注意的是,P发送了3条消息,结果是C1接收2条,C2接收1条.(大多数情况)
即每条消息,只会有一个消费者收到.Queue模式特点.
当producer.setDeliveryMode(DeliveryMode.PERSISTENT);时,如果没有消费者接收,那么会将这条记录持久化,等待消费者下次启动接收.
Topic
多称呼这种模式为Pub-Sub.发布-订阅
session.createTopic("Test")
当1个发送者P,2个消费者C1,C2
P发送了3条消息,结果是C1接收3条,C2接收3条.
当producer.setDeliveryMode(DeliveryMode.PERSISTENT);时,
要看有没有持久订阅这个Topic的消费者.如果有,会将这条消息持久化保存,供持久订阅者下次启动时接收.
持久订阅的方式是
... connection.setClientID($ClientId); ... Topic topic = new ActiveMQTopic("Test"); MessageConsumer consumer = session.createDurableSubscriber(topic, $Name); ...
持久订阅必须指定$ClientId和$Name,由这两个属性联合成一个唯一订阅者标识.
ActiveMQ会记录每个持久订阅者的最后订阅的消息号(LAST_ACKED_ID).
下面是一些activeMQ存储方式性能对比,
仅供参考
KahaDB10W
PERSISTENT26291ms
NON_PERSISTENT2095ms
MySQLDB10W
PERSISTENT152362ms
NON_PERSISTENT2008ms
LevelDB10W
PERSISTENT43593ms
NON_PERSISTENT1576ms
ReplicationLevelDB10W
PERSISTENT48826ms
NON_PERSISTENT1576ms