【问题标题】:java recommended way for shutting down multiple user sessionsjava推荐的关闭多个用户会话的方法
【发布时间】: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 秒)。

那么首选的方式是什么:

  1. 在每个会话关闭过程中以最多 5 秒的延迟执行循环。

  2. 为每个会话启动一个执行此过程的线程,因此会话应同时关闭。

    for (Session session : sessions) {
        startClosingThread(session);
    }
    

更新:

我注意到一些用户错误地挂断了“会话”这个词,问题根本不在于 SessionHandling。如果我发送关闭消息或断开套接字无关紧要。这不是问题。

您可以用 UserThread 替换单词 Session。

我需要一些建议的问题是: 关闭一个“UserThread”需要一些时间,所以现在等待每个线程关闭并进入下一个线程,或者为每个 UserThread 启动它自己的负责关闭线程以同时处理所有线程。

【问题讨论】:

  • 您可以简单地将所有会话添加到来集合或队列中,然后定期遍历它,向每个会话发送关闭命令。如果某些会话未成功关闭,请将其重新添加到集合中。这样做直到集合变空或超过重试限制。
  • 'sigtermkill methods' 杀什么?在这种情况下,什么是“用户会话”?只关闭套接字有什么问题?
  • 发送关闭命令是阻塞还是非阻塞操作?您可以执行一些 sigterm kill 方法的会话有什么样的连接?
  • @EJP sigterm 杀死一个进程。套接字关闭是一种不可靠的方式(因为我们有“关闭自己”的方法)。会话可能会陷入无限循环或处于 forzen 状态,因此如果套接字断开连接,不能保证进程会结束。
  • @SashaSalauyou:但问题仍然存在。在遍历下一个会话或遍历同一线程中的所有会话时,为一个会话启动一个负责任的关闭线程。我是否将它们从队列中删除并不重要。

标签: java multithreading session


【解决方案1】:

在所有会话上发送会话关闭请求,等待五秒钟,然后检查所有会话。这样,会话关闭可以并行发生,而无需启动一大堆新线程。

【讨论】:

  • 是的 atm 是这样的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-08
  • 1970-01-01
  • 2016-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多