1

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

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

4

3 回答 3

2

确保只有一个线程处理所有消息。这可以在激活规范、连接池上进行配置。

于 2010-11-21T02:53:22.473 回答
2

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")
})
于 2018-09-20T08:01:23.663 回答
-1

你可以尝试这样的事情:

private Object LOCK;
public void onMessage() {
    code…
    synchronized(LOCK) {
        check if system exists, create if necessary
    }
    more code…
}
于 2010-11-16T22:21:33.593 回答