activemq深入了解—队列模式手动控制消费
来源:互联网 发布:编程用什么手机 编辑:程序博客网 时间:2024/06/02 00:19
版权声明:本文为博主原创文章,未经博主允许不得转载。
相信经过了解,基本使用activemq后,大家一定知道队列里面有ACK模式,他的类型有以下几种
1、AUTO_ACKNOWLEDGE = 1 自动确认
2、CLIENT_ACKNOWLEDGE = 2 客户端手动确认
3、DUPS_OK_ACKNOWLEDGE = 3 自动批量确认
4、SESSION_TRANSACTED = 0 事务提交并确认
5、INDIVIDUAL_ACKNOWLEDGE = 4 单条消息确认(自定义ACK_MODE)
使用方式一般有
1、使用连接创建session
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
2、spring中配置
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="connectionFactory"></property>
<property name="defaultDestination" ref="destination"></property>
<property name="messageConverter" ref="jmsMessageConverter"></property>
<property name="sessionAcknowledgeMode" value="2" />
</bean>
注意:当我们只配置了这些,以为在消费者出获取消息调用message.acknowledge();方法就能控制消息的消费,很明显,不行!
查阅资料你会发现,当你获取消息的时候,默认的获取方法里面没有走你的这些配置直接就消费了消息,所以就达不到我们想要的效果,手动控制消费。所以,我们需要重写一个方法手动获取,但是带上自己的参数。
- /**
- * 接收消息
- * @param session
- * @param consumer
- * @param autoAcknowledge 是否开启手动消费
- * @return
- * @throws JMSException
- */
- protected Message doReceive(Session session, MessageConsumer consumer,Boolean autoAcknowledge) throws JMSException {
- try {
- this.consumer = consumer;
- //Use transaction timeout (if available).
- long timeout = 1000;
- Message message = doReceive(consumer, timeout);
- if (session.getTransacted()) {
- // Commit necessary - but avoid commit call within a JTA transaction.
- // 如果开启了jta事物,那么不会进行提交,jta事物会直接覆盖掉session事物
- if (isSessionLocallyTransacted(session)) {
- // Transacted session created by this template -> commit.
- //创建事物回话
- JmsUtils.commitIfNecessary(session);
- }
- }
- //autoAcknowledge如果为真,不进行自动确认
- else if (isClientAcknowledge(session) && !autoAcknowledge) {
- // Manually acknowledge message, if any.
- if (message != null) {
- message.acknowledge();
- }
- }
- return message;
- }
- finally {
- consumer = null;
- }
- }
- /**
- * 由于上面的doReceive(Session session, MessageConsumer consumer,Boolean autoAcknowledge)需要调用这个方法,
- * 而在父类里面这个方法是私有的,所以直接拷贝下来了
- * @param consumer
- * @param timeout
- * @return
- * @throws JMSException
- */
- private Message doReceive(MessageConsumer consumer, long timeout) throws JMSException {
- if (timeout == RECEIVE_TIMEOUT_NO_WAIT) {
- return consumer.receiveNoWait();
- }
- else if (timeout > 0) {
- return consumer.receive(timeout);
- }
- else {
- return consumer.receive();
- }
- }
文章来自 http://blog.csdn.net/yueding_h/article/details/54944254
- activemq深入了解—队列模式手动控制消费
- activemq深入了解—队列模式手动控制消费
- activeMQ深入了解—队列模式手动控制消费
- Java ActiveMQ 队列模式
- ActiveMQ 由浅入深之二(生产消费模式)
- ActiveMQ消息队列之java消息生产与消费
- 深入了解android消息队列
- java condition条件队列 生产者消费模式
- ActiveMQ—消息队列
- spring+activemq实战之配置监听多队列实现不同队列消息消费
- spring+activemq实战之配置监听多队列实现不同队列消息消费
- ActiveMQ消费重试机制
- 设计模式之深入了解
- 深入了解Intel保护模式
- ActiveMQ消息队列获取每个队列中的消费者数、剩余消息数、已消费数、队列名等信息 示例
- 深入了解双端队列Deque
- ActiveMQ 了解
- ActiveMQ 了解
- 异步下载文件更新进度条的步骤
- 《Spring Cloud Netflix》 -- 服务注册和服务发现-Eureka 的使用
- Python3 回朔法解决作业分配问题 (剪枝优化)
- 美国友人罗伯特先生、苏珊女士来访汪国新北京诗书画院
- List、MAP排序
- activemq深入了解—队列模式手动控制消费
- dp、sp、px、dpi、ppi、pt详解
- TCP服务器端和客户端程序设计
- spring中注解JSONObject,string类型转换为JSONObject以及JSONObject的遍历方法
- 巴什博弈(Bash Game)
- 公众号和小程序不能同名?现在可以了|微专辑
- LeetCode 2. Add Two Numbers
- QCustomPlot右键菜单
- 手机端 顽固存在的session