activeMq使用总结

流程图

è¿éåå¾çæè¿°

点对点与订阅发送

同步发送与异步发送 
activeMQ发送消息客户端发送消息分为同步发送与异步发送

同步发送,发送者发送一条消息会阻塞直到broker反馈一个确认消息给发送者,表示消息已经被broker处理。这个机 制提供了消息的安全性保障,由于是阻塞的操作,会影响到客户端消息发送的性能。

异步发送,发送者不需要等待broker提供反馈给发送者,性能相对较高。但是可能会出现消息丢失的情况。所 以使用异步发送的前提是在某些情况下允许出现数据丢失的情况。

那么在什么情况下选择同步发生,什么情况下是选择异步发送呢? 
除去我们人为设置的方式,其默认的选择策略总结如下: 
1.非持久化的消息都是异步发送的。 
2.持久化消息在非事务模式下是同步发送的。 
3.在开启事务的情况下,消息都是异步发送。 
由于异步发送的效率会比同步发送性能更高,在发送持久化消息的时候,尽量去开启事务会话。或者设置使用异步发送。

使用方面采用集成spring jms

配置如下

生产者如下

两种模式区分在 new ActiveMQQueue() 或者 new ActiveMQTopic()

 消费者如下

队列和订阅消息均使用注解,通过connectionFactory区分监听类型

至次基本的配置使用已经基本结束 

网上好多帖子是导入active-all的jar包,这个jar包出里面太多的类和apache spring slf4j等从包名到类名一模一样,不知是何意思,引入的话就是各种冲突

我这边引入的是spring-jms和activemq-pool的包(排除slf4j)

至于mq的持久化,我们使用场景是为了缓解高并发下日志的写入带来的io负载,专门有监听程序会处理消息数据,无需持久化,还能提升性能

持久化参考链接

还有activemq的 预取策略不知为何配置无效

MQ客户端显示预取值已生效,但是不管配置多少,监听器都是平均消费,猜测可能是@JmsListener内部实现的缘故,查未果

下面为理论执行结果

队列堆积10条消息,prefetch设置为10,执行结果如下

prefetchSize设置为5,执行结果如下

prefetch配置参考