一。rabbitmq AmqpTemplate使用
1.引入依赖
<!-- 添加springboot对amqp的支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2.消息发送方
先注入AmqpTemplate类
@Autowired
private AmqpTemplate amqpTemplate;
amqpTemplate.convertAndSend("队列名称" , "消息内容");
amqpTemplate.convertAndSend("exchange名称" , "key值", "消息内容");
3.消息接收方
@RabbitListener(queuesToDeclare = @Queue("队列名称"))
public void mqReceiver(String message) {
log.info("mqReceiver,message={}" , message);
}
#只用exchange和key值匹配的消息才能接收
@RabbitListener(bindings = @QueueBinding(
value = @Queue("队列名称"),
key = "key值",
exchange = @Exchange("exchange值")
))
踩过的坑,需要在接收内增加@Component注解,才能正常接收到消息
二。stream的方式
准备工作:安装rabbitmq
在消息接收方和发送方配置文件增加rabbitmq的连接信息:
spring:
rabbitmq:
host: rabbitmq主机ip
port: rabbitmq对程序调用暴露的端口(默认5672),而不是15672
username: 用户名
password: 密码
1.引入依赖
<!--rabbitmq依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
2.定义发送管道
public interface MySource {
final String OUTPUT = "demoOutput";
@Output(OUTPUT)
MessageChannel output();
}
3.定义接收管道
public interface MySink {
final String INPUT = "demoInput";
@Input(INPUT)
SubscribableChannel input();
}
4.消息发送方
@RestController
@RequestMapping("/mq/stream")
@EnableBinding(value = {MySource.class})
public class MqStreamController {
@Autowired
private MySource mySource;
@GetMapping("/send")
public String send() {
String msg = "消息发送";
mySource.output().send(MessageBuilder.withPayload(msg).build());
return "stream send ok";
}
}
5.消息接收方
@Slf4j
@EnableBinding(value = {MySink.class})
public class MyStreamReceiver {
@StreamListener(value = MySink.INPUT)
public void receive(String msg) {
log.info("receive,message={}" , msg);
}
}
踩过的坑:发现接收方并不能接收到消息,自己观察发现,发送管道和接收管道并没有做关联。所以还需要进行下面的配置,在配置文件增加以下的配置信息:
spring:
cloud:
stream:
bindings:
demoInput: #接收管道的名称
destination: demoExchange #相当于exchange,定义消息的接收路径
group: demo #分组之后就将该消息队列持久化了
demoInput: #接收管道名称
destination: demoExchage
group: demo2
orderOutput:
destination: demoExchange #定义消息的发送路径
contentType: application/json #定义消息的输出格式
rabbit:
bindings:
demoInput:
consumer:
bindingRoutingKey: demoKey.* #定义消息的key,只有消息和接收定义的key匹配才能被该消费者消费
demorOutput:
producer:
routing-key-expression: '''demoKey.*''' #定义消息发送的key,只有匹配的接收方才能收到
配置完之后,便能正常的发送和接收消息了。