SpringCloud学习笔记(七)--Spring Cloud Stream使用

Spring Cloud Stream是Spring Cloud的一个组件也是操作消息队列的另一种方法,

SpringCloud学习笔记(七)--Spring Cloud Stream使用_第1张图片

下面演示如何使用Stream(前提已配置mq相关信息)

添加依赖


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

定义接口

import org.springframework.cloud.stream.annotation.Input;
import org.springframework.cloud.stream.annotation.Output;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.SubscribableChannel;

public interface StreamClient {
    @Input("myMessage") //定义一个固定值 返回参数固定写法
    SubscribableChannel input();

    @Output("myMessage") //定义一个固定值 返回参数固定写法
    MessageChannel output();
}

消息接收类

import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.annotation.StreamListener;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Component;

@EnableBinding(StreamClient.class)
@Component
@Slf4j
public class StreamReceiver {

    @StreamListener("myMessage")
//    @SendTo("myMessage2") //返回响应的消息队列名前缀
    public void process(Object message){
        log.info("StreamReceiver:{}",message);
//        return message;
    }
}

注: @SendTo("myMessage2") 是返回响应的消息

消息发送类--发送消息的Controller

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import ppc.order.message.StreamClient;

import java.util.Date;

@RestController
public class SendMessageController {

    @Autowired
    private StreamClient streamClient;//依赖注入接口

    @RequestMapping("/sendMessage")
    public void process(){
        streamClient.output().send(MessageBuilder.withPayload("now:"+new Date()).build());//向mq发送消息
    }
}

测试

调用接口,发送消息值mq;

http://localhost:8050/sendMessage

查看mq,mq接收到消息;

SpringCloud学习笔记(七)--Spring Cloud Stream使用_第2张图片

查看后台日志

2020-02-11 22:18:29.966  INFO 1848 --- [4aa6g1TPz1Y0A-1] ppc.order.message.StreamReceiver         : StreamReceiver:now:Tue Feb 11 22:18:29 CST 2020

 

注:实际项目中一般不是一个实例,当启动多个实例时,会出现多个以myMessage开头的队列,当发送方发送消息的时候,每个队列都会接受到消息,导致每个接收方都会收到消息;显然不是我们想要的,我们希望多个接收方监听同一个队列,发送方每发一次消息,只有一个接收方收到消息,添加如下配置

spring:
  cloud:
    stream:
      binders: 
        myMessage: //代码中定义的固定值
          group: order //分组名 自定义
          content-type: application/json //添加这个配置,当发送对象时,可在mq页面查看对象信息而不是16进制字符串

你可能感兴趣的:(SpringCloud学习笔记(七)--Spring Cloud Stream使用)