我的要求是在从TCP转换为java对象并在ActiveMQ上发送数据后从TCP获取数据。发布一些处理后需要在TCP上的相同通道上发送确认/响应代码。 为了满足这个要求,我使用tcp-outbound-gateway作为双向通信是必需的。
问题是我无法通过ActiveMQ发送确认。如果我注释掉ActiveMQ部分并在replyChannel上写一个虚拟字符串,那么它是可见的,但是当我在Active MQ队列上发送对象的那一刻,它给我一条消息"收到空回复,无需发送任何内容&#34 ;
我正在使用新队列获取确认并尝试将响应放在tcp-outbound-gate的回复通道上,但错误消息是 没有输出通道或replyChannel标头可用。
我通过Incoming消息获取了MessageHeaders详细信息,并通过队列发送它以使用copyHeader。我能够在Message对象中设置标题并查看paylod,通过在回复频道上应用Interceptos进行验证,但仍然会出现相同的错误 没有输出通道或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 :(得分:0)
虽然需要查看您的Integration配置,但我猜你在TemporaryReplyChannel
标题中丢失replyChannel
对象,因为它不是Serializable
。考虑使用:
<int:header-enricher>
<int:header-channels-to-string/>
</int:header-enricher>
在发送给ActveMQ之前的某个地方。
有关详细信息,请参阅Reference Manual。
<强>更新强>
看起来这是Receive the acknowledgement from TCP server to our application using spring Integration的延续。而且我发现你仍然在许多地方使用相同的replyChannel
。这不会正常工作。来自网关的replyChannel
标头只能接受一个回复。即使我们弄清楚如何处理来自ActiveMQ的回复,TemporaryReplyChannel
也将通过TCP出站网关的回复来完成。
如果我理解正确,除了来自TCP的回复,您还需要从ActiveMQ获得一些消息。并将所有内容作为对网关呼叫的回复发送。为此,我建议您考虑使用Aggregator并找出一些自定义关联策略,以匹配来自TCP的回复与ActiveMQ的确认。在聚合之后,您真的可以使用现有的replyChannel
标头来回复网关。