如何创建具有弹簧集成的异步单例套接字服务器?



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

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

如何实现这种异步模式?

特别是:如何使用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 标头,因为它用于将消息与连接相关联。源自入站适配器的消息将自动设置标头。如果您希望构造要发送的其他消息,则需要设置标头。可以从传入消息中捕获标头值。

最新更新