我有一些我需要重構的舊代碼,它具有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;
}