springcloud学习记录-Stream消息驱动

作用:屏蔽底层消息中间件的差异,降低切换版本,统一消息的编程模型

建立生产者项目:
pom:

   <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka-server -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <dependency>
            <groupId>com.atguigu.springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>${project.version}</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
   
        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-devtools -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-test -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

yml:

server:
  port: 8801
spring:
  application:
    name: cloud-stream-provider
  cloud:
    stream:
      binders: #开始配置要绑定的rabbitmq的配置信息
        defaultRabbit: #表示定义的名称。用于binding的整合
          type: rabbit #消息的组件类型
          environment: #设置rabbitmq的相关环境变量
            spring:
              rabbitmq:
                host: localhost
                port: 5672
                username: guest
                password: guest
      bindings: #服务的整合处理
        output: #这个名字是一个通道的名称
          destination: studyExchange # 表示要使用Exchange的名称定义
          content-type: application/json #表示消息类型为json,文本设置"text/plain"
          default-binder: defaultRabbit  #设置要绑定的消息服务的具体设置
eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka
  instance:
    lease-renewal-interval-in-seconds: 2 #设置心跳间隔(默认30s)
    lease-expiration-duration-in-seconds: 5 #如果超过了5秒的间隔(默认90s)
    instance-id: send-8801.com  #在信息列表时显示主机名称
    prefer-ip-address: true  #访问的路径变为ip地址

controller层:

public class SendMessageController {
   
    @Resource
    private IMessageProvider messageProvider;

    @GetMapping(value = "/sendMessage")
    public String sendMessage(){
        return messageProvider.send();
    };
}

service层:
接口:

public interface IMessageProvider {
    public String send();
}

实现类:

@EnableBinding(Source.class)//定义消息的推送管道
public class IMessageProviderImpl implements IMessageProvider {
    @Resource
    private MessageChannel output;//消息发送管道

    @Override
    public String send() {
        String string = UUID.randomUUID().toString();
        output.send(MessageBuilder.withPayload(string).build());
        System.out.println("serial:"+string);
        return null;
    }
}

主启动类

@SpringBootApplication
public class StreamMQMain8801 {
    public static void main(String[] args) {
        SpringApplication.run(StreamMQMain8801.class,args);
    }
}

启动eureka,rabbitMq,启动项目,测试
登录http://localhost:15672/
在这里插入图片描述
访问:http://localhost:8801/sendMessage
在这里插入图片描述
查看控制台打印。表明生产者发送信息到rabbitmq成功。

然后建立两个一样的消费者工程:
pom和生产者一样,
yml:

server:
  port: 8802
spring:
  application:
    name: cloud-stream-consumer
  cloud:
    stream:
      binders: #开始配置要绑定的rabbitmq的配置信息
        defaultRabbit: #表示定义的名称。用于binding的整合
          type: rabbit #消息的组件类型
          environment: #设置rabbitmq的相关环境变量
            spring:
              rabbitmq:
                host: localhost
                port: 5672
                username: guest
                password: guest
      bindings: #服务的整合处理
        input: #这个名字是一个通道的名称
          destination: studyExchange # 表示要使用Exchange的名称定义
          content-type: application/json #表示消息类型为json,文本设置"text/plain"
          default-binder: defaultRabbit  #设置要绑定的消息服务的具体设置
          group: lblA

eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka
  instance:
    lease-renewal-interval-in-seconds: 2 #设置心跳间隔(默认30s)
    lease-expiration-duration-in-seconds: 5 #如果超过了5秒的间隔(默认90s)
    instance-id: receive-8803.com  #在信息列表时显示主机名称
    prefer-ip-address: true  #访问的路径变为ip地址

controller层:

@Component
@EnableBinding(Sink.class)
public class ReceiveMessageListenerController {
        @Value("${server.port}")
        private  String serverPort;

        @StreamListener(Sink.INPUT)
        public void input(Message<String> message){
                System.out.println("消费者一号,---->接收的消息"+message.getPayload()+"端口号"+serverPort);
        };

}

主启动:

@SpringBootApplication
public class StreamMQMain8803 {
    public static void main(String[] args) {
        SpringApplication.run(StreamMQMain8803.class,args);
    }
}

然后启动两个消费者工程。
生产者发送信息让消费者接收。
问题:连个消费者都会接收到。
解决方法:
yml中加入:

input:
	group: lblA

当消费者为同一组时,生产者发送的消息只会被组里一个工程接收。
同时加入组以后,会有保存功能,当关闭消费者的工程后向其发送信息,rabbitmq会保存,再次启动消费者的工程时会将消息发送给消费者。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值