如何确保单例消息驱动的bean一次处理一条消息?

时间:2014-02-14 06:52:18

标签: java singleton synchronized message-driven-bean

如何确保我的单例消息驱动Bean一次处理一条消息?

@Singleton
public class MyMdb implements MessageListener {
    @Override
    public void onMessage(final Message message) {
        ...
    }
}

使onMessage方法同步不起作用,因为这会导致此错误:

weblogic.ejb.container.compliance.ComplianceException: In EJB MyMdb, Enterprise Bean methods must not use thread synchronization primitives. The method named onMessage(javax.jms.Message) is synchronized.

3 个答案:

答案 0 :(得分:1)

在Oracle WebLogic Server中,您可以使用“顺序单元”功能。请参阅http://docs.oracle.com/cd/E14571_01/web.1111/e13727/uoo.htm官方文档以了解更多信息。具有相同的顺序单元标题的消息将强烈地处理一对一。

您还可以将custome Work Manager添加到EJB中,并将MinThreadConstraint和MaxThreadConstraint设置为1。您的所有消息都将在一个线程中处理一对一。

答案 1 :(得分:0)

我认为单身人士的使用并不像预期的那样 我相信@Singleton适用于非MDB 事实上,仅仅实施MessageListener并不足以构建MDB 您还必须将您的班级注释为@MessageDriven。

您可以尝试创建MDB(http://docs.oracle.com/javaee/6/tutorial/doc/bnbpo.html),然后创建第二个EJB(而不是MDB)作为真正的单例,而不是尝试创建单个MDB。 您可以使用单例的并发注释来控制对该访问的访问 然后注入一个'实例' (实际上是一个代理)新的单例进入你的MDB并让MDB通过单例进行所有处理。

Here is info on that

答案 2 :(得分:-1)

EJB 3.1规范 (http://download.oracle.com/otn-pub/jcp/ejb-3.1-fr-oth-JSpec/ejb-3_1-fr-spec.pdf) 5.7.4节中的非重入实例(在第5章消息驱动Bean组件合同中)中说:

  

容器必须确保只有一个线程可以执行   实例在任何时候。

因此,单例MDB一次只能执行一条消息,并且不需要配置它。

相关问题