Может ли JMS MessageListener запускать транзакции XA? - PullRequest
0 голосов
/ 09 декабря 2018

Допустим, я пишу следующий код (чисто автономная 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 - это не вещь
  • , если сообщение неприходить долго брокер будет время ожидания транзакции

1 Ответ

0 голосов
/ 10 декабря 2018

Я считаю, что вам нужно реализовать какую-то оболочку (аналогично тому, что сделано в Java EE и Spring), чтобы координировать действия с менеджером транзакций за кулисами для каждого сообщения, полученного до вашего onMessage вызывается и затем после onMessage.Чередование конца и начала различных транзакций в одном вызове onMessage кажется маловероятным, если удастся вообще функционировать.

...