消息应该如何成为一种回应

时间:2015-06-15 09:10:29

标签: java tcp spring-integration

我已阅读并遵循http://docs.spring.io/spring-integration/reference/html/ip.html#ip-correlation

中的示例

我有一个弹簧集成服务器

<int-ip:tcp-connection-factory
    id="socketserver"
    type="server"
    port="30124"
    using-nio="true"
    mapper="mapper"
    deserializer="jsonSerializer"
    serializer="jsonSerializer"
    single-use="false"/>

使用上面link上面的映射器

<bean id="mapper"
  class="org.springframework.integration.ip.tcp.connection.MessageConvertingTcpMessageMapper">
<constructor-arg name="messageConverter">
    <bean class="org.springframework.integration.support.converter.MapMessageConverter">
        <property name="headerNames">
            <list>
                <value>correlationId</value>
                <value>sequenceNumber</value>
                <value>sequenceSize</value>
            </list>
        </property>
    </bean>
</constructor-arg>

使用入站和出站适配器

<int-ip:tcp-inbound-channel-adapter id="inboundServer"
    channel="inputChannel"
    connection-factory="socketserver"/>

<int-ip:tcp-outbound-channel-adapter id="outboundServer"
    channel="outputChannel"
    connection-factory="socketserver"/>

<int:channel id="inputChannel"/>
<int:channel id="outputChannel"/>

<int:service-activator input-channel="inputChannel"
           output-channel="outputChannel"
           ref="echoService"
           method="test"/>

<bean id="echoService" class="com.example.HelloReply" />

我使用

将消息发送到已连接的客户端
Map<String, Object> headers = new HashMap<String, Object>();
Map msgMap = new HashMap();
msgMap.put("message", "test");
headers.put(IpHeaders.CONNECTION_ID, <the connection id>);
headers.put("correlationId", "boo");
headers.put("sequenceNumber", 100);
headers.put("sequenceSize", 5);
Message<Map> msg = new GenericMessage<Map>(msgMap, headers);

MessagingTemplate template = new MessagingTemplate();

Message reply = template.sendAndReceive(outputChannel, msg);

最后一行永远阻止,因为我无法弄清楚如何从我的旧客户端(telnet)正确回复该邮件。

发送的消息是:

{"headers":{"sequenceNumber":101,"sequenceSize":5,"correlationId":"boo"},"payload":{"message":"test"}}

我认为这将是correlationId和相同的sequenceNumber匹配所以我试图从客户端响应服务器

{"headers":{"sequenceNumber":101,"sequenceSize":5,"correlationId":"boo"},"payload":{"result":"OK"}}

但它被解释为新的入站邮件,未被识别为初始发送邮件的答案。

那么sendAndReceive期望什么,并且有一些特殊用例的文档/规范(与非Spring客户端的sendAndReceive通信)。

1 个答案:

答案 0 :(得分:0)

你是什么意思

  

频道“sendAndReceive”

您使用的是哪些API?除非您使用网关,否则您负责回复相关。

TCP Client-Server Multiplex Sample显示了一种在不使用网关时关联回复的技术(聚合器)。

显示您的完整配置(编辑问题,不要添加评论;它不能很好地呈现)。

修改

框架无法自动为您执行关联(使用template.sendAndReceive())。它对您的自定义标头一无所知,在任何情况下,都无法在模板中获取对此消息的自动回复队列的引用。

您必须编写自己的代码才能进行关联。

template.send(...);
// wait for incoming message with the same correlation id

例如,您可以使用Map<String, BlockingQueue>,以相关ID和poll为对象进行回复。

通过<service-activator/>putBlockingQueue中为相关ID调用该类中的另一个方法。您还可以使用QueueChannel s。

的地图

这个用例(阻塞等待某个异步事件的线程)出现了几次,我们是considering adding a component to make things easier