亲测有效,直接上代码
yml文件配置:
#自定义队列名称和键
custom:
queue-name: cs_queue
routing-key: cs
//配置类,项目启动自动加载
@Configuration
public class TopicMqConfig implements BeanPostProcessor {
@Resource
private RabbitAdmin rabbitAdmin;
//配置文件读取标识
@Value("${custom.queue-name}")
private String queueName;
@Value("${custom.routing-key}")
private String routingKey;
@Bean
public RabbitAdmin rabbitAdmin(ConnectionFactory connectionFactory) {
RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory);
//只有设置为true,spring才会加载RabbitAdmin 这个类
rabbitAdmin.setAutoStartup(true);
return rabbitAdmin;
}
//初始化自动创建交换机队列以及绑定
@PostConstruct
public void init() {
Queue queue = new Queue(queueName);
rabbitAdmin.declareQueue(queue);
//交换机可以像队列一样,读取配置文件获取,这里测试
TopicExchange exchange = new TopicExchange("unique_exchange");
rabbitAdmin.declareExchange(exchange);
rabbitAdmin.declareBinding(BindingBuilder.bind(queue).to(exchange).with(routingKey));
}
}
生产者就不写了,百度一下
消费者可以从配置文件读取变成动态监听队列
@Slf4j
@Component
public class Consumer1 {
@RabbitHandler
@RabbitListener(queues = "${custom.queue-name}")
public void receive(String content) {
log.info("队列收到消息{}", content);
}
}