Задержка отправки почты до совершения транзакции

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

4 ответа

Решение

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

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

TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
    @Override
    public void afterCommit() {
        super.afterCommit();
        sendEmail();
    }
});

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

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

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

Другие вопросы по тегам