“止于唇齿的热爱最廉价,如果不是一起到最后的那个人,那一个人一辈子又有何妨“”
概述
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切面,再写一个注解,使用注解会很方便。需要的话自己去查吧。。