Задержка отправки почты до совершения транзакции - PullRequest
2 голосов
/ 03 ноября 2010

У кого-нибудь есть хороший учебник или несколько советов о том, как реализовать собственный XAResource? Мне нужно, чтобы SpringSender был транзакционным, так что письмо будет отправлено только после фиксации транзакции, и, похоже, не существует никакой транзакционной оболочки.

Ответы [ 4 ]

2 голосов
/ 31 августа 2017

Вы можете использовать TransactionSynchronizationManager.registerSynchronization (например, gpeche ) с TransactionSynchronizationAdapter, который имеет различные методы, которые вызываются на разных этапах текущей транзакции.Я думаю, что наиболее подходящий метод для этого вопроса - afterCommit .

TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
    @Override
    public void afterCommit() {
        super.afterCommit();
        sendEmail();
    }
});
2 голосов
/ 06 ноября 2010

Если вам просто нужно дождаться коммита, как вы сказали в комментарии, вы можете исследовать, используя TransactionSynchronizationManager.registerSynchronization(), чтобы инициировать отправку электронной почты при коммите.

1 голос
/ 11 мая 2013

Еще одна опция рядом с упомянутой gpeche - отправка транзакционного JMS-сообщения изнутри транзакции. Затем позвольте слушателю сообщения (например, компоненту MDB) отправить электронное письмо.

Еще одна хитрость в EJB - планирование таймера внутри транзакции. Таймер также является транзакционным и будет запущен только после фиксации транзакции. Просто используйте таймер с тайм-аутом = 0, чтобы он запускался сразу после фиксации транзакции.

1 голос
/ 03 ноября 2010

Я сомневаюсь, что возможно реализовать настоящий XAResource для SMTP. Должна быть поддержка транзакций в диспетчере ресурсов (в данном случае SMTP-сервер), и я не верю, что они есть. Я бы сказал, что ваша лучшая ставка - шаблон «Последний коммит ресурса», который позволяет одному ресурсу не XA участвовать в транзакции XA. Поиск в Google, есть много информации. Большинство серверов Java EE поддерживают это.

...