Я пытаюсь реализовать минную службу, в которой ответ на последнее сообщение должен основываться на предыдущих сообщениях. Каждое сообщение (заголовок (1), данные (n), конец (1)) должно получить ответ, но ответ на сообщение «конец» должен быть основан на «заголовке», а также на любых полученных сообщениях «данные». как «конец» сообщения. В настоящее время я направляю сообщения в агрегатор, который завершает работу, когда находит «заголовок» и «конец» сообщения для определенного идентификатора корреляции. К сожалению, ответ отправляется до (или одновременно?) сообщения, отправленного агрегатору, поэтому у меня нет доступа к агрегированному сообщению (которое содержит все данные, необходимые для построения правильного ответа), когда построение ответа.
Есть ли способ сделать это без ручного хранения и доступа к накопленным данным (то есть без повторной реализации агрегатора верблюда)?
Редактировать:
Маршрут примерно такой:
<camelContext>
<route>
<from uri="mina:..."/>
<process ref="messageProcessor"/>
<aggregate>
<process ref="completeMessageProcessor"/>
</aggregate>
</route>
</camelContext>
Я пропустил некоторые теги и атрибуты (correlationExpression
, completionPredicate
, strategyRef
и т. д.) для ясности.
Сообщения правильно агрегировались и правильно обрабатывались при «завершении» (то есть при агрегировании). Но ответ, отправленный обратно через конечную точку mina
клиенту, был сгенерирован messageProcessor
, а не completeMessageProcessor
.
Например (и да, это довольно надуманный пример, но потерпите меня), предположим, что протокол включает в себя отправку клиентом сообщения заголовка, которое включает общее количество сообщений данных, которые он ожидает отправить. Затем он отправляет ряд сообщений с данными, число которых может отличаться от ожидаемого. Наконец, он отправляет нижний колонтитул или завершающее сообщение. Затем сервер должен ответить разницей между ожидаемым количеством сообщений и фактическим количеством сообщений. При указанном маршруте это невозможно, так как количество сообщений неизвестно messageProcessor
, который обрабатывает только отдельные сообщения. completeMessageProcessor
, имея агрегированное сообщение (состоящее из заголовка, всех данных и конца), действительно знает этот номер, но ответ, созданный в этой точке, не распространяется обратно на конечную точку mina
.
Изменение анализа сообщений для создания сообщения только при получении всего составного сообщения не является вариантом, поскольку сервер должен отвечать на отдельные сообщения.