Session 在函数结束前未提交会话

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

我有一个大动作需要50秒来处理。 但是,同时,我还有另一个可以在服务器上处理的操作(通过单击链接)

但是,如果我的第二个操作尝试访问由第一个操作放置的会话属性,则它们在第一个操作结束之前都是可用的

这是我的大行动:

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");
}