У меня есть некоторые службы, некоторые из которых инициируются сообщениями JMS, другие инициируются из вызовов WS. Для всех из них я реализовал решения по протоколированию, проверке, адаптации (XSD-to-Domain) и постоянству, используя весеннюю интеграцию. Он работал до сих пор. Через некоторое время к требованиям добавляются новые типы запросов. Эти запросы имеют дочерние элементы, которые будут обрабатываться параллельно. Эти дочерние элементы будут объединены, а затем сформированы один ответ. Я пробовал агрегатор, он работает для JMS. Я собираю ответы для каждого дочернего элемента и при необходимости создаю основной ответ.Использование агрегата интеграции весны для веб-сервисов
Проблема для вызовов WS это не работает. Я использую soapUI для тестирования, я отправил запрос, протоколирование, адаптацию, агрегацию и т. Д., Но я не вижу ответа.
Резюме: Использует ли агрегатор в ws-вызове выход из потока вызова веб-службы и прерывает механизм согласования запросов и ответов?
EDIT: Как Гэри Рассел предложил, я добавляю детали к вопросу:
<int-ws:inbound-gateway id="ws-inbound-gateway"
request-channel="requestMessagesChannelForWS"
reply-channel="ws-response-channel"
error-channel="ws-error-channel"
header-mapper="xmlMessageExtractorSoapHeaderMapper"/>
<int:header-enricher input-channel="requestMessagesChannelForWS" output-channel="headerEnricherChannel">
<int:header name="from" ref="headersMapManagerService" method="getFromWSValue"/>
</int:header-enricher>
<int:header-enricher input-channel="headerEnricherChannel" output-channel="requestMessagesRoutingChannel">
<int:header name="messageHeader" expression="payload.getMessageHeader()"/>
</int:header-enricher>
<int:recipient-list-router id="xmlMessageRouter"
input-channel="requestMessagesRoutingChannel">
<int:recipient channel="messageToLogAdapterChannel"/>
<int:recipient channel="requestMessageValidatorChannel"/>
</int:recipient-list-router>
я опускаю messageToLogAdapterChannel и шаги requestMessageValidatorChannel. После проверки поток продолжается здесь:
<int:chain input-channel="serviceAvailabilityCheckMessageChannelForAdaption">
<int:transformer expression="@serviceAvailabilityCheckMessageAdapterService.adaptMessage(headers, payload)"/>
<int:service-activator
expression="@serviceAvailabilityCheckHandler.handleServiceAvailabilityCheckRequest(payload)"/>
</int:chain>
Как вы видите, в цепочке нет выходного канала. Я делаю это вручную. serviceAvailabilityCheckHandler.handleServiceAvailabilityCheckRequest создает экземпляр процесса на движке BPMN (Activiti). Я жду сигнала от этого движка о завершении процесса и создаю новый объект (а не сообщение) и отправляю его на канал.
public void processEnded(OrderData orderData) {
sendMessageToChannel(orderData, processResultChannel);
}
<int:router input-channel="processResultChannel" expression="payload.orderClass.name">
<int:mapping value="domain.ServiceAvailabilityOrderRequestItem"
channel="serviceAvailabilityCheckCompletionChannel"/>
</int:router>
<int:service-activator input-channel="serviceAvailabilityCheckCompletionChannel"
output-channel="serviceAvailabilityCheckResponseItemAggregationChannel"
ref="serviceAvailabilityCheckHandler"
method="onItemComplete"/>
<int:aggregator input-channel="serviceAvailabilityCheckResponseItemAggregationChannel"
output-channel="ws-response-channel"
method="combineResponseItems"
ref="serviceAvailabilityCheckHandler"
correlation-strategy="serviceAvailabilityCheckHandler"
correlation-strategy-method="correlateResponseItems"
release-strategy-method="isResponseComplete"
release-strategy="serviceAvailabilityCheckHandler"/>
С этой конфигурацией мой агрегатор работает, пункты приходят к накопителю, а затем мои пользовательские реализации (combineResponseItems, correlateResponseItems и isResponseComplete) сочетает в себе элементы ответа и отправить его на WS-ответ канала.
Я получаю это исключение:
org.springframework.integration.support.channel.ChannelResolutionException: нет выхода-канал или replyChannel заголовок доступный
ИМХО, проблема здесь заключается в следующем : Я получаю запрос на handleServiceAvailabilityCheckRequest и запускаю процесс, после завершения создаю объект как ответ, но интеграция с весной не может связать объект с запросом. У меня нет заголовка или что-то связанного с запросом в моем объекте ответа. Я не могу передать связанные запросы к процессу, мне нужно обработать его на уровне интеграции. Здесь я плохо застрял.
Да, он отлично работает; вам нужно показать свою конфигурацию и точно описать, какие проблемы вы видите. –
Спасибо, Гэри. Я добавил подробности и свои мысли о проблеме на этот вопрос. – GokcenG