如何在Spring-Integration TCP网关中实现粘性会话?

时间:2019-10-24 07:56:02

标签: java spring spring-boot spring-integration

我目前正在使用Spring集成在tcp套接字服务器上工作。 到目前为止,我有以下提到的代码。 但是有可能对该套接字服务器的多个节点进行负载平衡。为此,我需要套接字连接上下文的stick session,可以在节点之间共享。有人可以建议解决方案吗?

@Bean
    public IntegrationFlow listnerServerFlow(
            TcpNetServerConnectionFactory serverConnectionFactory,
            DeviceListenerService deviceListenerService) {
        return IntegrationFlows
                .from(Tcp.inboundGateway(serverConnectionFactory))
                .handle(deviceListenerService::processRequest)
                .get();
    }

@Bean
    public TcpNetServerConnectionFactory serverConnectionFactory() {
        TcpNetServerConnectionFactory connectionFactory = new TcpNetServerConnectionFactory(2424);
        connectionFactory.setSerializer(new ByteArrayCrLfSerializer());
        connectionFactory.setDeserializer(new ByteArrayCrLfSerializer());
        connectionFactory.setSingleUse(false);
        connectionFactory.setSoKeepAlive(true);
        return connectionFactory;
    }

2 个答案:

答案 0 :(得分:2)

通常,您可以在请求中添加唯一标识符,并将会话数据存储在单独的Redis中。

无论哪个节点正在处理请求,该节点都可以从给定请求中标识符的Redis中检索会话数据。

希望这可以帮助您制定解决方案。

答案 1 :(得分:1)

使用此设置

connectionFactory.setSingleUse(false);

只有一个共享连接,因此它始终是粘性的(连接到一台服务器)。

您可以使用ThreadAffinityConnectionFactory将连接绑定到每个调用线程。