12 Spring Cloud Stream

12 Spring Cloud Stram

12.1 概述

12.2 核心概念

12.3 入门案例(rabbitmq)

 前提:安装好rabbitmq,window安装可参考 https://blog.csdn.net/h4241778/article/details/107424850

12.3.1 生产者

  1 引入配置

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

2 配置application.properties

server.port=7002
spring.application.name=stream_producter
spring.rabbitmq.addresses=127.0.0.1
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
#内置的获取消息通道 从个xx-default中获取消息
spring.cloud.stream.bindings.input.destination=xx-default
#配置绑定器
spring.cloud.stream.binders.defaultRabbit.type=rabbit

3 代码实现

import org.springframework.cloud.stream.messaging.Source;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.stereotype.Component;

/**
 * 入门案例
 *   1 引入依赖
 *   2 配置application。properties
 *   3 发送消息的话,定义一个通道接口,通过接口中内置的messagechannel
 *      springcloudstream 中内置接口source
 *   4 @EnableBinding 绑定对应的通道
 *   5
 */
@Component
@EnableBinding(Source.class)
public class MessageSender {
    @Autowired
    private MessageChannel output;


    public void sendMessage(Object msg)  {
        //发送消息
        output.send(MessageBuilder.withPayload(msg).build());
    }
}

4 测试类调用

package xx.study.sc;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import xx.study.sc.util.MessageSender;

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class MsgSendTest {
    @Autowired
    private MessageSender messageSender;
    @Test
    public void testSend(){
        System.out.println("发送消息!!!");
        messageSender.sendMessage("hello sc");
    }
}

12.3.2 消费者

1 pom配置相同

2 配置application.properties

server.port=7002
spring.application.name=stream_producter
spring.rabbitmq.addresses=127.0.0.1
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
#内置的获取消息通道 从个xx-default中获取消息
spring.cloud.stream.bindings.input.destination=xx-default
#配置绑定器
spring.cloud.stream.binders.defaultRabbit.type=rabbit

3 代码实现

package xx.study.sc.util;

import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.annotation.StreamListener;
import org.springframework.cloud.stream.messaging.Sink;
import org.springframework.stereotype.Component;
/** 1 引入依赖
 *  2 配置application.properties
 *  3 需要配置一个通道的接口
 *       内置获取消息的通道接口 sink
 *  4 绑定通道
 *  5 配置一个监听方法:消息从中间件获取数据后,执行的业务逻辑方法
 *    需要在监听方法上配置@StreamListener
 *
 */
@Component
@EnableBinding(Sink.class)
public class ReceiveMsgListener {
    /**
     * 这是个监听器 一致会监听通道 接收消息
     * @param msg
     */
    @StreamListener(Sink.INPUT)
    public void getMessage(String msg){
        System.out.println(msg);

    }
}

12.4 自定义消息通道

source Sink引用改成自定义的OrderProcessor,同时application.properties中input、output也需要相应改下即可。

12.5 消息分组

 实现的方式很简单,我们只需要在服务消费者端设置spring.cloud.stream.bindings.input.group即可,组名相

 同的,只有一个会收到。

spring.cloud.stream.bindings.input.group=groupname

12.6  消息分区

 举例 某个消费者只接受某个id的信息

#--------生产者配置 
#分区关键字 对象中的id ,对象  payload:根据当前字符串,可以是表达式
spring.cloud.stream.bindings.output.producer.partition-key-expression=payload
#分区的大小,消费者的个数
spring.cloud.stream.bindings.output.producer.partition-count=2



 #-----------消费者1配置
#消费者个数
spring.cloud.stream.instanceCount=2
#当前消费者的索引
spring.cloud.stream.instanceIndex=0
#开启分区
spring.cloud.stream.bindings.input.consumer.partitioned=true


#-----------消费者2配置
#消费者个数
spring.cloud.stream.instanceCount=2
#当前消费者的索引
spring.cloud.stream.instanceIndex=1
#开启分区
spring.cloud.stream.bindings.input.consumer.partitioned=true



猜你喜欢

转载自blog.csdn.net/h4241778/article/details/107300755