声明Exchange 绑定Queue到Exchange
@Configuration
public class RabbitMQConfig {
// 设置使用的交换机
public final static String EXCHANGE_TOP = "test";
// 设置队列 多个队列绑定同一个Exchange
public final static String QUEUE_MSG_1 = "topic.msg";
public final static String QUEUE_MSG_2 = "topic.msg2";
public final static String QUEUE_ALL = "topic.#";
@Bean
TopicExchange topExchange() {
return new TopicExchange(EXCHANGE_TOP);
}
@Bean
public Queue pushMsgQueue1() {
return new Queue(QUEUE_MSG_1, false);
}
@Bean
public Queue pushMsgQueue2() {
return new Queue(QUEUE_MSG_2, false);
}
@Bean
public Queue pushMsgQueue3() {
return new Queue(QUEUE_ALL, false);
}
// queue绑定exchange的时候 routingKey(with())中的参数很重要 决定着这个queue会接收哪些路由key的消息
@Bean
Binding bindingExchangeMessage1() {
return BindingBuilder.bind(pushMsgQueue1()).to(topExchange()).with(QUEUE_MSG_1);
}
@Bean
Binding bindingExchangeMessage2() {
return BindingBuilder.bind(pushMsgQueue2()).to(topExchange()).with(QUEUE_MSG_2);
}
@Bean
Binding bindingExchangeMessage3() {
return BindingBuilder.bind(pushMsgQueue3()).to(topExchange()).with(QUEUE_ALL);
}
}
生产者生成消息
// 组建消息
String messageId = String.valueOf(UUID.randomUUID());
String messageData = "message: 分诊室1号发来请求";
String createTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
Map<String, Object> manMap = new HashMap<>();
manMap.put("messageId", messageId);
manMap.put("messageData", messageData);
manMap.put("createTime", createTime);
// 将消息转换为json
ObjectMapper mapper = new ObjectMapper();
String writeValueAsString = null;
try {
writeValueAsString = mapper.writeValueAsString(manMap);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
// 发送消息
mRabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_TOP, RabbitMQConfig.QUEUE_MSG_2, writeValueAsString);
消费者消费消息
@Component
public class MessageConsumer {
@RabbitListener(
bindings = @QueueBinding(
value = @Queue(value = "topic.#", durable = "true"),
exchange = @Exchange(value = "test", durable = "true", type = "topic"),
key = "#"
)
)
public void handleMessage(@Payload String returnMessage, Channel channel, @Headers Map<String, Object> headers) {
System.out.println("订单服务响应回来的消息是 :" + returnMessage);
Long tag = (Long) headers.get(AmqpHeaders.DELIVERY_TAG);
// 消费完毕,手动确认消息签收
try {
channel.basicAck(tag, false);
} catch (Exception e) {
e.printStackTrace();
}
}
}