繁体   English   中英

Spring Integration TCP服务器将消息发送到TCP客户端

[英]spring integration tcp server send message to tcp client

我想编写一个完美的客户端-服务器应用程序是Spring Integration。 我在服务器接收消息并将响应发送到客户端的部分中。

我也想不时向客户发送包含一些信息的消息。 我使用在TcpConnectionEvent中接收到的connectionId设置了标头,但没有任何反应。 下面是我的代码。 我从几天开始就解决了这个问题。 感谢您的帮助!

<!-- CLIENT SIDE -->

<int:gateway id="gw"
    service-interface="com.app.hos.service.client.Gateway"
    default-request-channel="input"/>

<int-ip:tcp-connection-factory id="client"
    type="client"
    host="localhost"
    port="14020"
    single-use="false"
    so-timeout="10000"
    />

<int:channel id="input" />

<int-ip:tcp-outbound-gateway id="outGateway"
    request-channel="transformChannel"
    reply-channel="reply"
    connection-factory="client"
    request-timeout="10000"
    reply-timeout="10000"
    />
<int:channel id="transformChannel" />

<int:channel id="reply" datatype="java.lang.String" />

<!-- TRANSFORMERS -->
<int:transformer id="testTransformer" ref="testTransformerBean" input-channel="input"
         method="transform" output-channel="transformChannel"/>

<bean id="testTransformerBean" class="com.app.hos.service.integration.Transformer" />

<!-- SERVER SIDE -->

<bean id="connectionSerializeDeserialize" class="com.app.hos.service.integration.ByteArrayToStringConverter"/>

<int-ip:tcp-connection-factory id="hosServer"
    type="server"
    port="14020"
    serializer="connectionSerializeDeserialize"
    deserializer="connectionSerializeDeserialize"
    using-nio="true"/>

<int-ip:tcp-inbound-gateway id="inputHosGateway"
    connection-factory="hosServer"
    request-channel="toServerChannel"
    error-channel="errorChannel"/>


<int:channel id="toServerChannel"/>

<int:channel id="errorChannel"/>

<int:channel id="inputChannel" />

<int:service-activator input-channel="toServerChannel"
    ref="server"
    method="serverTest"/>

<bean id="server"
    class="com.app.hos.service.server.Server" />


<!-- TCP EVENTS -->

<int:service-activator input-channel="eventChannel"
    ref="event"
    method="eventTest"/>

<bean id="event"
    class="com.app.hos.service.integration.Event" />

<int:channel id="eventChannel"/>

<int-event:inbound-channel-adapter channel="eventChannel"
                event-types="org.springframework.integration.ip.tcp.connection.TcpConnectionEvent"/>

我在其中设置connectionId的Transforemr:

@Autowired
public Event event;

public Message<String> transform(Message<String> msg) {

    Message<String> newMessage = MessageBuilder.withPayload(msg.getPayload())
            .setHeader(IpHeaders.CONNECTION_ID, event.getConncetionId())
            .copyHeadersIfAbsent(msg.getHeaders())
            .build();
    return newMessage;
}

我尝试通过网关发送消息的MVC控制器:

@Autowired
public TestController(Gateway gateway) {
    this.gateway = gateway;
}

@RequestMapping(value = "/showTest", method=RequestMethod.GET)
public String showTestPage() {
    return "test/sendMessageTest";
}

@RequestMapping(value = "/sendMessage", method=RequestMethod.GET)
public void sendMessage() {
    gateway.send("Working!");
}

在发送严格用于请求/回复消息传递的任意数据时,您不能使用网关。

无论如何,您都将发送到完全不同的连接。

代替入站网关,您需要入站通道适配器和出站通道适配器(共享服务器连接工厂)。

当您要发送任意数据(不是请求/答复的一部分)时,将消息发送到oubound通道适配器,并正确设置连接ID标头。

感谢帮助! 那是解决方案:

<int:channel id="input" />

<int-ip:tcp-outbound-channel-adapter id="outboundChannel"
    channel="transformChannel"
    connection-factory="hosServer" />

<int-ip:tcp-inbound-channel-adapter id="inboundChannel"
    channel="toServerChannel"
    connection-factory="hosServer"
    />


<int:channel id="transformChannel" />

<int:channel id="reply" datatype="java.lang.String" />

<!-- TRANSFORMERS -->
<int:transformer id="testTransformer" ref="testTransformerBean" input-channel="input"
         method="transform" output-channel="transformChannel"/>

<bean id="testTransformerBean" class="com.app.hos.service.integration.Transformer" />

<!-- SERVER SIDE -->

<bean id="connectionSerializeDeserialize" class="com.app.hos.service.integration.ByteArrayToStringConverter"/>

<int-ip:tcp-connection-factory id="hosServer"
    type="server"
    port="14020"
    serializer="connectionSerializeDeserialize"
    deserializer="connectionSerializeDeserialize"
    using-nio="true"/>


<int:channel id="toServerChannel"/>

<int:channel id="errorChannel"/>

<int:channel id="inputChannel" />

<int:service-activator input-channel="toServerChannel"
    ref="server"
    method="serverTest"/>

<bean id="server"
    class="com.app.hos.service.server.Server" />


<!-- TCP EVENTS -->

<int:service-activator input-channel="eventChannel"
    ref="event"
    method="eventTest"/>

<bean id="event"
    class="com.app.hos.service.integration.Event" />

<int:channel id="eventChannel"/>

<int-event:inbound-channel-adapter channel="eventChannel"
                event-types="org.springframework.integration.ip.tcp.connection.TcpConnectionEvent"/>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM