跨实例同步对MDB方法的访问

时间:2010-11-16 22:02:12

标签: java java-ee synchronization message-driven-bean

我有一个消息驱动Bean,它接收审计消息。这些消息还包含有关正在审核的系统的信息。收到消息后,MDB可以创建系统(如果系统不存在)或重用现有系统。

我的挑战是,当同时收到来自新系统的大量消息时,会创建多个MDB实例,最终可能会创建重复的系统。向数据库添加约束是解决它的一种方法。在这种情况下,有没有办法在应用程序MDB中避免这些重复?

3 个答案:

答案 0 :(得分:1)

确保只有一个Thread处理所有消息。这可以在激活规范,连接池上配置。

答案 1 :(得分:0)

MessageDrivenBean可以通过队列Destination Options进行同步。就我而言,MessageDriven注释对于单个消息处理如下所示:

@MessageDriven(name = "ArchiveCounterStJmsListener", activationConfig = {
    @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
    @ActivationConfigProperty(propertyName = "destination", propertyValue = LINK_TO_QUEUE + "?consumer.dispatchAsync=false&consumer.prefetchSize=1"),
    @ActivationConfigProperty(propertyName = "maxSessions", propertyValue = "1")
})

答案 2 :(得分:-1)

您可以尝试这样的事情:

private Object LOCK;
public void onMessage() {
    code…
    synchronized(LOCK) {
        check if system exists, create if necessary
    }
    more code…
}