Ответ на запрос MINA после объединения нескольких запросов в Camel

Я пытаюсь реализовать сервис mina, где ответ на последнее сообщение должен основываться на предыдущих сообщениях. Каждое сообщение (заголовок (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 конечная точка.

Изменение синтаксического анализа сообщений для генерации сообщения только при получении всего составленного сообщения не является вариантом, поскольку сервер должен отвечать на отдельные сообщения.

1 ответ

Решение

Я думаю, что messageProcessor настраивает сообщение OUT, но completeMessageProcessor настраивает сообщение IN. Ответ минимального потребителя ожидает / использует вместо этого сообщение OUT.

Вы можете добавить некоторые записи, чтобы проверить это. если это так, то вы можете изменить свой messageProcessor вместо этого использовать тело IN (или использовать заголовки бирж) и добавить преобразование после completeMessageProcessor установить тело OUT на основе тела IN

<transform>
  <simple>${in.body}</simple>
</transform>

см. это для получения дополнительной информации: http://camel.apache.org/using-getin-or-getout-methods-on-exchange.html

ОБНОВЛЕНИЕ: после некоторого обсуждения реальная проблема состоит в том, что агрегатор в настоящее время обрабатывает только обмены "InOnly"

Другие вопросы по тегам