使用AmqpTemplate只能指定对列名发送,并不会存在对应exchange关系,此时只能单配置一个,还要必须从上下文配置文件指明。
经过研究发现通过使用RabbitTemplate可以自动生成exchange和routingkey之间的关系,而不用去RabbitMQ的management页面操作。具体如下:
pom.xml依赖配置:
<!--消息队列模块-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
配置文件(当使用AmqpTemplate时,用来指定exchange,下面的方案其实用不到这个config文件):
@Configuration
public class RabbitMqConfig {
@Bean
public DirectExchange first(){
return new DirectExchange("exchange.ff.ff.coupon");
}
@Bean
public DirectExchange second(){
return new DirectExchange("crm");
}
@Bean
public DirectExchange third(){
return new DirectExchange("exchange.ff.ff.xxp");
}
}
发送者:
@RestController
public class SendController {
@Autowired
private AmqpTemplate amqpTemplate;
@Autowired
private RabbitTemplate rabbitTemplate;
@RequestMapping("/send")
public String send() {
String content = "Date:" + new Date();
// amqpTemplate.convertAndSend("couponSend",content);
rabbitTemplate.convertAndSend("exchange.ff.ff.test", "routingkey.ff.ff.test", "test:" + content);
return content;
}
}
rabbitTemplate.convertAndSend("exchange.ff.ff.test", "routingkey.ff.ff.test", "test:" + content);
这个语句是重点,指定了exchange、routingkey和发送的内容,而下面的消费者才是真正的指定了创建exchange、routingkey、queue之间的关系:
@Component
public class Receiver{
private static Logger logger = LoggerFactory.getLogger(Receiver.class);
//注解很重要,标注了exchange、routingkey、queue之间的关系,对应指定到这个queue
@RabbitListener(bindings = {@QueueBinding(value = @Queue(value = "queue.ff.ff.sendPush"), exchange = @Exchange(value = "exchange.ff.ff.sendPush"), key = "routingkey.ff.ff.sendPush")})
public void receiver(String message) {
logger.info("sendPush接收消息:{}", message);
}
}
@RabbitListener(bindings = {@QueueBinding(value = @Queue(value = "queue.ff.ff.sendPush"), exchange = @Exchange(value = "exchange.ff.ff.sendPush"), key = "routingkey.ff.ff.sendPush")})
这个双层注解表明了之间的关系,具体请看public @interface RabbitListener 这个注解类里的变量名。截图如下:

进而看public @interface QueueBinding这个注解类里的参数:

进而研究并尝试出这样的注解配置可以自己在代码里制定多个exchange、routingkey、queue之间的对应关系,而不需要再上下文配置文件里进行配置。
本文介绍了如何在SpringBoot中利用RabbitTemplate动态创建exchange、routingkey和queue的对应关系,避免手动配置。通过@RabbitListener和@QueueBinding注解,可以在代码中灵活定义多个绑定关系,简化RabbitMQ的配置过程。
163

被折叠的 条评论
为什么被折叠?



