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