接着学习rabbitmq …ing
- 需求:队列动态绑定
- 思路:监听一个队列发送的消息,使用RabbitAdmin去实现动态绑定,并把队列需要的数据发送出去。另一个队列再监听这个队列发送的消息即可。
1. 定义队列
@Configuration
public class SendNewUserMQConfig {
/**
*
* @return
*/
@Bean
public DirectExchange userExchange() {
return new DirectExchange("shop.label.exchange");
}
/**
*
* @return
*/
@Bean
public Queue userQueue() {
return new Queue("shop.label.queue");
}
/**
*
* @return
*/
@Bean
public Binding userBinding() {
return BindingBuilder.bind(userQueue()).to(userExchange()).with("shop.label");
}
}
2 发送消息
@RestController
@RequestMapping("/user")
public class UserController {
@Resource
private RabbitTemplate rabbitTemplate;
@PostMapping("/send")
public Message sendMsg(@RequestBody Message msg) throws JsonProcessingException {
Map<String,Long> map = new HashMap<>();
map.put("labelId",1156156561L);
map.put("marketId",1156156561L);
rabbitTemplate.convertAndSend("shop.label.exchange","shop.label", map, message -> {
message.getMessageProperties().setMessageId(UUID.randomUUID().toString().replace("-",""));
Map<String, Object> headers = message.getMessageProperties().getHeaders();
headers.put("queue","admin.user.label.queue");
headers.put("exchange","admin.user.label.exchange");
headers.put("router","admin.user.dtoList");
return message;
});
return msg;
}
}
3. 接收消息
@Component
@Slf4j
public class ShopUserLabelReceiver {
@Resource
private RabbitAdmin rabbitAdmin;
@Resource
private RabbitTemplate rabbitTemplate;
@RabbitListener(queuesToDeclare = @Queue("shop.label.queue"))
public void adminUserLabelReceiver(Map<String,Long> map, Message message){
try {
log.info("【adminUserLabelReceiver】接收到的消息为 {}", map);
log.info("【adminUserLabelReceiver】接收到的消息标签Id为 {}", map.get("labelId"));
log.info("【adminUserLabelReceiver】消息头为 {}", message.getMessageProperties().getHeaders());
// message header
Map<String, Object> headers = message.getMessageProperties().getHeaders();
org.springframework.amqp.core.Queue queue = new org.springframework.amqp.core.Queue(String.valueOf(headers.get("queue")));
Exchange exchange = new DirectExchange(String.valueOf(headers.get("exchange")));
Binding binding = new Binding(queue.getName(), Binding.DestinationType.QUEUE,exchange.getName(),"admin.user.dtoList",null);
rabbitAdmin.declareQueue(queue);
rabbitAdmin.declareExchange(exchange);
rabbitAdmin.declareBinding(binding);
log.info("【adminUserLabelReceiver】开始发送消息 {}", "admin.user.label");
rabbitTemplate.convertAndSend(exchange.getName(),String.valueOf(headers.get("router")),map,message1 -> {
message1.getMessageProperties().setMessageId(UUID.randomUUID().toString().replace("-",""));
return message1;
});
} catch (Exception e) {
e.printStackTrace();
}
}
}
然后再监听admin.user.label.queue队列即可
@Component
@Slf4j
public class clientShopUserLabelReceiver {
@RabbitListener(queuesToDeclare = @Queue("admin.user.label.queue"))
public void shopUserLabelReceiver(Map<String,Long> msg, Message message, Channel channel){
try {
log.info("【userLabelReceiver】 接受到的消息为 {}", msg);
log.info("【userLabelReceiver】 接受到的消息ID为 {}", message.getMessageProperties().getMessageId());
channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
} catch (Exception e) {
e.printStackTrace();
}
}
}
4. Postman构造数据发送即可
感觉这个好绕,头晕