activemq手动应答失效

无福卷毛 2019-04-11 01:47:00

```
spring:
activemq:
broker-url: tcp://***.***.***.***:61616
user: admin
password: admin
send-timeout: 0ms
jms:
pub-sub-domain: true
```

```
@Configuration
public class ActivemqConfig {

@Bean
public Queue ackQueue() {
return new ActiveMQQueue("ackQueue");
}

/***
* AUTO_ACKNOWLEDGE = 1 自动确认 CLIENT_ACKNOWLEDGE = 2 客户端手动确认 DUPS_OK_ACKNOWLEDGE = 3 自动批量确认
* SESSION_TRANSACTED = 0 事务提交并确认
*/
@Bean
public JmsListenerContainerFactory<?> ackQueueListener(ConnectionFactory connectionFactory) {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setPubSubDomain(false);
factory.setSessionTransacted(false);
factory.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
factory.setConnectionFactory(connectionFactory);
return factory;
}
}

```

```
@ResponseBody
@RequestMapping("/mq/queue/ack")
public void queueAck(HttpServletRequest request, HttpServletResponse response) {
log.info("queueAck.send");
Message message = new ActiveMQMessage();
try {
message.setStringProperty("value", "value_content");
} catch (JMSException e) {
e.printStackTrace();
}
jmsTemplate.convertAndSend(ackQueue, message);
}
```
```
@JmsListener(destination = "ackQueue", containerFactory = "ackQueueListener")
public void ackQueueConsumerWithoutException(Message message) {
try {
log.info("ackQueueConsumerWithoutException:" + message.getStringProperty("value"));
Thread.sleep(5000);
log.info("i'm not ack");
} catch (Exception e) {
e.printStackTrace();
}
}
```

每次发送一个消息 结束自动出队 看着是ack了 但我没有手动ack
...全文
109 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
无福卷毛 2019-04-16
  • 打赏
  • 举报
回复
当我们关系事务,并且设置接受模式为CLIENT_ACKNOWLEDGE,发现并没有起作用。原因如下(源码自动转为自动确认了):
//org.springframework.jms.listener.AbstractMessageListenerContainer
```
protected void commitIfNecessary(Session session, @Nullable Message message) throws JMSException {
if (session.getTransacted()) {
if (this.isSessionLocallyTransacted(session)) {
JmsUtils.commitIfNecessary(session);
}
} else if (message != null && this.isClientAcknowledge(session)) {
message.acknowledge();
}

}
```
目前可以使用一下配置达到手动确认的目的:
```
@Bean
public JmsListenerContainerFactory<?> ackQueueListener(ConnectionFactory connectionFactory) {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setPubSubDomain(false);
factory.setSessionTransacted(false);
factory.setSessionAcknowledgeMode(4);
factory.setConnectionFactory(connectionFactory);
return factory;
}
```

50,530

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧