springcloud 消息中间件使用

本文介绍了在SpringCloud中如何使用RabbitMQ,包括通过AmqpTemplate进行消息发送和接收,以及使用stream方式进行消息传递。在AmqpTemplate方式中,详细了依赖引入、消息发送和接收方的设置。而在stream方式下,提到了安装rabbitmq后的配置步骤,从依赖引入、管道定义到发送和接收方的实现,并强调了发送和接收管道关联的配置关键点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一。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,只有匹配的接收方才能收到
配置完之后,便能正常的发送和接收消息了。


踩过的坑:rabbitmq如果是带有manage后台管理工具的版本,会发现rabbitmq启动时会暴露两个端口,默认分别是5672和15672,这里就是大坑了,15672是管理后台的端口,5672是程序连接的端口,也是springcloud连接rabbitmq的端口。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值