如何在不從隊列中刪除原始消息的情況下從WebSphere MQ讀取消息。spring jmstemplate讀取消息而不刪除(WebSphere MQ)
我有Spring應用程序,它從WebSphere MQ讀取消息。 閱讀後,我有一個處理方法,它將處理從隊列中檢索的數據。
步驟1
response = jmsTemplate.receive();
//Message automatically removed from queue.
步驟2
process(response);
,我們在處理方法拋出異常的機會。在例外的情況下,我需要將消息保留在隊列中。 這可能嗎?他們有什麼辦法只在用戶確認時刪除郵件?我嘗試添加
jmsTemplate.setSessionAcknowledgeMode(javax.jms.Session.CLIENT_ACKNOWLEDGE);
但仍然消息正在被刪除。
請幫忙!!
JmsTemplate的創建代碼段
JndiConnectionFactorySupport connectionFactoryBean = new JndiConnectionFactorySupport();
connectionFactoryBean.setBindingsDir(this.bindingDir);
connectionFactoryBean
.setConnectionFactoryName(connectionFactoryName);
connectionFactoryBean.afterPropertiesSet();
jmsTemplate.setConnectionFactory(connectionFactoryBean.getObject());
JndiDestinationResolver destinationResolver = new JndiDestinationResolver();
destinationResolver.setJndiTemplate(connectionFactoryBean
.getJndiTemplate());
jmsTemplate.setDestinationResolver(destinationResolver);
jmsTemplate.setReceiveTimeout(20000);
jmsTemplate.setDefaultDestinationName(this.defaultDestinationName);
試過jmsTemplate.execute()方法,如下
@SuppressWarnings({ "unused", "unchecked" })
Message responseMessage = (Message) jmsTemplate.execute(
new SessionCallback() {
public Object doInJms(Session session)
throws JMSException {
MessageConsumer consumer = session
.createConsumer(jmsTemplate.getDestinationResolver().resolveDestinationName(session, "QUEUE_NAME", false));
Message response = consumer.receive(1);
try {
testMethod();//this method will throw exception.
response.acknowledge();
consumer.close();
} catch(Exception e){
consumer.close();//control will come here.
}
return response;
}
}, true);
我沒有使用JMS的XML配置。相反,JmsTemplate對象是使用java創建的。 (有問題添加了代碼片段) – user1940878