繁体   English   中英

如何使用spring-integration创建异步单例套接字服务器?

[英]How to create an asynchronous singleton socket server with spring-integration?

我想使用spring-integration实现以下目标:具有一个不断打开和接收数据的单例开放套接字,asyncrhon!

这意味着我必须打开一个不断读取单个套接字的套接字,调度每个消息以进行异步处理,并通过异步返回该套接字的响应。

如何实现该异步模式?

特别是:如何使用Serializer/Deserializer 据我了解,序列化程序仅在新的套接字连接上被调用,因此就我而言,在第一条消息开始时仅一次?

@Configuration
public class SocketConfig {
    @Bean
    public TcpConnectionFactoryFactoryBean tcpFactory(MyConverter converter) {
        TcpConnectionFactoryFactoryBean fact = new TcpConnectionFactoryFactoryBean();
        fact.setType("server");
        fact.setPort(PORT);
        fact.setUsingNio(true); //should I use true or false?
        fact.setSingleUse(false); //keep socket constantly open
        fact.setSerializer(converter);
        fact.setDeserializer(converter);
        return fact;
    }

    @Bean
    public TcpInboundGateway serverGateway(
            @Qualifier("tcpFactory") TcpConnectionFactoryFactoryBean factory,
            @Qualifier("serverChannel") MessageChannel serverChannel) throws Exception {
        TcpInboundGateway g = new TcpInboundGateway();
        g.setConnectionFactory(factory.getObject());
        g.setRequestChannel(serverChannel);
        return g;
    }

}

@MessageEndpoint
public class SocketEndpoint {

    @ServiceActivator(inputChannel = "serverChannel")
    public Object run(Object obj) {

    }
}


@Service
public class MyConverter implements Serializer<Object>, Deserializer<Object> {
    //read from socket
    @Override
    public Object deserialize(InputStream inputStream) {
    }

    //send back to socket
    @Override
    public void serialize(Object message, OutputStream outputStream) {
    }
}

网关用于单个请求/响应对。

如果您需要为单个请求发送多个响应,则必须使用文档中所述的协作通道适配器

协作适配器也可以用于(服务器端或客户端)完全异步通信(而不是具有请求/答复语义)。

在服务器端,必须注意填充ip_connectionId标头,因为它用于将消息与连接相关。 源于入站适配器的邮件将自动设置标头。 如果您希望构造其他要发送的消息,则需要设置标题。 标头值可以从传入消息中捕获。

暂无
暂无

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

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