消息中间件RabbitMQ实战解析

注:文章皆为个人纪录,可用性请以最终结果为准,若有错还请大佬们指出,谢谢!

发送消息与消费消息流程辅助理解

        你现在要去约妹,见面前会进行如下对话:

        你(消息提供者):我会给你一个惊喜,你找到我我就告诉你,接下来我告诉你我所在的位置:这块地方有很多十字路口,你先找到名叫“交换机”的十字路口,再去找到与”交换机“十字路口相连的名叫"队列"的那条套路,路上有很多人,我拿着一朵叫”RoutingKey“的 fa ,找到我后我就告诉你一个名叫”message“的惊喜

        妹子(消费者):SB?


提供者

步骤一:引入依赖(提供者、消费者都要)

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

步骤二:创建一个配置类(提供者要)

声明交换机,RoutingKey,队列,并将交换机与队列进行绑定

/**
 * MQ常量类
 */
public class MqConstants {
public static final String EXPORT_QUEUE = "export_queue"; // 文件导出队列名称
public static final String EXPORT_TOPIC_EXCHANGE = "export_topic_exchange"; // 文件导出交换机名称
public static final String EXPORT_ROUTINGKEY = "export.#"; // 文件导出关键字key

public static final String durable_yes = "true";//是否持久化

}

@Component
public class MessageSender {
    public static final Logger LOGGER = LoggerFactory.getLogger(MessageSender.class);

    private static RabbitTemplate rabbitTemplate;

    @Autowired
    public void setRabbitTemplate(RabbitTemplate rabbitTemplate) {
        rabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter());
        MessageSender.rabbitTemplate = rabbitTemplate;
    }

    /**
     * 导出队列
     *
     * @return 导出队列
     */
    @Bean
    @Qualifier(MqConstants.EXPORT_QUEUE)
    Queue exportQueue() {
        return new Queue(MqConstants.DR_OEM_T1_QUEUE, true, false, false);
    }

    /**
     * 导出交换器
     *
     * @return 导出交换器
     */
    @Bean
    @Qualifier(MqConstants.EXPORT_TOPIC_EXCHANGE)
    TopicExchange exportTopicExchange() {
        return new TopicExchange(MqConstants.DR_OEM_T1_EXCHANGE, true, false);
    }

    /**
     * 导出声明绑定关系
     *
     * @return 导出声明绑定关系
     */
    @Bean
    Binding exportBinding(@Qualifier(MqConstants.EXPORT_TOPIC_EXCHANGE) TopicExchange exchange,
                          @Qualifier(MqConstants.EXPORT_QUEUE) Queue queue) {
        return BindingBuilder.bind(queue).to(exchange).with(MqConstants.EXPORT_ROUTINGKEY);
    }

    /**
     * RabbitMQ发送异步导出任务列表信息
     *
     * @param messageMap 消息
     */
    public static void sendMsgAsyncExportExcelByRabbit(Map<String, Object> messageMap) {
        try {
            rabbitTemplate.convertAndSend(MqConstants.EXPORT_TOPIC_EXCHANGE, MqConstants.EXPORT_ROUTINGKEY, messageMap);
            LOGGER.info("发送异步导出任务消息成功, queue = " + MqConstants.EXPORT_QUEUE + ", 消息体为:" + messageMap);
        } catch (AmqpException e) {
            LOGGER.error("发送异步导出任务消息失败, queue = " + MqConstants.EXPORT_QUEUE + ", 消息体为:" + messageMap);
        }
    }
}

消息提供者实战示例:

// TODO 业务处理
Map<String, Object> messageMap = new HashMap<>();
messageMap.put("fileName", fileName);
messageMap.put("dataTotalCount", count);
MessageSender.sendMsgAsyncExportExcelByRabbit(messageMap); // 发送消息-rabbitMQ
return "发送消息成功";

在yml或者properties文件中找到rabbitMQ的配置信息中的主机地址 host

再通过访问   host :15672   输入账号密码进入客户端 

再点击Exchanges即可查看刚刚创建的交换机信息

再点击Queues即可查看刚刚创建的队列信息,以及消息消费情况


消费者

步骤一:引入依赖(与提供者相同)

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

消息消费者实战示例:

@Component
@ConfigurationProperties(prefix = "spring.rabbitmq.listener.simple")
public class MessageReceiver {
    /**
     * 处理导出消息
     *
     * @param messageMap 消息体
     */
    @RabbitListener(
            bindings = @QueueBinding(
                    value = @Queue(value = MqConstants.EXPORT_QUEUE, durable = MqConstants.durable_yes),
                    exchange = @Exchange(value = MqConstants.EXPORT_TOPIC_EXCHANGE, durable = MqConstants.durable_yes, type = ExchangeTypes.TOPIC),
                    key = MqConstants.EXPORT_ROUTINGKEY
            ), containerFactory = "singleContainerFactory"
    )
    @RabbitHandler
    public void asyncExportMessage(@Payload Map<String, Object> messageMap) {
        log.info("----asyncExportMessage 收到消息,开始消费-----");
        log.debug("===========消息内容==============,{}", messageMap);
        try {
            // TODO 业务处理
        } catch (Exception e) {
            log.error("队列  {}  接收数据消费端异常! message = {},exception = {}", MqConstants.EXPORT_QUEUE, JSON.toJSONString(messageMap), e);
        }
        log.info("--------asyncExportMessage 消费完成--------");
    }
}

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值