我有一个Struts2应用程序,其运行时间可能在1秒到5分钟之间。所以,如果动作运行时间超过20秒,我正在使用execAndWait拦截器来显示等待页面。操作的设置如下所示:
<action name="myAction" class="myActionClass">
<interceptor-ref name="defaultStack" />
<interceptor-ref name="execAndWait">
<param name="delay">20000</param>
</interceptor-ref>
<result name="success">myPage.jsp</result>
<result name="wait">waitPage.jsp</result>
</action>
我已经测试过这种情况,操作只需要1秒钟就可以运行。我希望永远不会显示等待页面。
然而,等待页面仍然显示出来。我尝试调试我的动作类和方法,发现执行挂起在下面的语句中
中指定的时间<param name="delay">
在这种情况下,它在下面的语句中等待20秒,然后成功完成执行。
getSession().put(A_SESSION_VARIABLE, 10);
注意:MyActionClass确实实现了SessionAware
还有其他人遇到过这个问题吗?有解决方法吗?
答案 0 :(得分:2)
解决方法(如果您的操作在servlet环境中使用):实现ServletRequestAware
接口并使用HttpServletRequest
来获取会话。
request.getSession().setAttribute(A_SESSION_VARIABLE, 10);
答案 1 :(得分:0)
对于这个问题我有不同的方法。您可以在单独的线程中运行繁重的处理,并立即将响应返回给用户,说明工作正在进行中。工作完成后,您可以返回任何想要返回给用户的内容。这可以通过使用轮询来实现。
在此期间,用户不必等待,也可以做其他事情。
希望它有所帮助。