我有一个带有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
?
答案 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
属性,队列使用者不需要该属性。
为它们添加虚假值使配置有效,使用方可以正常启动并使用消息。
不确定这是否也会对您的情况有所帮助,但在我看来确实有帮助:)