英文:
Create and bind queues dynamically to a single Exchange
问题
我有一个交换(exchange1
),它可以根据路由键表达式路由到 n
个不同的队列。
- 所有图像消息应该发送到队列1
- 所有文档消息应该发送到队列2
- 所有视频消息应该发送到默认队列3
未来,队列数量可以增加,例如(所有视频和 mp4 扩展应该发送到 queue4
)
我们如何动态创建和绑定队列到一个特定的交换,并且应该只使用一个流监听器?
英文:
I have an exchange (exchange1
) and it can be routed to n
different queues based on routing-key-expression.
- All Images messages should go to queue1
- All Document messages should go to queue2
- All video messages should go to default queue3
and in future, the queue number can be increased like (all video and mp4 extensions should go to queue4
)
How we can create and bind queues dynamically to one particular exchange and should use only one stream Listener?
答案1
得分: 0
不能直接使用Spring Cloud Stream的属性来完成。
您需要声明具有所需路由键的Exchange
、Queue
和Binding
@Bean
,然后配置消费者绑定以不声明队列和绑定,并设置s.c.s.consumer.multiplex=true
和s.c.s.destination=queue1,queue2,queue3
。
请参阅使用现有队列/交换以了解如何禁用绑定器的自动配置。
英文:
It can't be done directly with Spring Cloud Stream via properties.
You would have to declare Exchange
, Queue
and Binding
@Bean
s with the required routing keys and then configure the consumer binding to not declare the queue and binding) and then set s.c.s.consumer.multiplex=true
and s.c.s.destination=queue1,queue2,queue3
.
See Using Existing Queues/Exhanges for how to disable binder provisioning.
答案2
得分: 0
以下是您要翻译的内容:
"使用Spring Boot中的Spring-AMQP插件可以轻松完成。我在下面的代码片段中演示了如何实现它。 (我相信代码胜过理论):
package com.savk.workout.spring.rabbitmqconversendreceivefanoutproducer;
import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class DynamicBindingDemo {
@Autowired
private RabbitAdmin rabbitAdmin;
@Autowired
private RabbitTemplate rabbitTemplate;
private boolean switchedOn = true;
//Toggle binding programatically
@Scheduled(fixedRate = 10000L)
public void manipulateBinding() {
Exchange exchange = ExchangeBuilder.directExchange("exchange").autoDelete().build();
Queue queue = QueueBuilder.nonDurable("queue").build();
Binding binding = BindingBuilder.bind(queue).to(exchange).with("routingkey").noargs();
if(switchedOn) {
rabbitAdmin.declareBinding(binding);
} else {
rabbitAdmin.removeBinding(binding);
}
}
@Bean
public RabbitAdmin rabbitAdmin() {
return new RabbitAdmin(rabbitTemplate.getConnectionFactory());
}
}
确保您还有相应的RabbitListener:
@RabbitListener(queues = "queuename")
@RabbitHandler
public String handle(String msg) {
System.out.println("RCVD :: " + msg);
String response = "PONG { " + msg + " } from INSTANCE " + INSTANCE;
return response;
}
您可以看到一切都可以动态完成。您只需操作绑定即可。"
英文:
It can be easily done using Spring-AMQP plugin in Spring boot. I have enclosed a below snippet how it can be achieved. (I believe code speaks more than theoritical words) :
package com.savk.workout.spring.rabbitmqconversendreceivefanoutproducer;
import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class DynamicBindingDemo {
@Autowired
private RabbitAdmin rabbitAdmin;
@Autowired
private RabbitTemplate rabbitTemplate;
private boolean switchedOn = true;
//Toggle binding programatically
@Scheduled(fixedRate = 10000L)
public void manipulateBinding() {
Exchange exchange = ExchangeBuilder.directExchange("exchange").autoDelete().build();
Queue queue = QueueBuilder.nonDurable("queue").build();
Binding binding = BindingBuilder.bind(queue).to(exchange).with("routingkey").noargs();
if(switchedOn) {
rabbitAdmin.declareBinding(binding);
} else {
rabbitAdmin.removeBinding(binding);
}
}
@Bean
public RabbitAdmin rabbitAdmin() {
return new RabbitAdmin(rabbitTemplate.getConnectionFactory());
}
}
Make sure you also have corresponding RabbitListener for it :
@RabbitListener(queues = "queuename")
@RabbitHandler
public String handle(String msg) {
System.out.println("RCVD :: " + msg);
String response = "PONG { " + msg + " } from INSTANCE " + INSTANCE;
return response;
}
You see everything can be done dynamically. All you need is to manipulate with bindings.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论