Мы создаем систему, которая будет отправлять сообщения из одного приложения в другое через JMS (используя Websphere MQ, если это имеет значение). Эти сообщения имеют форму «Создать х» или «Удалить х». (Конечным результатом этого является то, что сторонняя система должна быть проинформирована о сообщениях «Создать и удалить», поэтому конец чтения очереди JMS будет разговаривать с сторонней системой, в то время как конец записи JMS очередь просто передает сообщения, которые нужно обрабатывать)Отправка сообщений JMS и откат транзакций
Проблема, о которой мы беспокоимся, заключается в том, что одно из сообщений выходит из строя. Первоначальная мысль здесь состояла в том, чтобы просто откатить отказы в очереди JMS и позволить нормальному механизму повтора обрабатывать ее. Это работает до тех пор, пока вы не получите Delete, за которым следует Create для того же идентификатора, например.
- Удалить 123 - Сбой, откатывается на очереди
- Создать 123 - Удается
- Удалить 123 - Повторить от ранее отказа
Конечным результатом этого является то, что треть стороне было предложено создать 123, а затем сразу же удалить 123, а не наоборот.
Хотя это не идеальный вариант, из-за того, что я читал, кажется, что Message Affinity поможет здесь, чтобы мы могли гарантировать, что сообщения обрабатываются в правильном порядке. Тем не менее, я не уверен, как сближение сообщений будет работать, когда сообщения обрабатываются и не возвращаются в очередь? (Message Affinity обычно считается плохой идеей, но нагрузка здесь не будет большой, а риск появления ядовитых сообщений очень низок. Это просто риск, что сторонняя сторона, с которой мы взаимодействуем, имеет краткий что мы касаемся)
Если это не так, есть ли какие-либо мысли о том, как это сделать?
Редактировать - Дальнейшие осложнения. Система, которую мы собираемся интегрировать с третьей стороной, заключается в замене системы, которую они использовали от другого поставщика до недавнего времени. Таким образом, есть куча данных, которые уже есть у сторонних производителей, но, как оказалось, очень сложно получить это. (Третья сторона даже не отправляет сообщения об успешном/неудачном обращении, а просто подтверждение о получении!), Поэтому мы фактически не знаем начального состояния системы.