我试图使用Spring jmstemplate.receive(String)方法以同步模式从队列中获取所有消息.
问题是我总是只收到一条消息.这是代码:
@Transactional
public Listjmstemplate.receive(destination)) != null) {
messages.add(message);
}
return messages;
}
如果我删除了@Transactional注释,我会收到所有消息,但所有消息都是在事务中完成的,所以如果稍后在处理这些消息时会有一个例外,消息将会丢失.
这是我的jmstemplate bean的定义.
jmstemplate" class="org.springframework.jms.core.jmstemplate">
最佳答案
我会回复自己.看起来jmstemplate不支持它.暂时解决它的唯一方法是扩展jmstemplate并添加使用jmstemplate部分的新方法.不幸的是,有些方法是私有的,所以需要复制它们……
public class CustomQueuejmstemplate extends jmstemplateDelegate {
public ListetoLiveInMillis();
}
// START OF MODIFIED CODE
ListNowledge(session)) {
// Manually ackNowledge message,if any.
for (Message retrievedMessages : messages) {
retrievedMessages.ackNowledge();
}
}
return messages;
}
finally {
JmsUtils.closeMessageConsumer(consumer);
}
}
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();
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。