我已经创建了一个带有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中实现什么来发送消息。
答案 0 :(得分:2)
如果它是一个简单的请求/响应方案,则使用入站网关而不是通道适配器,框架将为您处理相关性。这用于the sample app。只需让您的POJO方法返回回复有效负载。
如果你想向客户端发送任意消息(即不请求/回复,但是,输入,输出,输出,输入,输出,输出等),那么,是的,你需要自己构建消息,插入ip_connectionId
标题。
要发送它们,有几种选择:
将outputChannel
注入您的代码
@Autowired
private MessageChannel outputChannel;
使用MessagingTemplate
发送到频道(或直接调用其send(Message<?> message)
方法)。
或者
使用带有void返回方法的MessagingGateway并将网关注入代码。
修改强>
注意,如果您想在收到任何内容之前开始发送消息,可以通过connection opened event获取连接ID。