gpt4 book ai didi

spring - 使用 RabbitMQ 插件在 Grails 中创建队列运行时

转载 作者:行者123 更新时间:2023-12-02 15:20:17 26 4
gpt4 key购买 nike

我有一个系统,外部系统可以订阅我的系统生成的事件。该系统使用 Grails 2 编写,使用 RabbitMQ plugin用于内部消息传递。到外部系统的事件通过 HTTP 进行通信。

我想为每个订阅者创建一个队列,以防止慢速订阅者端点减慢发送给其他订阅者的消息速度。订阅可以在运行时发生,这就是为什么在应用程序配置中定义队列是不可取的。

如何使用 Grails RabbitMQ 插件创建具有主题绑定(bind)运行时的队列?

由于从 RabbitMQ 队列读取消息直接与服务耦合,创建队列运行时的一个附带问题可能是拥有该 Grails 服务的多个实例。有任何想法吗?

最佳答案

我没有适合您的现成解决方案,但如果您按照 RabbitmqGrailsPlugin Descriptor 中的代码进行操作尤其是 doWithSpring部分
您应该能够重新创建初始化新 Queue 所需的步骤。和相关的Listener在运行时动态。

然后一切都归结为传递所需的参数,注册必要的spring bean并启动监听器。

要回答您的第二个问题,我认为您可以提出一些命名约定并为每个队列创建一个新的队列处理程序。可以在此处找到如何动态创建 Spring bean 的示例:dynamically declare beans

只是一个简短的例子,我将如何快速注册一个队列,它需要更多的布线等......

def createQ(queueName) {
def queuesConfig = {
"${queueName}"(durable: true, autoDelete: false,)
}
def queueBuilder = new RabbitQueueBuilder()
queuesConfig.delegate = queueBuilder
queuesConfig.resolveStrategy = Closure.DELEGATE_FIRST
queuesConfig()

queueBuilder.queues?.each { queue ->
if (log.debugEnabled) {
log.debug "Registering queue '${queue.name}'"
}
BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(Queue.class);
builder.addConstructorArgValue(queue.name)
builder.addConstructorArgValue(Boolean.valueOf(queue.durable))
builder.addConstructorArgValue(Boolean.valueOf(queue.exclusive))
builder.addConstructorArgValue(Boolean.valueOf(queue.autoDelete))
builder.addConstructorArgValue(queue.arguments)
DefaultListableBeanFactory factory = (DefaultListableBeanFactory) grailsApplication.mainContext.getBeanFactory();
factory.registerBeanDefinition("grails.rabbit.queue.${queue.name}", builder.getBeanDefinition());
}
}

关于spring - 使用 RabbitMQ 插件在 Grails 中创建队列运行时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37434000/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com