Если события должны обрабатываться в определенной последовательности, то почему бы не попробовать добавить в сообщения поля «eventID» и «orderID»?Таким образом, ваш класс EventServiceImpl может сортировать, упорядочивать и затем выполнять в правильном порядке (независимо от порядка их создания и / или доставки обработчику).
Синхронизация блока handler.execute()
не приведет к желаемомуРезультаты, я ожидаю.Все ключевое слово synchronized
не позволяет нескольким потокам выполнять этот блок одновременно.Он ничего не делает в плане правильного упорядочения следующего потока.
Если блок synchronized
действительно работает, то я утверждаю, что вам очень повезло в том, что сообщения создаются, доставляютсяи затем действовал в правильном порядке.В многопоточной среде это не гарантировано!Я бы предпринял шаги, чтобы убедиться, что вы управляете этим, а не полагаетесь на удачу.
Пример:
- Сообщения создаются в порядке 'client01-A', 'client01-C ',' client01-B ',' client01-D '
- Сообщения поступают к обработчику в следующем порядке: client01-D, client01-B, client01-A, client01-C '
- EventHandler может различать сообщения от одного клиента к другому и начинает кэшировать сообщения "client01".
- EventHandler recv' client01-A 'сообщение и знает, что может обработать это и делает
- EventHandler ищет в кэше сообщение «client01-B», находит и обрабатывает его.
- EventHandler не может найти «client01-C», поскольку оно еще не пришло.
- EventHandler запрашивает «client01-C» и обрабатывает его.
- EventHandler ищет в кеше «client01-D», находит его, обрабатывает и считает, что взаимодействие «client01» завершено.
Что-то в этом духе обеспечит надлежащую обработку ибудет способствовать хорошему использованию нескольких потоков.