Java 如何使用spring集成创建异步单例套接字服务器?

Java 如何使用spring集成创建异步单例套接字服务器?,java,spring,sockets,spring-integration,Java,Spring,Sockets,Spring Integration,我想使用spring集成实现以下目标:拥有一个不断接收和写入数据的单例开放套接字,asynchron 这意味着我必须打开一个套接字,该套接字不断地从单个套接字读取消息,分派每个消息进行异步处理,并通过套接字返回响应(也是异步的) 如何实现这种异步模式 特别是:如何使用序列化器/反序列化器?据我所知,序列化程序只在一个新的套接字连接上被调用,所以在我的例子中,只在第一条消息的开头调用一次 @Configuration public class SocketConfig { @Bean

我想使用
spring集成
实现以下目标:拥有一个不断接收和写入数据的单例开放套接字,asynchron

这意味着我必须打开一个套接字,该套接字不断地从单个套接字读取消息,分派每个消息进行异步处理,并通过套接字返回响应(也是异步的)

如何实现这种异步模式

特别是:如何使用
序列化器/反序列化器
?据我所知,序列化程序只在一个新的套接字连接上被调用,所以在我的例子中,只在第一条消息的开头调用一次

@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) {
    }
}
@配置
公共类SocketConfig{
@豆子
公共TCP连接工厂工厂Bean TCP工厂(MyConverter转换器){
TcpConnectionFactoryFactoryBean事实=新的TcpConnectionFactoryFactoryBean();
setType(“服务器”);
事实。设置端口(端口);
fact.setUsingNio(true);//我应该使用true还是false?
fact.setSingleUse(false);//保持套接字持续打开
事实。设置序列化器(转换器);
事实。setDeserializer(转换器);
返回事实;
}
@豆子
公共TCPINBundGateway服务器网关(
@限定词(“tcpFactory”)TcpConnectionFactoryFactoryBean工厂,
@限定符(“服务器通道”)MessageChannel(服务器通道)引发异常{
TcpInboundGateway g=新的TcpInboundGateway();
g、 setConnectionFactory(factory.getObject());
g、 setRequestChannel(服务器通道);
返回g;
}
}
@消息端点
公共类SocketEndpoint{
@ServiceActivator(inputChannel=“serverChannel”)
公共对象运行(对象obj){
}
}
@服务
公共类MyConverter实现序列化器、反序列化器{
//从套接字读取
@凌驾
公共对象反序列化(InputStream InputStream){
}
//发送回套接字
@凌驾
public void序列化(对象消息,OutputStream OutputStream){
}
}

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

如果需要为单个请求发送多个响应,则必须使用

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

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


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

如果需要为单个请求发送多个响应,则必须使用

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

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


我只想为每个请求发送一个响应。唯一的一件事是插座永远保持打开状态。意味着a必须不断地通过套接字读取消息和写入消息,所有这些都是异步的。我被“分割消息”弄糊涂了——这对我意味着你意味着每条消息都被分割,但我现在明白你的意思了;这应该行得通;该框架提供的
ByteArrayLengthHeaderSerializer
正是为了这个目的。如果这对你不起作用,编辑问题以准确解释问题所在。使用NIO意味着您将自动获得多线程;将调用
反序列化()
方法以获取下一条消息。有关示例,请参见TEARRAYLENGTHEATERSERIALIZER的
。否;他们可以阻止。发送操作是同步的,因此一次只能发生一个写入操作,从而防止数据交错。在接收端,不能有“并发反序列化”;这毫无意义;反序列化程序应仅在消息完全解码后退出。当NIO为true且存在更多数据时,下一个反序列化将被分派到另一个线程。如果为false,则由一个线程执行所有读取操作,如果希望在处理当前消息时读取下一条消息,则可以使用executor通道。我对其进行了编辑,以澄清网关与协作适配器的使用情况。我只希望为每个请求发送一个响应。唯一的一件事是插座永远保持打开状态。意味着a必须不断地通过套接字读取消息和写入消息,所有这些都是异步的。我被“分割消息”弄糊涂了——这对我意味着你意味着每条消息都被分割,但我现在明白你的意思了;这应该行得通;该框架提供的
ByteArrayLengthHeaderSerializer
正是为了这个目的。如果这对你不起作用,编辑问题以准确解释问题所在。使用NIO意味着您将自动获得多线程;将调用
反序列化()
方法以获取下一条消息。有关示例,请参见TEARRAYLENGTHEATERSERIALIZER的
。否;他们可以阻止。发送操作是同步的,因此一次只能发生一个写入操作,从而防止数据交错。在接收端,不能有“并发反序列化”;这毫无意义;反序列化程序应仅在消息完全解码后退出。当NIO为true且存在更多数据时,下一个反序列化将被分派到另一个线程。如果为false,则由单个线程执行所有重设