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