【发布时间】:2016-09-03 20:00:23
【问题描述】:
我们想断开客户端与服务器的连接。
所以我们向会话发送了一些消息,其中基本上包括一些命令,例如“关闭自己”l
所以一般我会这样做:
for (Session session : sessions) {
closeSession(session);
while(!verifyClosed(session)){
closeSession(session);
retries++;
if(retries==10){
retries = 0;
break;
}
};
}
现在我想在执行一些 sigterm kill 方法之前让每个会话关闭几秒钟(比如说 5 秒)。
那么首选的方式是什么:
-
在每个会话关闭过程中以最多 5 秒的延迟执行循环。
或
-
为每个会话启动一个执行此过程的线程,因此会话应同时关闭。
for (Session session : sessions) { startClosingThread(session); }
更新:
我注意到一些用户错误地挂断了“会话”这个词,问题根本不在于 SessionHandling。如果我发送关闭消息或断开套接字无关紧要。这不是问题。
您可以用 UserThread 替换单词 Session。
我需要一些建议的问题是: 关闭一个“UserThread”需要一些时间,所以现在等待每个线程关闭并进入下一个线程,或者为每个 UserThread 启动它自己的负责关闭线程以同时处理所有线程。
【问题讨论】:
-
您可以简单地将所有会话添加到来集合或队列中,然后定期遍历它,向每个会话发送关闭命令。如果某些会话未成功关闭,请将其重新添加到集合中。这样做直到集合变空或超过重试限制。
-
'
sigtermkill methods' 杀什么?在这种情况下,什么是“用户会话”?只关闭套接字有什么问题? -
发送关闭命令是阻塞还是非阻塞操作?您可以执行一些 sigterm kill 方法的会话有什么样的连接?
-
@EJP sigterm 杀死一个进程。套接字关闭是一种不可靠的方式(因为我们有“关闭自己”的方法)。会话可能会陷入无限循环或处于 forzen 状态,因此如果套接字断开连接,不能保证进程会结束。
-
@SashaSalauyou:但问题仍然存在。在遍历下一个会话或遍历同一线程中的所有会话时,为一个会话启动一个负责任的关闭线程。我是否将它们从队列中删除并不重要。
标签: java multithreading session