2013-04-12 72 views
0

我有一些服務是從JMS消息發起的,其他服務是從WS調用中啓動的。對於他們所有人,我已經使用Spring集成實現了日誌記錄,驗證,適應(XSD到域)和持久性解決方案。它一直工作到現在。一段時間後,新的請求類型被添加到需求中。這些請求包含將並行處理的子項。這些兒童項目將被合併,然後形成一個單一的迴應。我試過聚合器,它適用於JMS。我收集每個子項目的響應,並在需要時創建主響應。使用Spring集成聚合器進行Web服務

問題是WS調用它不起作用。我使用soapUI進行測試,我發送了請求,日誌記錄,適應,聚合等工作,但我沒有看到迴應。

摘要:在ws調用中使用聚合器是否會導致退出Web服務調用的線程並中斷請求 - 響應匹配機制?

編輯: 作爲加利羅素建議,我添加細節問題:

<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的請求並開始一個進程,完成後我創建一個對象作爲響應,但spring集成不能將該對象與請求關聯。我的響應對象中沒有任何標題或與請求相關的內容。我無法將請求相關的事情傳遞給進程,我需要在集成層中處理它。這是我堅持不懈的地方。

+0

是的,它工作正常;您需要顯示您的配置並準確描述您所看到的問題。 –

+0

謝謝你加里。我已經爲這個問題添加了關於問題的細節和想法。 – GokcenG

回答

1

如果您的流量很複雜,則可能需要增加入站網關上的reply-timeout(默認爲1秒)。

編輯:

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

這意味着一些組件被丟棄replyChannel報頭。

同樣,您需要顯示整個配置。您不能隨意創建新消息,並期望框架知道如何處理它。

沒有完整的圖片(配置,代碼和調試日誌),很難推測發生了什麼。我建議你打開調試日誌記錄並按照你的流程中的消息。如果你無法弄清楚,我們可以提供幫助,但我們可能應該轉而聊天 - Stack Overflow站點不允許長時間討論。

編輯:

正如你隨意創建新郵件聊天討論;框架無法知道這些消息與輸入有關。

+0

謝謝加里。我只是想實現自定義聚合邏輯。我不指望它需要超過1秒。 – GokcenG

+0

見編輯;如有必要,請轉到聊天室。 –

+0

謝謝加里,我創建了一個關於這個問題的聊天室。 URL:http://chat.stackoverflow.com/rooms/28231/discussion-between-gary-russell-and-gokceng – GokcenG