📄 整合 RabbitMQ 使用
内部资料,请刷新扫码登录
pigcloud
安装 RabbitMQ
docker 安装 rabbitmq
docker run -d -p 5672:5672 -p 15672:15672 --name rabbitmq rabbitmq:management
访问 rabbitmq 管理台
http://ip:15672
默认用户名密码 用户名 密码 guest guest
代码整合
目标服务增加 amqp 依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
nacos 对应的服务配置文件增加链接相关信息
spring:
rabbitmq:
host: 172.16.1.199
port: 5672
username: guest
password: guest
配置服务启动创建队列 hello
@Configuration(proxyBeanMethods = false)
public class RabbitQueueConfiguration {
/**
* 启动时创建队列
* @return
*/
@Bean
public Queue queue() {
return new Queue("hello");
}
}
配置服务监听 hello 队列
@Component
public class RabbitQueueListener {
/**
* 监听 hello 队列的处理器
* @param message
*/
@RabbitListener(queues = "hello")
@RabbitHandler
public void onMessage(Message message) {
log.info("消费端Payload: " + message.getPayload().toString());
}
}
代码中向指定队列发送消息
@Autowired
private AmqpTemplate amqpTemplate;
amqpTemplate.convertAndSend("队列名称","信息");
特殊说明
在 MQ 消费监听逻辑中调用 Feign pigx token 传递及 feign 调用
A 服务并没有 token 去请求 B 服务,pigx 也对这种情况进行了兼容。类似于 A 对外暴露 API,但是又安全限制。参考日志插入情况
FeignClient 需要带一个请求 token,FROM_IN 声明是内部调用
remoteLogService.saveLog(sysLog, SecurityConstants.FROM_IN);
目标接口对内外调用进行限制 @Inner 注解,这样就避免接口对外暴露的安全问题。只能通过内部调用才能使用,浏览器不能直接访问该接口
@Inner
@PostMapping
public R save(@Valid @RequestBody SysLog sysLog) {
return new R<>(sysLogService.save(sysLog));
}
在 MQ 消费监听逻辑中调用数据库查询 需要手动指定租户编号查询指定租户的信息,不然均是查询的租户 1
TenantContextHolder.set(id);
在 MQ 消费监听逻辑中不能使用数据权限等