Я не думаю, что вам нужна мастерская оркестровка для запуска суб-оркестровок.Я полагаю, вы не говорите о ведущей оркестрации, которая влияет на структуру конвоя.Итак, если это так, вот что я мог бы сделать.
Вот краткий пример здесь о том, как реализовать одноэлементную оркестровку.В этом примере показано, как настроить оркестровку, которая будет существовать только один раз.Все поступающие на него сообщения будут выстраиваться в порядке поступления и обрабатываться по одному.Ваш пример отличается тем, что вы хотите, чтобы это было сделано по идентификатору клиента.Это довольно просто.Продвиньте идентификатор клиента во входящем сообщении и добавьте его к типу корреляции.Теперь на каждого клиента будет только один экземпляр оркестровки.
Проблема с синглетонами заключается в следующем.Вы должны убить их в какой-то момент, или они будут жить вечно как обезвоженные оркестровки.Итак, вы должны иметь их конец.Вы можете сделать это, если для последнего клиента есть способ указать последнему сообщению о том, что пришло время умирать через атрибут или тому подобное.Если это невозможно, вам нужно установить таймер.Если сообщения не были получены в течение x секунд, прервите Orch.Это все легко сделать, но это может представить зомби.Зомби возникают, когда эта оркестровка находится в процессе выключения, когда приходит другое сообщение для этого клиента. Обычно это можно решить, сократив время ожидания.В любом случае, это приведет к случайному появлению зомби.
Записка с поля.Мы сделали это, и это действительно не очень хорошее долгосрочное решение.Мы получали обновления информации о клиентах, и мы должны были обеспечить обработку заказов.Мы применили этот синглтонный подход, и он был проблематичным с точки зрения проблемы зомби и исключения.Если оркестровка Singleton генерирует исключение, она блокирует обработку всех будущих сообщений для этого клиента.Так что - обрабатывать каждое возможное исключение.Реальное решение состояло бы в том, чтобы система дальнего конца проверяла метки времени из сообщений об обновлении и отбрасывала те, которые были старше, чем последнее обновление.Мы хотели пойти по этому пути, но принимающая система не хотела выполнять эту дополнительную работу.