我有一个消息驱动Bean,它接收审计消息。这些消息还包含有关正在审核的系统的信息。收到消息后,MDB可以创建系统(如果系统不存在)或重用现有系统。
我的挑战是,当同时收到来自新系统的大量消息时,会创建多个MDB实例,最终可能会创建重复的系统。向数据库添加约束是解决它的一种方法。在这种情况下,有没有办法在应用程序MDB中避免这些重复?
答案 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…
}