У меня есть простая программа, которая время от времени опрашивает таблицу БД и отправляет любую почту, на которую указывает таблица (используя javax.mail). Когда почта отправлена, я удаляю запись БД.
Я заметил две потенциальные проблемы
- Есть вероятность отправить письмо, а затем что-то выйдет из строя, поэтому запись в БД все еще существует. В следующий раз письмо будет отправлено снова.
- Может быть много почты для отправки, поэтому я загружаю все ожидающие записи, отправляю их все, а затем удаляю все записи БД. Если некоторые/все письма отправляются, что-то выходит из строя, и задание запускается снова, то оно дважды спамит многим людям.
Это не спам-приложение, поэтому я хочу попытаться избежать отправки чего-либо дважды, а также убедиться, что я никогда не смогу «потерять» сообщение.
Это общая проблема, я уверен, что есть два физических ресурса, которые не могут участвовать в транзакции (БД + что-то еще), поэтому мне было интересно, какие подходы люди используют для уменьшения/устранения проблем для этого случая и/или общий случай.