2016-12-18 93 views
0

我想写一个完美的客户端 - 服务器应用程序就是Spring Integration。我有一部分服务器接收消息并向客户端发送响应。春季集成tcp服务器发送消息给tcp客户端

我想不时向客户发送一些信息。我在TcpConnectionEvent中设置了一个名为connectionId的头,但没有任何结果。有我的代码在下面。我从几天就解决了这个问题。感谢您的任何halp!

<!-- 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"/> 

Transforemr这里我设置的ConnectionId:

@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!"); 
} 

回答

0

不能使用网关发送任意的数据时,他们严格要求/回复消息。

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

而不是一个入站网关,您需要一个入站通道适配器和出站通道适配器(共享服务器连接工厂)。

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

0

感谢您的帮助!这就是解决方案:

<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"/> 

相关问题