【问题标题】:Synchronizing access to a MDB method across instances跨实例同步对 MDB 方法的访问
【发布时间】:2010-11-16 22:02:12
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案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")
      })
      

      【讨论】:

        【解决方案3】:

        你可以试试这样的:

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

        【讨论】:

        • 这段代码将只在单个实例上同步,使 LOCK 静态将在所有类实例上同步,谢谢
        猜你喜欢
        • 1970-01-01
        • 2014-01-14
        • 2013-06-04
        • 1970-01-01
        • 2018-02-24
        • 1970-01-01
        • 1970-01-01
        • 2012-12-16
        • 2013-10-23
        相关资源
        最近更新 更多