我有两台服务器正在侦听负载均衡器后面的TCP端口.负载均衡器可以检测来自客户端的TCP连接尝试是否失败,并在不删除该连接的情况下将其重试到第二个服务器.我希望能够在不丢弃单个客户端集合的情况下将这两个服务器中的任何一个用于维护.
我的服务器使用此代码处理客户端请求:
ServerSocketFactory ssf = ... ServerSocket serverSocket = ssf.createServerSocket(60000); try { while (true) { Socket socket = serverSocket.accept(); ...// Do the processing } } catch (IOException e) { ... } ...
我最初的想法是添加一个布尔值,该布尔值将在应用程序关闭时设置,并serverSocket.accept()
在等待处理和关闭所有现有连接时阻止新调用.但是,即使在serverSocket.accept()
通话之前,也正在建立新的连接.这是我在Wireshark中看到的,如果我在该调用之前放置一个断点.
问题就在于,一旦我打电话serverSocket.close()
,所有这些客户端连接都会被丢弃.我想要实现的是告诉ServerSocket停止接受所有新连接(即只为新连接发送RST或让它们超时)的一些方法,因此负载均衡器可以将它们重新路由到另一台服务器,但同时不会掉线任何已经建立的联系.
编辑:我正在寻找一些自动解决方案,每次我想更新应用程序时都不需要我更改任何负载均衡器或操作系统设置.