0

我在 SessionMap 中有一个很长的操作,其中包含一些 insterts 和一个非常短的操作来读取我的 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”。

我尝试删除同步块,因为我在这里看到 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

但是,如果我在大动作之前执行一个小动作,那么一切都会很好。所以,我认为之前需要初始化会话,因为它需要结束一个动作。但是我不知道怎么做。

4

0 回答 0