2017-10-11 2 views
0

私の要件は、TCPからのデータをJavaオブジェクトに変換してActiveMQで送信した後にTCPからデータを取得することです。いくつかの処理を行った後に、TCP上の同じチャネル上で応答/応答コードを送信する必要があることを通知します。 この要件を満たすには、双方向通信が必要なため、tcp-outbound-gatewayを使用しています。ActiveMQでtcp-outbound-gatewayを使用して返信チャネルでデータを送信することができません

問題ActiveMQで確認応答を送信できません。私がActiveMQの部分をコメントアウトしてreplyChannelにダミーの文字列を書くと、それは見えますが、アクティブなMQキューにオブジェクトを送信すると、メッセージが返ってきます"返信なしで返信しました"

新しいキューを使用して応答を取得し、応答をtcp-outbound-gateの応答チャネルに入れようとしていますが、エラーメッセージはです。output-channelまたはreplyChannelヘッダーはありません。

私はMessageHeadersの詳細を受信メッセージで取得し、キュー経由でcopyHeaderを使用して送信しました。私は、ヘッダーを設定し、Messageオブジェクトのpaylodを見ることができます。返信チャンネルにInterceptosを適用して同じことを確認しましたが、同じエラーが発生しました。output-channelまたはreplyChannelヘッダーはありません。

コードは次のとおりです。

<int:gateway id="gw" default-reply-channel="replyChannel" default-reply-timeout="10000" service-interface= "com.telnet.core.integration.connection.ParseTcpConfiguration$SimpleGateway" 
default-request-channel="${server.inboundChannel}"/> 

<int:channel id="telnetLandingChannel" /> 

<ip:tcp-connection-factory id="serverFactory" type="server" host="${server.host}" port="${server.port}" single-use="false" 
serializer="${server.serializer}" deserializer="${server.serializer}" task-executor="serverFactoryTaskExecutor"/> 

<ip:tcp-inbound-gateway id="serverInboundAdpater" request-channel="telnetLandingChannel" reply-channel="replyChannel" 
connection-factory="serverFactory" error-channel="errorChannel" reply-timeout="1000000" auto-startup="false"/>  

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

<beans:bean id="acknowledgementHandler"  class= "com.telnet.core.integration.AcknowledgementHandler"> 
</beans:bean> 

<int:channel id="incidentDispatchMessageChannel" datatype="${incident.interaction.dispatch.response.datatype}"></int:channel> 

<int-jms:message-driven-channel-adapter id="incidentDispatchMessageChannelAdapter" error-channel="errorChannel" 
connection-factory="mqConnectionFactory" 
destination-name="${incident.processing.tcp.dispatch.response.queues}" 
channel="incidentDispatchMessageChannel"/> 

<int:transformer id="incidentMessageActivator" 
input-channel="incidentDispatchMessageChannel" 
output-channel="replyChannel" 
ref="acknowledgementHandler" method="incidentAck"> 
</int:transformer>  

public Message incidentAck(final DefaultIncidentAcknowledgeMessage defaultIncidentAcknowledgeMessage){ 

    MessageHeaders ms = (MessageHeaders)defaultIncidentAcknowledgeMessage.getProperties().get("MessageHeader"); 
    Message<String> message = MessageBuilder.withPayload("1").copyHeaders(ms).build(); 
    return message; 
} 

答えて

0

しかし、あなたの統合の設定を確認する必要がありますが、私はそれがSerializableではないので、あなたがreplyChannelヘッダーにTemporaryReplyChannelオブジェクトを失うされていることを推測してみましょう。 ActveMQに送信する前に、どこかで使用することを検討してください。

<int:header-enricher> 
    <int:header-channels-to-string/> 
</int:header-enricher> 

詳細については、Reference Manualを参照してください。

UPDATE

これはReceive the acknowledgement from TCP server to our application using spring Integrationの継続であるように見えます。そして、あなたはまだ多くの場所で同じreplyChannelを使用しています。それは適切に動作しません。ゲートウェイのreplyChannelヘッダーは、1つの応答のみを受け入れることができます。たとえActiveMQからの返答をどうすればよいのか分かっても、TemporaryReplyChannelはTCP Outbound Gatewayからの返信で満たされます。

私が正しくあなたを理解していれば、TCPからの返信とともに、ActiveMQからメッセージを受け取る必要があります。ゲートウェイコールへの応答としてすべてを送信します。この目的のために、Aggregatorを使用して、TCPからの応答をActiveMQからの応答に一致させるためのカスタム相関戦略を見つけ出すことをお勧めします。集約後、実際には既存のreplyChannelヘッダーを使用してゲートウェイに返信することができます。

+0

どのチャンネルでヘッダーエンリッチャーを使用する必要があります –

+0

メッセージがActiceMQで送信されない場合は、確認メッセージが表示されます。どのようにゲートウェイが返信チャネルまたはチャネルが閉じられたときに応答を得ることができないかのように見えます。 Active MQの場合、ゲートウェイ上で送信する必要のある応答を処理する方法がありますか。現時点ではActive MQのため、同期呼び出しではありません。 –

+0

私の答えでUPDATEを参照してください –

関連する問題