JMS - это форма асинхронного обмена сообщениями, поэтому издатели и подписчики отделены друг от друга.Это означает, что нет механизма, чтобы делать то, что вы просите.Для подписчиков, которые активны на момент публикации, они будут использовать сообщение, не имея возможности вовремя получить сообщение об удалении, чтобы действовать в соответствии с ним.Если подписчик находится в автономном режиме, то он будет, но асинхронные сообщения должны быть атомарными.Если вы приступите к разработке ответа другого респондента (создайте сообщение об удалении и потребует повторного подключения потребителей, чтобы прочитать всю очередь в поисках сообщений об удалении), то вы создадите ситуацию, в которой поведение системы будет различаться в зависимости от того, подписчик или нетбыл в сети или нет в то время, когда была опубликована конкретная комбинация сообщение / удаление.Существует также условие гонки, при котором подписчик завершает чтение сохраненных сообщений непосредственно перед тем, как издатель отправит сообщение об удалении.Это означает, что вы должны вкладывать существенную логику в подписчиков, чтобы согласовать эти условия и даже больше, чтобы согласовать состояние гонки.
Принятый метод выполнения этого называется так называемыми "компенсационными транзакциями".В любой системе, где производитель и потребитель не совместно используют одну единицу работы или разделяют общее состояние (например, используют одну и ту же БД для хранения состояния), тогда для возврата или исправления предыдущей транзакции требуется вторая транзакция, которая переворачивает первую.Конечно, потребитель должен быть в состоянии правильно применить компенсационную транзакцию.Когда используется этот шаблон, результатом является то, что все подписчики демонстрируют одинаковое поведение независимо от того, используются ли сообщения в режиме реального времени или в пакете после перезапуска потребителя.
Обратите внимание, что компенсирующая транзакция отличается от «удаления сообщения».Сообщение об удалении, предложенное в ответе другого респондента, является формой командования и управления, которая влияет на сам поток сообщений.С другой стороны, компенсирующие транзакции влияют на состояние системы через транзакционные обновления состояния системы.
Как правило, вы никогда не хотите управлять состоянием системы, манипулируяпоток сообщений с функциями управления и контроля.Это хрупкий, подверженный атакам и очень сложный для аудита или отладки.Вместо этого разработайте систему для доставки каждого сообщения с учетом ограничений по качеству обслуживания и обработки всех сообщений.Обрабатывать изменения состояния (включая отмену предыдущего действия) целиком в приложении.
Например, в банковском деле, где транзакции вызывают вторичные эффекты, такие как сборы за овердрафт, обычной процедурой является «запоминание» транзакций во времядень, затем отсортируйте и примените их в пакете после закрытия банка.Это позволяет примирить ошибку до , что приводит к выплате овердрафта.В последнее время транзакции применяются в режиме реального времени, но триггеры удерживаются до закрытия дневных книг, и это приводит к тому же результату.