springcloud 消息中间件使用

一。rabbitmq AmqpTemplate使用

1.引入依赖


        
            org.springframework.boot
            spring-boot-starter-amqp
        

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.引入依赖

        
        
            org.springframework.cloud
            spring-cloud-starter-stream-rabbit
            2.0.0.RELEASE
        

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的端口。

你可能感兴趣的:(springcloud)