2013-04-12 5 views
0

У меня есть некоторые службы, некоторые из которых инициируются сообщениями 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 и запускаю процесс, после завершения создаю объект как ответ, но интеграция с весной не может связать объект с запросом. У меня нет заголовка или что-то связанного с запросом в моем объекте ответа. Я не могу передать связанные запросы к процессу, мне нужно обработать его на уровне интеграции. Здесь я плохо застрял.

+0

Да, он отлично работает; вам нужно показать свою конфигурацию и точно описать, какие проблемы вы видите. –

+0

Спасибо, Гэри. Я добавил подробности и свои мысли о проблеме на этот вопрос. – GokcenG

ответ

1

Если ваши потоки сложны, вам может потребоваться увеличить reply-timeout на входящем шлюзе (по умолчанию он равен 1 секунде).

EDIT:

"org.springframework.integration.support.channel.ChannelResolutionException: no output-channel or replyChannel header available"

Это подразумевает некоторый компонент падает заголовок replyChannel.

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

Трудно рассуждать о том, что происходит без полной картины (конфигурации, кода и журнала отладки). Я предлагаю вам включить ведение журнала отладки и следить за сообщениями через ваш поток. Если вы не можете понять это, мы можем помочь, но мы, вероятно, должны переключиться на чат - сайт Stack Overflow не позволяет долго обсуждать.

EDIT:

Как обсуждалось в чате вы произвольно создающего новые сообщения; структура не может знать, что эти сообщения связаны с вводом.

+0

Спасибо, Гэри. Я просто пытался реализовать пользовательскую логику агрегатора. Я не ожидаю, что это займет больше 1 секунды. – GokcenG

+0

См. Edit; при необходимости перейдите в чат. –

+0

Спасибо, Гэри, я создал чат об этой проблеме. URL: http://chat.stackoverflow.com/rooms/28231/discussion-between-gary-russell-and-gokceng – GokcenG

Смежные вопросы