3

如果用户在 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
  ....
  • 如上所示,我不关心他们在登录时做了什么。我只关心向该特定表添加记录。(TableA) 例如,用户 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);
4

1 回答 1

2

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

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

您需要实现会话范围 bean 来检查这一点,并在执行特定表的记录时使用从您的服务层调用的方法重置计时器到该 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>
于 2013-07-19T00:54:38.760 回答