2016-05-16 4 views
1

Iveは最初にサーバーからアプリケーションに「Req」を送信し、「Rsp」を使用してサーバーに応答するテストを構成しました。私は正常に要求メッセージを受け取るが、その後の対応しようとすると、次のエラーを取得:CitrusとのSpringインテグレーション:出力チャネルもreplyChannelヘッダもありません

org.springframework.messaging.MessagingException: Dispatcher failed to deliver Message; nested exception is org.springframework.messaging.core.DestinationResolutionException: no output-channel or replyChannel header available 
at org.springframework.integration.dispatcher.AbstractDispatcher.wrapExceptionIfNecessary(AbstractDispatcher.java:133) 
at org.springframework.integration.dispatcher.AbstractDispatcher.tryOptimizedDispatch(AbstractDispatcher.java:120) 
at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:147) 
at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:120) 
at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:77) 
at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:442) 
at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:392) 
at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:115) 
at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:45) 
at org.springframework.messaging.core.AbstractMessageSendingTemplate.send(AbstractMessageSendingTemplate.java:105) 
at org.springframework.integration.handler.AbstractMessageProducingHandler.sendOutput(AbstractMessageProducingHandler.java:231) 
at org.springframework.integration.handler.AbstractMessageProducingHandler.produceOutput(AbstractMessageProducingHandler.java:154) 
at org.springframework.integration.handler.AbstractMessageProducingHandler.sendOutputs(AbstractMessageProducingHandler.java:102) 
at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:105) 
at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:127) 
at org.springframework.integration.dispatcher.AbstractDispatcher.tryOptimizedDispatch(AbstractDispatcher.java:116) 
at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:147) 
at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:120) 
at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:77) 
at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:442) 
at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:392) 
at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:115) 
at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:45) 
at org.springframework.messaging.core.AbstractMessageSendingTemplate.send(AbstractMessageSendingTemplate.java:105) 
at com.consol.citrus.channel.ChannelProducer.send(ChannelProducer.java:66) 
at com.consol.citrus.actions.SendMessageAction.doExecute(SendMessageAction.java:103) 
at com.consol.citrus.actions.AbstractTestAction.execute(AbstractTestAction.java:42) 
at com.consol.citrus.TestCase.executeAction(TestCase.java:211) 
... 31 more 
Caused by: org.springframework.messaging.core.DestinationResolutionException: no output-channel or replyChannel header available 
at org.springframework.integration.handler.AbstractMessageProducingHandler.sendOutput(AbstractMessageProducingHandler.java:226) 
at org.springframework.integration.handler.AbstractMessageProducingHandler.produceOutput(AbstractMessageProducingHandler.java:154) 
at org.springframework.integration.handler.AbstractMessageProducingHandler.sendOutputs(AbstractMessageProducingHandler.java:102) 
at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:105) 
at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:127) 
at org.springframework.integration.dispatcher.AbstractDispatcher.tryOptimizedDispatch(AbstractDispatcher.java:116) 
... 57 more 

参照してくださいを以下の私の豆の設定: 柑橘類-config.xmlの

<citrus:channel-endpoint id="citrusServiceReqEndpoint" 
         channel-name="req_transformed" /> 

<citrus:channel-endpoint id="citrusServiceRspEndpoint" 
         channel-name="rsp" /> 


<int-ip:tcp-connection-factory id="client" 
           type="client" host="localhost" port="12345" single-use="false" 
           so-timeout="10000" using-nio="true" deserializer="javaSerializer" 
           serializer="javaSerializer" /> 

<bean id="javaSerializer" 
     class="org.springframework.integration.ip.tcp.serializer.ByteArrayLfSerializer" /> 

<int:channel id="req" /> 

<int:channel id="req_transformed"> 
    <int:queue /> 
</int:channel> 

<int:channel id="rsp"> 
</int:channel> 

<int:channel id="rsp_transformed"> 
</int:channel> 

<int:object-to-string-transformer id="incomingTransformer" input-channel="req" output-channel="req_transformed" /> 

<int:object-to-string-transformer id="outgoingTransformer" input-channel="rsp" output-channel="rsp_transformed" /> 

<int-ip:tcp-inbound-gateway id="gateway" 
          connection-factory="client" 
          request-channel="req" 
          reply-channel="rsp_transformed" 
          client-mode="true" /> 

テストケース:

receive("citrusServiceReqEndpoint").messageType(MessageType.PLAINTEXT).payload("Req"); 
     send("citrusServiceRspEndpoint").payload("Rsp"); 
     receive("citrusServiceReqEndpoint").messageType(MessageType.PLAINTEXT).payload("Req2"); 
     send("citrusServiceRspEndpoint").payload("Rsp2"); 

基本的に、私の意図は、 "req"チャンネルでデータを受信し、そのバイトをreq_transformedチャンネル上のStringに変換し、Stringが "Req"と等しいことを確認することです。次に、 "Rsp"文字列を送信して、バイトに変換して、rsp_transformedチャネルに返信します。

どこに問題があるのか​​理解してください。 tcp-inbound-gatewayを2つのチャネルアダプタに置き換えた場合、

<int-ip:tcp-outbound-channel-adapter 
      id="outboundClient" channel="rsp" connection-factory="client" /> 

<int-ip:tcp-inbound-channel-adapter 
      id="inboundClient" channel="req" connection-factory="client" client-mode="true" /> 

テストケースが100%動作することに注意してください。なぜそれはゲートウェイで動作しないのですか?

答えて

1

あなたのtcp-inbound-gatewayは、同期メッセージングで動作します。したがって、それに応じてCitrusの同期チャネルエンドポイントを使用する必要があります。

<citrus:channel-sync-endpoint id="citrusServiceSyncEndpoint" 
        channel-name="req_transformed"/> 

同期エンドポイントは、req/respチャネルを要求/応答と関連付ける特別なヘッダーに注意します。したがって、テストは次のようになります。

receive("citrusServiceSyncEndpoint") 
    .messageType(MessageType.PLAINTEXT) 
    .payload("Req"); 
send("citrusServiceSyncEndpoint") 
    .messageType(MessageType.PLAINTEXT) 
    .payload("Rsp"); 

要求と応答の両方に同じ同期エンドポイントが使用されていることに注意してください。

+0

それぞれのフレームワークの両方の作者が私の質問に答えて解決する手助けをしてくれます!非常に親切に感謝します:) – mdewit

1

私は柑橘類に慣れていませんが、ゲートウェイを使用している場合、応答には要求の特定のヘッダー、具体的にはreplyChannelヘッダーが含まれている必要があります。これは、ゲートウェイが応答の要求をどのように知っているかゲートウェイを介した同時要求)。

インバウンドゲートウェイの代わりにcollaborating TCP inbound/outbound channel adaptersのペアを使用できますが、依然として、応答のあるソケットを送信アダプタに伝えて、ip_connectionIdヘッダーを要求から応答に伝播する必要があります。

+0

これは私が少し助けてくれると思います。受信したヘッダーを格納しているCitrusの前にコンポーネントを置いて、それが送信されたらこの値を返す必要があります。 – mdewit

関連する問題