【问题标题】:Can't be able to store logout time on COMPUTER'S LOGOUT using Java Shutdown Hook无法使用 Java Shutdown Hook 在 COMPUTER'S LOGOUT 上存储注销时间
【发布时间】:2016-11-08 10:46:24
【问题描述】:

当用户注销或登录计算机时,我试图将时间存储到数据库中,但是当我注销计算机时,它不会将我当前的时间存储到数据库中,如果我按下 ctrl+c在控制台上或从 NETBEANS 终止程序,它也存储注销时间。我在哪里做错了?这个你能帮我吗。下面是我的代码。提前谢谢你。

  public void logoutTime() throws Exception {

    Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
        @Override
        public void run() {

            SimpleDateFormat sdf1 = new SimpleDateFormat("HH:mm:ss");
            String time = String.format(sdf1.format(calendar.getTime()));

            Globals.globalClockBean.setLogout_time(time);
            try {
                cd.insert(Globals.globalClockBean);
            } catch (Exception ex) {
                Logger.getLogger(ClockController.class.getName()).log(Level.SEVERE, null, ex);
            }
            System.out.println("Closing: Logged out at yayyyyyyyyy: " + time);

            System.out.println(sdf1.format(calendar.getTime()));
        }

    }));

【问题讨论】:

  • 你是否在某处显式调用了 logoutTime() 方法?
  • 是的,我这样做了...if (hashedPassword.equals(pass)) { System.out.println("You are logged in as " + loginUsername); ClockView cv = new ClockView(); cv.loginTime(); cv.logoutTime(); cv.timerStart(); cv.stopTimer(); cv.elapsedTime(); } else { System.out.println("Incorrect Password. Try agian"); }

标签: java jvm hook shutdown-hook system-shutdown


【解决方案1】:

我的猜测是,当您注销时,操作系统会在调用 JMV 关闭挂钩之前关闭数据库。 因此,当您尝试调用数据库时,它实际上已关闭。

尝试设置文件记录器并检查在您从计算机注销后是否记录了异常。我的猜测是会有一些“连接失败”类型的异常

【讨论】:

  • 这正是我的想法,但我不知道如何解决这个问题...... :(
  • 我用记录器尝试了这个,但是在通过按ctrl+c 从控制台终止程序后,它再次启动了计时器,然后我尝试注销系统并将其关闭,但没有任何反应。 Globals.globalClockBean.setLogout_time(time); try { cd.insert(Globals.globalClockBean); Logger logger2 = Logger.getLogger("Main2"); logger2.info("Shutting down 2"); } catch (Exception ex) { Logger.getLogger(ClockController.class.getName()).log(Level.SEVERE, null, ex); }
  • 也许在 catch 块中(当数据库插入失败时),您可以将其写入某个临时文件,当您的应用程序再次启动时,它将读取此文件并将适当的记录插入数据库......但是这是一个非常奇怪的解决方案
  • 你是想说我应该在其中创建一个全新的方法,通过将异常情况存储到数据库中来检查它是否处理异常?现在它只存储应用程序启动时的登录时间。
  • 无需存储整个异常 - 只需存储登录时间(或您尝试插入数据库的任何内容):try { cd.insert(Globals.globalClockBean); } catch (Exception ex) { //store Globals.globalClockBean into file }
【解决方案2】:

当您只是从您的计算机上注销时,jvm 不会关闭,那么钩子不会被调用。

【讨论】:

  • 那我该怎么做呢?我应该怎么做才能让它按照我想要的方式运行?
猜你喜欢
  • 2015-07-24
  • 2011-12-09
  • 1970-01-01
  • 2012-10-28
  • 1970-01-01
  • 1970-01-01
  • 2020-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多