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

相关推荐