我有一个消息驱动 Bean,它接收审计消息。这些消息还包含有关被审计系统的信息。当接收到消息时,如果系统不存在,MDB 可以创建系统或重用现有系统。
我的挑战是,当同时收到来自新系统的大量消息时,会创建多个 MDB 实例,最终可能会创建重复的系统。向数据库添加约束是解决它的一种方法。有没有办法避免应用程序中的这些重复,在这种情况下是MDB?
我有一个消息驱动 Bean,它接收审计消息。这些消息还包含有关被审计系统的信息。当接收到消息时,如果系统不存在,MDB 可以创建系统或重用现有系统。
我的挑战是,当同时收到来自新系统的大量消息时,会创建多个 MDB 实例,最终可能会创建重复的系统。向数据库添加约束是解决它的一种方法。有没有办法避免应用程序中的这些重复,在这种情况下是MDB?
确保只有一个线程处理所有消息。这可以在激活规范、连接池上进行配置。
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")
})
你可以尝试这样的事情:
private Object LOCK;
public void onMessage() {
code…
synchronized(LOCK) {
check if system exists, create if necessary
}
more code…
}