【问题标题】:How to set a timer for activity of users?如何为用户的活动设置计时器?
【发布时间】:2013-07-19 00:47:30
【问题描述】:

如果用户在 5 小时内停止工作,我需要执行特定的方法。

假设用户已登录,但他在 5 小时内没有将任何记录添加到特定的数据库表中。

任何时候用户将记录添加到指定的表中,该特定用户的计时器都应该重置,否则它将继续运行。

如果达到 5 小时,应用程序应显示一条消息,表明您 5 小时未添加任何记录。

为了澄清,请查看这些步骤

1- (1:00 PM) user1 is signed in -> timer of user1 is set 
3- (1:00 PM) user2 is signed in -> timer of user2 is set
5- (1:10 PM) user1 adds something to the tableA 
                                                -> timer of user1 will be reset

6- (6:00 PM) user1 adds something to the tableA 
                                                -> timer of user1 will be reset

7- (6:00 PM) 5 hours is elapsed for user2 without adding any record to tableA 
                                                -> show the message to user2

8- (11:10 PM) 5 hours is elapsed for user1 without adding a record to TableA 
                                                -> show the message to user1
  ....
  • 如上所示,我不关心他们在登录时做了什么。我只关心将记录添加到该特定表中。 (表 A)例如用户 2 处于活动状态但未添加任何 记录到 tableA 以便在他的计时器达到 5 小时后收到消息。

我发现了以下例外,但假设它没有用,因为一旦我在用户的类中运行它,就不可能回到同一个类并重置它。

 Timer timer = new Timer();
        int startingTime=10000; //millisecond 10 seconds=10000
        int delayTime=1000; // millisecond 1 second
     timer.schedule(new TimerTask()
       {
        public void run() {
         System.out.println("Timer repeat statement");
        }
      },startingTime,delayTime);

【问题讨论】:

    标签: java spring hibernate jakarta-ee struts2


    【解决方案1】:

    由于您使用 java-ee 和 struts,我假设您在谈论 web-app。

    所以使用标准会话管理。实现 HttpSessionActivationListener 以在会话开始时初始化计时器,并将会话超时设置为 5 小时。当会话过期时,运行你的代码。

    您需要实现会话范围 bean 来检查这一点,并在执行特定表的记录时使用从您的服务层调用的方法重置计时器。

    您还必须在 JSP 中检查与当前会话关联的计时器,以检查是否需要显示消息。

    例如您创建了 TimerBean - 一些带有会话相关计时器的 bean,用于从 JSP 中检查。

    1.

    public class SessionListener implements HttpSessionListener {
    
    
      @Override
      public void sessionCreated(HttpSessionEvent arg0) {
        //init your timer in TimerBean and associate it with created session
      }
    
      @Override
      public void sessionDestroyed(HttpSessionEvent arg0) {
        //check your timer value and run you code if it's necessary
      } 
    }
    

    2.

    @Startup //use eager initialization, or call init from login page
    @Singleton // singleton session bean 
    public class YourDbTableSessionManager  {
    
      @Resource 
      private javax.ejb.SessionContext
    
      void writeToDb {
        //reset your timer in TimerBean for SessionContext
        //perform  write
      }
    
    }
    

    3。 web.xml

    <web-app ...>
        <listener>
            <listener-class>your.package.SessionListener</listener-class>
        </listener>
    </web-app>
    

    【讨论】:

    • 感谢您的回答,但如果他们没有将记录添加到特定表中,我需要重置计时器或显示消息,我不在乎他们在此期间做了什么。
    • 然后您可以实现会话范围 bean 来检查这一点,并在执行特定表的记录时,使用从您的服务层调用的方法重置计时器到该 bean。
    • 我不明白,如果我使用会话范围 bean 不会关联到上下文而不是每个用户?你能给我一个例子还是给我一个教程?
    • 在答案中添加了一些其他示例
    • 谢谢问题是如何设置定时器?我应该使用什么类型的计时器?
    猜你喜欢
    • 2013-12-29
    • 2020-02-13
    • 1970-01-01
    • 2011-08-17
    • 2015-04-08
    • 1970-01-01
    • 2019-04-09
    • 2013-12-21
    • 1970-01-01
    相关资源
    最近更新 更多