JMS用のプログラムによるトランザクション管理を持つリファクタリングが必要な古いコードがあります。Spring JMS - 注釈を使用した宣言的トランザクション管理
JMSを使用してすべてのメッセージを同期的に読み取り、一度に1つずつ処理するスケジュールされたサービスがあります。私は取引のために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のための構成は以下のように、trueに設定さsessionTrasactedました:
// from config
@Bean
public JmsTemplate jmsTemplate() {
JmsTemplate jmsTemplate = new JmsTemplate();
jmsTemplate.setSessionTransacted(true);
// ... other stuff ommited for brevity
return jmsTemplate;
}