在我们的Seam应用程序中,我们有一个轮询部分,只要页面在浏览器窗口/选项卡中保持打开,就可以保持会话处于活动状态,以允许用户同时处理多个对象实例,让对话在“非活动”页面上过期,而他们在另一个页面上忙碌时。
一切正常,但是当轮询线程发送请求而另一个(长时间运行)正在进行时,我们偶尔会得到可怕的并发调用会话异常。我们将并发请求超时值设置得相当高(20秒),并且大多数时候页面的返回时间不到2秒。但是,在某些情况下,用户处理大量数据(并且他们愿意等待加载这些页面,无论需要多长时间),因此在通用优化方面我们无能为力。
我们正在寻找的是一种检查(在中央过滤器中所有请求都通过)的方法,如果某个对话有锁,而不尝试获取一个(以便在没有触发异常的情况下)已锁定它)。我们有办法区分我们是否正在处理其中一个后台线程(我们这样做是为了进行会话管理,因此它们扩展了会话而不是会话,整体而言)。如果我们可以确定对话已经在使用中,我们可以跳过此轮询线程的处理,因为在该特定时间不需要其服务(正在使用对话,所以没有过期的危险)。 / p>
TLDR:检查接口对话是否锁定而不尝试访问它(这可能导致触发对话异常的并发呼叫)
非常感谢任何指示,建议。
答案 0 :(得分:1)
我假设你正在使用Seam2(因为这个问题已经存在了一段时间)。
有一个会话作用域类ConversationEntries
,可让您访问会话的所有会话。您可以致电getConversationEntries()
然后,您可以调用每个ConversationEntry
lockNoWait()
方法来获取锁定。当条目被另一个线程锁定时,它将立即返回false
。如果没有其他线程持有锁,它将返回true
(在这种情况下,您将直接调用unlock()
)。
或者,您甚至可以在不打扰锁定的情况下调用touch()
以避免会话过期。
祝你好运, 亚历山大。