【问题标题】:How to limit connections to a single client on a TcpNioServerConnectionFactory?如何在 TcpNioServerConnectionFactory 上限制与单个客户端的连接?
【发布时间】:2019-12-20 18:18:45
【问题描述】:

我目前有一个 Spring Integration 应用程序,它利用许多 TCP 入站和出站适配器组合来处理消息。这些组合中的每个入站适配器都使用TcpNioServerConnectionFactory。我希望将这些连接工厂配置为一次只有一个客户端可以建立到相应端口的连接。在当前客户端连接被丢弃或删除之前,在给定端口上尝试的任何其他连接都需要被拒绝。

通过一些初步研究,我发现TcpNioServerConnectionFactory 上的Multi Accept 属性似乎很有希望。是否将此属性设置为 false 来完成我需要的工作,还是需要做更多工作以确保连接工厂能够按照我的需要处理连接?

【问题讨论】:

  • 接受新连接后立即关闭监听套接字;关闭该连接时重新打开它;并忽略任何告诉您将监听积压设置为零或 1 的人。

标签: spring spring-boot tcp spring-integration


【解决方案1】:

没有;该属性是不相关的,它是关于优先于接受新连接的读取。

您可以捕获连接打开事件并立即关闭其他连接;下面以一个简单的启动应用为例:

@SpringBootApplication
public class So59429748Application {


    private static final Logger logger = LoggerFactory.getLogger(So59429748Application.class);


    public static void main(String[] args) {
        SpringApplication.run(So59429748Application.class, args).close();
    }

    @Bean
    public TcpNioServerConnectionFactory server() {
        return new TcpNioServerConnectionFactory(1234);
    }

    @EventListener
    public void connectionChecker(TcpConnectionOpenEvent event) {
        int connections = server().getOpenConnectionIds().size();
        if (event.getConnectionFactoryName().equals("server")
                && connections > 1) {
            logger.info(String.format("Too many connections (%d); closing %s", connections, event.getConnectionId()));
            server().closeConnection(event.getConnectionId());
        }
    }

    @Bean
    public ApplicationRunner runner() {
        return args -> {
            server().registerListener(msg -> false);
            server().start();
            Thread.sleep(2000);
            Socket socket1 = SocketFactory.getDefault().createSocket("localhost", 1234);
            Socket socket2 = SocketFactory.getDefault().createSocket("localhost", 1234);
            logger.info("EOF on second socket:" + socket2.getInputStream().read());
            socket1.close();
        };
    }
}

2019-12-20 13:50:18.842 INFO 86323 --- [pool-1-thread-1] com.example.demo.So59429748Application : 连接太多 (2);关闭 localhost:49562:1234:b4d65f24-158c-4784-87dd-9b5e875aa08a

2019-12-20 13:50:18.843 INFO 86323 --- [main] com.example.demo.So59429748Application : EOF on second socket:-1

【讨论】:

  • 感谢加里的回复。这看起来应该可以满足我的需要。需要一些时间来实现和验证我需要的东西已经完成。完成后将标记为已接受的答案。
猜你喜欢
  • 1970-01-01
  • 2020-04-13
  • 2016-03-31
  • 1970-01-01
  • 1970-01-01
  • 2013-04-17
  • 2020-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多