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