如何在 TcpNioServerConnectionFactory 上限制与单个客户端的连接?
How to limit connections to a single client on a TcpNioServerConnectionFactory?
我目前有一个 Spring 集成应用程序,它利用许多 TCP 入站和出站适配器组合来处理消息。这些组合中的每个入站适配器都使用 TcpNioServerConnectionFactory
。我希望这些连接工厂的配置方式是一次只有一个客户端可以建立到相应端口的连接。需要拒绝在给定端口上尝试的任何其他连接,直到当前客户端连接被丢弃或删除。
通过一些初步研究,我在 TcpNioServerConnectionFactory
上发现了 Multi Accept
属性,这似乎很有希望。将此 属性 设置为 false 是否可以完成我的需要,或者是否需要做更多的事情来确保连接工厂将按我的需要处理连接?
否; 属性 是不相关的,它是关于优先读取而不是接受新连接。
您可以捕获连接打开事件并立即关闭附加连接;这是一个简单的启动应用程序示例:
@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 : Too many connections (2); closing 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
我目前有一个 Spring 集成应用程序,它利用许多 TCP 入站和出站适配器组合来处理消息。这些组合中的每个入站适配器都使用 TcpNioServerConnectionFactory
。我希望这些连接工厂的配置方式是一次只有一个客户端可以建立到相应端口的连接。需要拒绝在给定端口上尝试的任何其他连接,直到当前客户端连接被丢弃或删除。
通过一些初步研究,我在 TcpNioServerConnectionFactory
上发现了 Multi Accept
属性,这似乎很有希望。将此 属性 设置为 false 是否可以完成我的需要,或者是否需要做更多的事情来确保连接工厂将按我的需要处理连接?
否; 属性 是不相关的,它是关于优先读取而不是接受新连接。
您可以捕获连接打开事件并立即关闭附加连接;这是一个简单的启动应用程序示例:
@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 : Too many connections (2); closing 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