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