如何启动application.yml中配置的rabbitmq-native使用者?

时间:2016-10-22 03:19:17

标签: grails rabbitmq

我有一个带有rabbitmq-native 3.3.1插件的Grails 3.1.12应用程序。

build.gradle

compile "org.grails.plugins:rabbitmq-native:3.3.1"

此应用在群集中运行,我希望实例充当工作者。写入交换的消息应该转到一个实例,下一个消息转到另一个实例,依此类推。

我可以使用每个消费者中的static块将消费者绑定到队列:

static rabbitConfig = [
        "queue": "my.queue.that.is.bound.to.some.exchange"
]

或者我可以在application.yml中绑定它们:

rabbitmq:
    exchanges:
        - name: some.exchange
          type: fanout
    queues:
        - name: my.queue.that.is.bound.to.some.exchange
          exchange: some.exchange
    consumers:
        MyConsumer:
            queue: my.queue.that.is.bound.to.some.exchange

但是当我将消费者映射到application.yml中的队列时,消费者不会消耗队列中的消息。我设法转储RabbitMQ状态报告,该报告显示消费者已停止:

[
    {
        "consumers":
        [
            {
                "fullName": "MyConsumer",
                "load": 0.0,
                "name": "MyConsumer",
                "numConfigured": 1,
                "numConsuming": 1,
                "numProcessing": 0,
                "queue": "my.queue.that.is.bound.to.some.exchange",
                "runningState": {
                    "enumType": "com.budjb.rabbitmq.RunningState",
                    "name": "STOPPED"
                }
            }
        ],
        "host": "localhost",
        "name": "35d07d1d-9cdc-460f-a63d-da24eb72b479",
        "port": 5672,
        "runningState": {
            "enumType": "com.budjb.rabbitmq.RunningState",
            "name": "RUNNING"
        },
        "virtualHost": "/"
    }
]

我尝试从rabbitContext.startConsumers()调用consumerManager.start()甚至是Bootstrap.init(),但消费者尚未填充(consumerManager.consumers == []),因此它什么也没做。

我试图将消费者绑定保留在外部化配置中,因此我可以根据上下文选择性地打开或关闭消费者。例如,我可能会关闭服务于网络流量的节点上的重度消费者。与配置文件相反,在使用者中的静态初始化程序块中进行操作会更加尴尬。

那么,如何在application.yml

中定义队列绑定时启动我的消费者

1 个答案:

答案 0 :(得分:0)

我在插件上进行了一些调试,发现启动消费者时,它使用以下方法验证了配置:

sendAs

在我的情况下,验证失败,因为我的配置不具有@Override boolean isValid() { boolean valid = true if (!queue && !exchange) { log.warn("consumer is not valid because it has no queue nor exchange defined") valid = false } if (queue && exchange) { log.warn("consumer is not valid because is has both a queue and an exchange defined") valid = false } if (binding instanceof Map && !(match in ["any", "all"])) { log.warn("match must be either 'any' or 'all'") valid = false } return valid } binding属性,队列使用者不需要该属性。

为它们添加虚假值使配置有效,使用方可以正常启动并使用消息。

不确定这是否也会对您的情况有所帮助,但在我看来确实有帮助:)