我有一些我需要重构的旧代码,它具有JMS的编程事务管理。Spring JMS - 声明式事务管理使用注释
有一个计划的服务,它可以同步读取所有消息(使用JMS)并逐个处理它们。我正在使用JmsTransactionManager
进行交易。我可以用声明式事务管理使用注释来管理每封邮件我的交易,而不是他们的管理程序,像这样:
//code from scheduled service's run method
private void run()
{
javax.jms.Message jmsMessage = null;
do
{
TransactionStatus status = null;
try
{
status = jmsTransactionManager.getTransaction(new DefaultTransactionDefinition());
jmsMessage = jmsTemplate.receive(heldTransmissionDestination);
if(jmsMessage != null)
{
process(jmsMessage);
jmsMessage.acknowledge(); //session is still open within the transaction
}
jmsTransactionManager.commit(status);
}
catch(Exception e)
{
logger.error("Exception: ", e);
if(status != null)
{
jmsTransactionManager.rollback(status);
logger.info("JMSTransaction rollback successful");
}
//since an exception occured, break out of the do-while
break;
}
}
while(jmsMessage != null);
}
请注意,此代码的工作。为JmsTemplate的配置已sessionTrasacted设置为true,如下图所示:
// from config
@Bean
public JmsTemplate jmsTemplate() {
JmsTemplate jmsTemplate = new JmsTemplate();
jmsTemplate.setSessionTransacted(true);
// ... other stuff ommited for brevity
return jmsTemplate;
}