Допустим, я пишу следующий код (чисто автономная Java с Atomikos, без Spring, без JavaEE, без bean-компонентов):
XASession session = conn.createXASession();
MessageConsumer consumer = session.createConsumer(session.createQueue("QNAME"));
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
//some logic involving other XA resources
}
});
Очевидно, что я не рассказал своему XASession
о своем TransactionManager
или наоборот, поэтому полученное сообщение не относится ни к одной транзакции.Могу ли я как-то это изменить?Я думал об этом:
XASession session = conn.createXASession();
MessageConsumer consumer = session.createConsumer(session.createQueue("QNAME"));
Transaction tx;
tm.begin(); //tm is TransactionManager
tx = tm.getTransaction();
tx.enlistResource(session.getXAResource());
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
//some logic involving other XA resources
tm.commit();
tm.begin();
tx = tm.getTransaction();
tx.enlistResource(session.getXAResource());
}
});
Но меня беспокоит, что
- межпотоковые транзакции XA - это не вещь
- , если сообщение неприходить долго брокер будет время ожидания транзакции