项目的要求是:点击页面上的查询按钮以后,在BackingBean的事件方法中查询数据,如果查询时间超过预设值则跳转到超时页面。
比如:预设的超时时间为20秒,点击查询以后20秒一到,如果还没有查出结果,网页立即跳转到超时页面。我原来的想法是,在方法开始的时候记录系统时间,然后在方法结束以后再获得系统时间,然后将两个时间的差与预设值进行比较,超过就跳转。但是这样有个缺陷,就是必须等方法完全执行完毕后才可以跳转,没法达到一到时就自动跳转的功能。
后来我想使用线程,利用Timer来进行计时,然后到时触发事件停止查询、自动跳转,但是JSF的机制不是很熟,好像在新开的线程里没法控制事件方法的线程,也就没法实现跳转。
不知道大家有没有在项目中遇到过类似的需求,都是怎样解决的。希望能给我一些建议,谢谢!

解决方案 »

  1.   

    jsf 我不太会,不果给你一个建议 就是 设置一个环境变量 bool 
    然后用以各方法来监视他的执行状况如果在20秒内 环境变量没有变为true
    就return 到一个叶里
      

  2.   

    呵呵,关键是怎么监视,不开线程的话很难实现,总不能用while循环吧。
    问题刚刚解决了,还是用javax.swing.Timer来负责计时,然后在到时触发的ActionListener的actionPerformed方法里用到
    FacesContext.getCurrentInstance().getExternalContext().dispatch("Timeout.faces");
    FacesContext.getCurrentInstance().responseComplete();
    timer.stop();
    这样就可以了。帖子改散分贴吧 ^_^
      

  3.   

    在BackingBean的事件方法里开设两线程A(时间监听20秒),B(查询),在A到达20秒后就关B,在B返回查询值时,就关A。
      

  4.   

    这样也行?
    我觉得可以考虑考虑javascript。不过我要看晚会去了,你自己考虑吧。88
      

  5.   

    to:thomas_20(执子之手,与子偕老)
    一开始我也这么想的,先在方法里用Thread.currentThread()得到当前线程后,在timer的线程里面调用interrupt(),但是结果是即使interrupt()也没反应,可能我的理解还有问题。
      

  6.   

    我想js应该可以实现定时刷新,那就可以实现这个需求。
    不过我js很烂的,跟不懂没什么区别 :(
    而且既然项目是用JSF来实现的,那么还是在sever这端来解决问题才是正道,我是这么想的。
      

  7.   

    这是个难题,直接更改 context 的状态会不会出现   AssertException ?
    或者其他  并发 异常?
      

  8.   

    使用interrupt()以后,当前的后台事件方法的处理并没有终止,并且过了一段时间会出现InterruptedException。
    所以现在只是实现了到时跳转,但是并没有结束后台的处理。
    因为刚接触,JSF的机制不太了解,强行使用interrupt方法可能破坏了JSF的线程管理
      

  9.   

    之前这个我做过,我不是用JSF,我是用HttpSessionListener接口来实现的,监听sessoin的销毁(即timeout),并触发一个动作,给你个代码片断吧。package listeners;
    import java.util.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
        public class MySessionListner implements HttpSessionListener{
          //private static Log log = LogFactory.getLog(UserSessionListener.class);      public void sessionCreated(HttpSessionEvent evt) {
            //log.info("new Session created");
    System.out.println("@@@@@@@@@ Begin a new session@@@@@@@@@@@@@@");
    HttpSession currentSession=(HttpSession)evt.getSession();
    System.out.println(currentSession.getAttribute("user"));
          }      public void sessionDestroyed(HttpSessionEvent evt) {
            System.out.println("@@@@@@@@@ Destroy a session@@@@@@@@@@@@@@");
    HttpSession currentSession=(HttpSession)evt.getSession();
    System.out.println(currentSession.getAttribute("user"));
          }    }
      

  10.   

    然后在web.xml中的<web-app>下加上 <listener>
        <listener-class>listeners.MySessionListner</listener-class>
    </listener>,之后凡是jsp页面上生成的session,在销毁前,都会被捕捉到,你在这时进行跳转就行了。