无法使用带有ActiveMQ的tcp-outbound-gateway在回复通道上发送数据

时间:2017-10-11 18:23:32

标签: tcp spring-integration activemq

我的要求是在从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;
}

1 个答案:

答案 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标头来回复网关。