Springboot下RabbitMQ 封装实现,支持点对点消息,广播消息、延时消息

一、为什么要封装

        在软件项目开发中,基本上都是多人共同开发,尤其是大型项目。而消息队列更是大多数业务都会使用,前期基本上都是在业务中直接注入RabbitTemplate,创建各自的交换机队列监听者完成业务开发,但是到了项目后期,大量的交换机和队列的定义代码充斥在各个模块,每次需要回溯业务逻辑的时候都在不停的翻找代码,寻找监听者

致命的是,通常我们找到了发消息的代码,由于通过RabbitTemplate发送消息是直接发给交换机的,想要找到处理消息的消费者业务代码,还需要通过交换机定义代码——交换机队列绑定——队列——监听者,这样繁琐的操作。同样的当你找了消息消费者的代码却不知道都有项目哪块对该队列发送了消息,如此总总浪费了开发人员大量的时间。

于是笔者为了消灭这种情况决定对RabbitMQ操作进行封装,目的是实现以下功能:

1、代码统一,交换机和队列复用,消灭项目定义交换机及队列的代码。

2、使用简单,像使用工具类一样,拿来即用。

3、流程清晰,在发送消息的地方指明消费者代码位置,同时通过消费者代码亦可找到有多少消息发送者。

4、异常处理增强,当消费者报错时候,通过优雅的方式处理异常,而不是rabbitmq反复重试,导致满屏错误日志。

二、代码

封装后总共有4个.java文件,分别是:

MqConf.java——>用于配置RabbitMq,定义公共交换机、队列、统一消费者等。

MqListener<T>.java——>抽象类,使用时定义消息消费者业务代码需要继承此类实现onReceive和onError方法。

MqTool.java——>定义对外调用方法,实际使用时直接调用该类方法发送消息。

MqMsg<T>.java——>实际发送的消息包装体。

MqConf.java

import com.bohuikeji.frame.module.admin.base.MqListener;
import com.bohuikeji.frame.module.admin.entity.mq.MqMsg;
import com.bohuikeji.frame.module.admin.thread.CachedThreadPool;
import com.bohuikeji.frame.module.admin.thread.MqListenerThread;
import com.bohuikeji.frame.module.admin.utils.SpringUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

/**
 * RabbitMQ配置
 * @author sjh
 */
@Slf4j
@Configuration("ranch-rabbitmq-conf")
public class MqConf {

    /**
     * 点对点消息队列
     * 默认交换机
     */
    public static final String QUEUE_RANCH_ONE_TO_ONE="queue.ranch.one.to.one";
    /**
     * 发送一对多(广播)消息队列
     */
    public static final String QUEUE_RANCH_ONE_TO_ALL="queue.ranch.one.to.all."+System.currentTimeMillis();

    /**
     * 延时消息队列
     */
    public static final String QUEUE_RANCH_DELAY="queue.ranch.delay";

    /**
     * 广播交换机
     */
    public static final String EXCHANGE_FANOUT_RANCH ="exchange.fanout.ranch";

    /**
     * 延时交换机
     */
    public static final String EXCHANGE_DELAY_RANCH="exchange.delay.ranch";


    @Bean
    public Queue oneToOneQueue() {return new Queue(QUEUE_RANCH_ONE_TO_ONE, true,false,true);}

    @Bean
    public Queue oneToAllQueue(){return new Queue(QUEUE_RANCH_ONE_TO_ALL, true,false,true);}

    @Bean
    public Queue delayQueue(){return new Queue(QUEUE_RANCH_DELAY, true,false,true);}

    /**
     * 广播交换机
     * @return
     */
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值