【问题标题】:EJBException: Failed to acquire the pool semaphoreEJBException:无法获取池信号量
【发布时间】:2011-10-24 08:11:21
【问题描述】:

我偶尔会在几个不同的消息驱动 bean 中遇到以下 EJB 异常:

javax.ejb.EJBException: Failed to acquire the pool semaphore, strictTimeout=10000

这种行为与特定数据库出现问题的情况密切相关,从而增加了在 MDB 的 onMessage 函数中花费的时间。消息由 ActiveMQ 代理(版本 5.4.2)传递。 MDB 上的预取为 2000(每个会话 20 个会话 x 100 条消息)。

我的问题是一般性的。这里到底发生了什么?我知道如果 bean 池中没有实例来处理它,则已传递到运行 MDB 的服务器的消息将在 10 秒后超时,但是该消息首先是如何传递到服务器的?到目前为止,我的假设是 MDB 仅在不再有任何消息要处理时才向代理请求消息。他们只是在那个服务器端“存储桶”中等待太久吗?

还有其他人遇到过这种情况吗?调整预取/信号量超时的建议?

编辑:忘了说我使用的是 JBoss AS 5.1.0

【问题讨论】:

  • 你用的是什么版本的jboss?
  • 对不起,我的意思是指定:请参阅帖子中的编辑

标签: java jakarta-ee jboss ejb-3.0 activemq


【解决方案1】:

在做了一些研究后,我找到了对此 EJBException 的令人满意的解释。

MessageDrivenBeans 有一个实例池。当一批 JMS 消息以预取的数量传递到 MDB 时,每条消息都会从该池中分配一个实例,并通过 onMessage 函数传递到该实例。

关于池如何工作的一点点:在 JBoss 5.1.0 中,池 bean (例如 MDB 和 SessionBeans)默认通过 JBoss AOP 配置,特别是部署目录中名为“ejb3-interceptors-aop.xml”的文件。该文件为匹配其域的任何类创建拦截器绑定和默认注释。对于消息驱动 Bean 域,除其他外,还有一个 org.jboss.ejb3.annotation.Pool 注释:

<annotation expr="class(*) AND !class(@org.jboss.ejb3.annotation.Pool)">
     @org.jboss.ejb3.annotation.Pool (value="StrictMaxPool", maxSize=15, timeout=10000)
</annotation>

该注解的参数描述为here

问题就在这里。如果消息预取超过此池的 maxSize(通常用于高吞吐量消息传递应用程序),则您必然会有等待 MDB 实例的消息。 如果从消息传递到调用 onMessage 的时间超过任何消息的池超时,则会引发 EJBException。 这对于消息分发的前几次迭代可能不是问题,但如果您有较大的预取和较长的平均 onMessage 时间,接近队列末尾的消息将开始失败。

一些快速代数表明,这将发生,粗略地说,当

timeout < (prefetch x onMessageTime) / maxSize

这假设消息是即时分发的,并且每个 onMessage 花费相同的时间,但应该让您粗略估计您是否超出范围。

这个问题的解决方案比较主观。简单地增加超时是一个幼稚的选择,因为它会掩盖消息位于应用程序服务器而不是队列上的事实。鉴于 onMessage 时间有些固定,如果资源允许,减少预取很可能是一个不错的选择,就像增加池大小一样。在对此进行调整时,我减少了超时,此外还大幅减少了预取并增加了 maxSize 以使消息在队列中保留更长时间,同时保持我的警报指示器以显示 onMessage 时间高于正常值。

【讨论】:

  • 对您对自己问题的全面解决方案感到满意。这并不完全反映我自己的情况,但仍然很有用:)
【解决方案2】:

jpredham 说的是正确的。还请检查是否

'strictMaximumSize'设置为真

这可能导致https://issues.jboss.org/browse/JBAS-1599

【讨论】:

    猜你喜欢
    • 2016-11-17
    • 2011-04-28
    • 2011-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    相关资源
    最近更新 更多