如何限制到TcpNioServerConnectionFactory上的单个客户端的连接?

时间:2019-12-20 18:18:45

标签: spring spring-boot tcp spring-integration

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

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

1 个答案:

答案 0 :(得分: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.So59429748应用程序:连接过多(2);关闭localhost:49562:1234:b4d65f24-158c-4784-87dd-9b5e875aa08a

     

2019-12-20 13:50:18.843信息86323 --- [main] com.example.demo.So59429748应用程序:第二个套接字上的EOF:-1