提问人:bro 提问时间:9/28/2023 最后编辑:Justin Bertrambro 更新时间:9/28/2023 访问量:36
message.acknowledge() 在使用 Spring Boot 在 ActiveMQ 中读取消息后不会将消息取消排队
message.acknowledge() doesn't dequeue the messages after they have been read in ActiveMQ with Spring Boot
问:
我正在尝试通过其内容中的 ID 读取队列,然后使用 Spring Boot 和 ActiveMQ Classic 将它们取消排队。
为此,我创建了下面的代码。代码根据 requestId 从响应中提取 a 队列,执行一些操作然后返回。代码抓取队列没有任何问题。但它不是来自 ActiveMQ。dequeue
Object obj = jmsTemplate.browseSelected("responses", "requestId='"+id+"'", new BrowserCallback() {
@Override
public ResponseEntity<OperationResultResponse> doInJms(Session session, QueueBrowser browser) throws JMSException {
Enumeration<?> enumeration = browser.getEnumeration();
if (enumeration.hasMoreElements()) {
Message message = (Message) enumeration.nextElement();
// process the message
if (message instanceof ActiveMQObjectMessage objectMessage){
try{
// extract the requestId and put in QueueResponse object
QueueResponse queueResponse = (QueueResponse) objectMessage.getObject();
String requestId = queueResponse.getRequestId();
// some other operations..
return something...;
}catch (Exception exception){
// handle error
return new ResponseEntity<>( HttpStatus.INTERNAL_SERVER_ERROR);
}
}
}
// Handle the case where queue not exist
return new ResponseEntity<>( HttpStatus.NOT_FOUND);
}
为了解决这个问题,我添加到块中,然后将 更改为,但它没有任何效果。我也试图添加,但仍然没有效果。message.acknowledge()
try
acknowledge-mode
client
session.close()
我跟踪了调试器,我注意到在函数中,是 .这使得代码不执行我认为。我不知道如何使它非空。acknowledge
acknowledgeCallback
null
acknowledge
public void acknowledge() throws JMSException {
if (this.acknowledgeCallback != null) {
try {
this.acknowledgeCallback.execute();
} catch (JMSException var2) {
throw var2;
} catch (Throwable var3) {
throw JMSExceptionSupport.create(var3);
}
}
}
答:
2赞
Justin Bertram
9/28/2023
#1
这里的问题是您使用的是 中的 browseSelected
方法。此方法的 JavaDoc 指出:org.springframework.jms.core.JmsTemplate
浏览 JMS 队列中的选定消息。回调提供对 JMS 会话和 QueueBrowser 的访问,以便浏览队列并对内容做出反应。[强调我的]
使用 QueueBrowser
检查消息时,无法将其从队列中删除。JavaDoc 的状态如下:QueueBrowser
客户端使用 QueueBrowser 对象查看队列中的消息,而不删除它们。
尝试以不同的方式接收消息(例如,使用 doReceive
)。
评论