1. 先引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>
2. 在配置文件中进行配置
spring:
# 配置rabbitmq连接信息
rabbitmq:
host: 192.168.10.233
port: 5672
username: admin
password: admin
virtual-host: my-project-dev
cloud:
stream:
bindings: # 绑定通道和交换机
myOutput: # 定义生产者的通道
destination: streamExchange #自定义交换机的名字
myInput: # 定义消费者通道
destination: streamExchange
# 通过分组避免消息被重复消费,以及实现消息的持久化
group: group1
3. 实现消息生产者
- 构建消息通道接口
import org.springframework.cloud.stream.annotation.Input;
import org.springframework.cloud.stream.annotation.Output;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.SubscribableChannel;
import org.springframework.stereotype.Component;
/**
* 声明构建通道channel
*/
@Component
public interface MyStreamChannel {
String OUTPUT = "myOutput";
String INPUT = "myInput";
/**
* 消息生产
*
* @return
*/
@Output(MyStreamChannel.OUTPUT)
MessageChannel output();
/**
* 消息消费
*
* @return
*/
@Input(MyStreamChannel.INPUT)
SubscribableChannel input();
}
- 创建发送消息接口
/**
* 发送消息接口
*/
public interface StreamService {
/**
* 发送消息操作
*/
public void sendMsg();
}
- 实现发送消息功能
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.stereotype.Component;
/**
* 开启绑定器,绑定通道channel
*/
@Component
@EnableBinding(MyStreamChannel.class)
public class StreamServiceImpl implements StreamService {
@Autowired
private MyStreamChannel myStreamChannel;
@Override
public void sendMsg() {
AppUser user = new AppUser();
user.setId("1001");
user.setNickname("Tom");
// 发送消息给mq
myStreamChannel.output().send(MessageBuilder.withPayload(user).build());
}
}
这里需要通过注解 @EnableBinding(MyStreamChannel.class) 绑定到对应的channel上
send()方法参数 Message 是泛型,任何类型的消息数据都可以
4. 实现消息消费者
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.annotation.StreamListener;
import org.springframework.stereotype.Component;
/**
* 消息消费端
*/
@Component
@EnableBinding(MyStreamChannel.class)
public class MyStreamConsumer {
/**
* 监听并且实现消息的消费
*
* @param user {@link AppUser}
*/
@StreamListener(MyStreamChannel.INPUT)
public void receiveMsg(AppUser user) {
// 实现具体的业务逻辑
System.out.println(user.getId());
System.out.println(user.getNickname());
}
}
这里也是需要通过注解 @EnableBinding(MyStreamChannel.class) 绑定到对应的channel上
5. 通过接口测试一下
@RestController
@RequestMapping("/hello")
public class HelloController{
@Autowired
private StreamService streamService;
@GetMapping("/stream")
public String stream() {
streamService.sendMsg();
return "send ok!";
}
}