Struts 2 SessionMap未同步

时间:2013-07-23 14:00:34

标签: java struts2 thread-safety

我在SessionMap中有一些很长的动作,有一个很短的动作来读取我的SessionMap。 他们是这样的:

public class LongAction extends ActionSupport implements SessionAware {
    private SessionMap session;
    public String index() {
        for(int i = 0 ; i < 50 ; ++i) {

            /*
             * long treatment
             */

            synchronized(session) {
                session.put("TEST", "TEST_OBJECT");
            }
         }
         return SUCCESS;
    }
    @Override
    public void setSession(Map<String, Object> arg0) {
        this.session = (SessionMap<String, Object>) arg0;
    }
}

这是我的短暂行动:

public class LongAction extends ActionSupport implements SessionAware {
    private SessionMap session;
    public String index() {
        synchronized (session) { 
            for(Entry<String, Object> e : session.entrySet()) {
                System.out.println(e.getKey() + " --> " + e.getValue());
            }
        }
        return SUCCESS;
    }
    @Override
    public void setSession(Map<String, Object> arg0) {
        this.session = (SessionMap<String, Object>) arg0;
    }
}

但如果我在第一个动作仍在运行时执行第二个动作,则不会出现“TEST”条目。

我尝试删除同步集合,因为我看到here SessionMap是为安全线程而制作的。问题是一样的。

PS:我正在使用JBoss 7.1.1

编辑:

我注意到一些奇怪的事情:

  • 我执行我的大动作(它在我的会话中插入一个字符串);
  • 我执行我的小动作:它没有在会话中读取我的字符串;
  • 我再次执行我的大动作,而第一个仍在运行(它改变了我的会话中的字符串)
  • 我再次执行我的小动作:它会在会话中读取新的字符串;

跟踪:

[stdout] (http-localhost/127.0.0.1:8781-1) 687da6e5-bd4d-474d-be60-c2d2fdc4892a
[stdout] (http-localhost/127.0.0.1:8781-2) null

[stdout] (http-localhost/127.0.0.1:8781-1) 82e6d9b7-558f-46f5-a457-b5332bb4f54e
[stdout] (http-localhost/127.0.0.1:8781-2) 82e6d9b7-558f-46f5-a457-b5332bb4f54e

此外,第一次,两个动作的会话ID不同;但第二次,它是一样的。例如:

[stdout] (http-localhost/127.0.0.1:8781-1) SessionId: j9vJzYzofPvImdrlLKKIWOGW.undefined
[stdout] (http-localhost/127.0.0.1:8781-2) SessionId: vsXtGHmJAtaJxZcd4w9+Og6B.undefined

[stdout] (http-localhost/127.0.0.1:8781-1) SessionId: vsXtGHmJAtaJxZcd4w9+Og6B.undefined
[stdout] (http-localhost/127.0.0.1:8781-2) SessionId: vsXtGHmJAtaJxZcd4w9+Og6B.undefined

但是,如果我在重大行动之前执行一个小动作,一切都运作良好。所以,我认为会话之前需要初始化,因为它需要一个动作才能结束。但我不知道如何。

0 个答案:

没有答案