Session 在函数结束前未提交会话
我有一个大动作需要50秒来处理。 但是,同时,我还有另一个可以在服务器上处理的操作(通过单击链接) 但是,如果我的第二个操作尝试访问由第一个操作放置的会话属性,则它们在第一个操作结束之前都是可用的 这是我的大行动:Session 在函数结束前未提交会话,session,jakarta-ee,httpsession,Session,Jakarta Ee,Httpsession,我有一个大动作需要50秒来处理。 但是,同时,我还有另一个可以在服务器上处理的操作(通过单击链接) 但是,如果我的第二个操作尝试访问由第一个操作放置的会话属性,则它们在第一个操作结束之前都是可用的 这是我的大行动: public String bigAction() { HttpSession session = request.getSession(); synchronized (session) { for(int i = 0 ; i < 100000
public String bigAction() {
HttpSession session = request.getSession();
synchronized (session) {
for(int i = 0 ; i < 100000 ; ++i)
session.setAttribute("foo_"+i, "bar");
}
return SUCCESS;
}
第一项行动:-----------------------------------------------
第二个动作:------
因此,在本例中,我的第二个操作需要由第一个操作创建的会话属性,但实际上,它们不存在
如何同步会话?根据Servlet规范:
执行请求线程的多个servlet可以同时对同一会话对象进行活动访问。容器必须确保以线程安全的方式操作表示会话属性的内部数据结构。开发人员有责任对属性对象本身进行线程安全访问。这将保护HttpSession对象内的属性集合不受并发访问,从而消除应用程序导致该集合损坏的机会
这是安全的:
request.getSession().setAttribute("bar", "foo");
这不能保证安全:
HttpSession session = request.getSession();
synchronized (session) {
String value = (String) session.getAttribute("bar");
}
此外,如果锁在同一个对象上,则锁可以工作,而不依赖于request.getSession()
返回相同的对象。Servlet规范中没有规定不能在每次请求时将HttpServletSession
实例重新创建为facade对象
读和读
这里定义了一种方法,即今天的变化:
我正在使用Struts 2,所以我实现了SessionAware,因为我知道它可能是一个很好的解决方案。但这是一样的。但那赢了;t保证进程的同步!可能是一些代码片段有助于理解您的问题。我已经编辑了我的问题以展示一个示例。关于上述解释,我尝试按照教程进行操作。我试着这么做,但我也有同样的问题。我对IdMutexProvider进行了静态引用,但在这两种情况下会话的id都不同。
request.getSession().setAttribute("bar", "foo");
HttpSession session = request.getSession();
synchronized (session) {
String value = (String) session.getAttribute("bar");
}