【问题标题】:How to configure exclusive consumer with Grails and JMS / ActiveMQ?如何使用 Grails 和 JMS / ActiveMQ 配置独占消费者?
【发布时间】:2015-01-28 16:50:25
【问题描述】:

我有一个使用 JMS 插件订阅给定 ActiveMQ 主题的 Grails 应用程序。如何使 TestService 类成为独占消费者? Details of exclusive consumer here

用例是我在 AWS EC2 上运行消费者,并且 ActiveMQ 提要的持续时间为 5 分钟,如果实例死亡,替换实例需要比这更长的时间。我不能丢失消息并且必须保留消息顺序,因此我希望使用多个实例,其中第一个连接实例将是代理发送每条消息的实例,而其他实例则保留。如果第一个实例死亡,AMQ 代理会将消息发送到其他实例之一。

此外,JMS 使用什么标准来确定独家消费者何时死亡或消失?

// resources.groovy
beans = {
    jmsConnectionFactory(org.apache.activemq.ActiveMQConnectionFactory) { 
    brokerURL top://example.com:1234 
    userName = 'user' 
    password = 'password' 
    } 
} 

class TestService { 

static exposes = ["jms"] 
static destination = "SOME_TOPIC_NAME" 
static isTopic = true 

def onMessage(msg) { 
    // handle message 

    // explicitly return null to prevent unwanted replyTo attempt 
    return null 
} 

} 

【问题讨论】:

    标签: grails jms activemq spring-jms


    【解决方案1】:

    首先,您的示例使用了主题,这是行不通的;你想要队列:

    class TestService { 
      static expose = ["jms"] 
      static destination = "MYQUEUE" 
      ...
    }
    

    在 ActiveMQ 中配置独占消费者很简单:

    queue = new ActiveMQQueue("MYQUEUE?consumer.exclusive=true");
    

    ..但是使用 Grails 插件可能会很棘手;你可以试试这些:

    class TestService { 
      static expose = ["jms"] 
      static destination = "MYQUEUE?consumer.exclusive=true" 
      def onMessage(msg){ ...}
    }
    
    
    class TestService { 
      static expose = ["jms"] 
      @Queue(
         name = "MYQUEUE?consumer.exclusive=true" 
      )
      def handleMessage(msg){ ...}
    }
    

    关于代理如何确定消费者是否死亡的问题,我不确定它在 ActiveMQ 中是如何完成的,但在大多数 JMS 实现中,TCP 失败会触发连接上的异常;对等点(在本例中为代理)处理异常并故障转移到下一个可用的消费者。

    希望有帮助

    【讨论】:

    • 谢谢,我会试一试并报告。重新暴露 vs 暴露,文档说“暴露”:gpc.github.io/grails-jms/docs/manual/index.html
    • 对不起,这不起作用。它需要是一个主题,而不是一个队列,这是我尝试做其他事情时的错误消息:“持久订阅需要一个主题(发布-订阅域)”。这是因为我希望能够拥有一个连接持久的独家消费者。
    • 我对@9​​87654326@ 不好,你是对的(我需要放慢阅读文档的速度:-D)。关于持久性,该功能适用​​于消息,而不是连接。使用队列,除非代理可以将消息传递给消费者,否则消息将保留在队列中。你说消息在 5m 后过期,你能增加它吗?持久订阅价格昂贵,并且对您的用例有严重的限制,请参阅this,尽可能避免使用它们。
    • 不,遗憾的是,JMS ActiveMQ 提要在我们公司之外,消息上只有 5 分钟的 TTL。该服务的目的是获取 JMS 提要并传输到具有更高 TTL 的 RabbitMQ 服务中。
    • Raffian 是对的,独占消费者只适用于队列。如果你有两个消费者在一个主题上,他们每个人都会得到一个消息的副本,这不是你想要的。所以使用带有非持久消费者的队列,因为持久消费者只适用于主题(正如 Raffian 所说,即使没有连接消费者,消息也不会从队列中删除,因此不需要持久订阅的概念)。跨度>
    猜你喜欢
    • 2019-05-04
    • 2018-12-18
    • 2019-01-02
    • 2018-03-14
    • 2019-10-27
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    相关资源
    最近更新 更多