1

在我们的 Seam 应用程序中,我们有一个轮询部分,只要页面在浏览器窗口/选项卡中保持打开状态,就可以保持对话处于活动状态,以允许用户同时使用多个对象实例,而无需进行对话当他们忙于另一个页面时,它们会在“非活动”页面上过期。

一切正常,但是当轮询线程发送一个请求而另一个(长时间运行)正在进行中时,我们时不时地会遇到可怕的并发调用对话异常。我们将 concurrent-request-timeout 值设置得非常高(20 秒),并且大多数情况下页面会在 2 秒内返回。但是,在某些情况下,用户处理大量数据(并且他们愿意等待这些页面加载,无论需要多长时间),因此在通用优化方面我们无能为力。

我们正在寻找一种方法来检查(在所有请求都通过的中央过滤器中)是否有给定对话上的锁,而不尝试获取一个(以便在有锁时不会触发异常它已经)。我们有办法区分我们是否正在处理这些后台线程之一(我们这样做是为了会话管理,所以它们扩展了会话,而不是会话,总体而言)。如果我们可以确定对话已经在使用中,我们可以跳过这个轮询线程的处理,因为在那个特定时间不需要它的服务(正在使用对话,所以没有过期的危险)。


TLDR:检查缝对话是否有锁而不尝试访问它(这可能导致触发并发调用对话异常)

非常感谢任何指针,建议。

4

1 回答 1

1

我假设您正在使用 Seam2(因为这个问题已经存在了一段时间)。

有一个会话范围类ConversationEntries,可让您访问会话的所有对话。您可以通过调用要求它返回有关所有对话的信息getConversationEntries()

然后你可以调用每个ConversationEntry方法lockNoWait()来获取锁。false当条目被另一个线程锁定时,它将立即返回。true如果没有其他线程持有锁,它将返回(在这种情况下,您将直接调用unlock())。

或者,您甚至可以打电话touch()而不用担心锁,以避免对话过期。

最好的问候,亚历山大。

于 2011-09-27T21:29:02.520 回答