Springboot集成RabbitMQ学习二

接着学习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构造数据发送即可

感觉这个好绕,头晕

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值