使用spring集成tcpserver来管理客户端并向其发送消息

时间:2015-06-08 15:26:15

标签: java tcp spring-integration

我已经创建了一个带有spring集成的简单tcp服务器,它可以保持连接活动并在连接期间响应每个请求。

在该requestMethod中,我还能够读取MessageHeder以获取connectionId。

现在我想将消息从服​​务器发送到客户端。

据我了解文档,我需要将connectionid放在MessageHeader中,然后发送消息。但我无法弄清楚如何做后者。我已准备好消息,但如何发送/推送消息?

这是我的xml配置:

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

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

<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:interceptors>
        <int:wire-tap channel="logger"/>
    </int:interceptors>
</int:channel>

<int:channel id="outputChannel">
    <int:interceptors>
        <int:wire-tap channel="logger"/>
    </int:interceptors>
</int:channel>

<int:logging-channel-adapter id="logger" level="DEBUG" log-full-message="true"/>

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

<bean id="echoService"
    class="com.examples.EchoService" />

我还尝试为输出创建一个bean和另一个serviceactivator,然后自动连接该bean并调用它&#34; s&#34;发送&#34;方法,但我不知道在send-method中实现什么来发送消息。

1 个答案:

答案 0 :(得分:2)

如果它是一个简单的请求/响应方案,则使用入站网关而不是通道适配器,框架将为您处理相关性。这用于the sample app。只需让您的POJO方法返回回复有效负载。

如果你想向客户端发送任意消息(即不请求/回复,但是,输入,输出,输出,输入,输出,输出等),那么,是的,你需要自己构建消息,插入ip_connectionId标题。

要发送它们,有几种选择:

outputChannel注入您的代码

@Autowired
private MessageChannel outputChannel;

使用MessagingTemplate发送到频道(或直接调用其send(Message<?> message)方法)。

或者

使用带有void返回方法的MessagingGateway并将网关注入代码。

修改

注意,如果您想在收到任何内容之前开始发送消息,可以通过connection opened event获取连接ID。