“止于唇齿的热爱最廉价,如果不是一起到最后的那个人,那一个人一辈子又有何妨“”

概述

spring提供了AmqpTemplate使用rabbitmq,使用起来非常的方便,有关rabbitmq的介绍网上已经有了很多很好的文章
开始搬砖

 implementation('org.springframework.boot:spring-boot-starter-amqp')

maven项目自己转一下
配置

spring:
  rabbitmq:
  	# 虚拟机
    virtual-host: xxx
    # 路径(192.168.xx.xx)
    host: rabbitmq.byb.com
    port: 5672
    username: xxx
    password: xxx
    listener:
      simple:
         # 初始化并发数量
        concurrency: 10
        # 设置并发最大数量
        max-concurrency: 20

初始化队列

@Configuration
public class MQConfig {

    public static final String BIZLOG_QUEUE = "bizlog";
    @Bean
    public Queue bizLogQueue() {
        return new Queue(BIZLOG_QUEUE , true);
    }

  • 当mq中不存在定义的队列时会自动创建
  • 需要使用交换机时可以在这里定义和绑定,定义和队列一样,名字改一下就可以,绑定定义一个binding
    在这里插入图片描述
  • 里面是需要的参数,我没有使用,会不会出问题还不知道,可以参考其他文章

发送消息到rabbitmq

 Boolean data = (Boolean) amqpTemplate.convertSendAndReceive("bopLog", JSON.toJSONString(map));
  • json使用的是阿里巴巴的fastjson
  • 因为我是一条消息只需要存到一个数据库,也就是一个队列对应一个数据库,所以我不需要使用交换机,如果需要一条消息存到不同的数据库,可以定义一个交换机,方法还是这个方法,更改传入的参数为exchange和rootkey,将队列绑定到交换机即可。
  • 发送的方法有很多,我主要使用了converAndSend和convertSendAndReceive,converAndSend是直接发送,没有返回,converSendAndReceive是发送和接受返回,如果成功接受则会返回true,失败则返回空,缺点就是可能会有点慢,而且有一定的耦合,个人建议,在开发时使用converSendAndReceive,调试时可以很快的知道是接受出了问题还是发送出了问题,当所有的都调通之后可以改为converAndSend,这样他只需要发送到mq,不管你是否接受成功,这样降低了耦合,即使监听接受的服务宕机了,下次开机时一样可以将数据存储到数据库

接受并保存到数据库
发送和接受完全可以定义在不同的项目,他们之间并无直接的联系

@Component
public class BopReceiver {

    private Logger logger = LoggerFactory.getLogger(BopReceiver.class);

    @Autowired
    ListenerUtil listenerUtil;

    /**
     * <p>方法描述:监听消息队列存储数据到数库 </p >
     * @param message 日志消息
     * @author zlh
     * @since 2019/9/19 11:32
     * @return
     */
    @RabbitListener(queues = "bopLog")
    public Boolean listenerBopLog(String message){
        String tableName = "log_bop";
        Boolean bopLog = listenerUtil.lister(message, tableName, logger, "存储业务日志失败");
        return bopLog;
    }
public Boolean lister(String message, String tableName, Logger logger,String errorMsg){
        Boolean bool = null;
        String uuid = getUUID();
        try{
            Map map = JSON.parseObject(message, Map.class);
            //我自己的处理,删掉
            map = findName(map);
            map.put("id", uuid);
            //存入数据库
            bool = DbHelper.use("log").insert(tableName, map);
        }catch (Exception e){
            e.printStackTrace();
            logger.error(errorMsg);
        }
        return bool;
    }
  • 我这里做了一些处理,如果你不需要做处理直接将message转为map存入数据库就可以。
    如果是访问日志的话可以写一个aop切面,再写一个注解,使用注解会很方便。需要的话自己去查吧。。

更多推荐