目录
项目结构
消费者配置:
server:
port: 8002
spring:
cloud:
stream:
bindings: # 消费者配置
input:
destination: scstreamExchange # 目标topic
group: stream # 目标群
生产者配置:
server:
port: 8001
spring:
cloud:
stream:
bindings:
output: # 生产者配置
destination: scstreamExchange
一、集成RabbitMQ的使用案例
父工程添加依赖如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.testpro</groupId>
<artifactId>springcloudstreamTestPro</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>scs-common</module>
<module>scs-consumer</module>
<module>scs-producer</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<version>2.3.12.RELEASE</version>
<artifactId>spring-boot-starter-parent</artifactId>
<relativePath/>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR12</spring-cloud.version>
<com-alibaba-cloud.version>2.2.7.RELEASE</com-alibaba-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-binder-rabbit</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
1、消息生产者
启动类
package com.testPro;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.messaging.Source;
@SpringBootApplication
@EnableBinding({Source.class})
public class ProducerApplication {
public static void main(String[] args) {
SpringApplication.run(ProducerApplication.class,args);
}
}
生产者类:
package com.testPro.rabbit.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.stream.messaging.Source;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class SendMessageController {
@Autowired
private Source source;
@GetMapping("/test/{message}")
public Object send(@PathVariable String message) {
MessageBuilder<String> messageBuilder = MessageBuilder.withPayload(message);
source.output().send(messageBuilder.build());
return "Message sended " + message;
}
}
2、消息消费者
启动类
package com.testPro;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.messaging.Sink;
@SpringBootApplication
@EnableBinding({Sink.class})
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class,args);
}
}
消费监听
package com.testPro.rabbit.listener;
import org.springframework.cloud.stream.annotation.StreamListener;
import org.springframework.cloud.stream.messaging.Sink;
import org.springframework.stereotype.Component;
@Component
public class MessageReceiver {
@StreamListener(Sink.INPUT)
public void process(Object message) {
System.out.println("received message: " + message);
}
}
3、初步测试
二、集成Kafka的实现案例
与RabbitMQ时代码相同,此时仅需更改依赖即可:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-binder-kafka</artifactId>
</dependency>
三、集成RocetMQ实现案例
与上面类似
1、导入依赖
<!-- SpringCloudStream 集成RocketMQ -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rocketmq</artifactId>
</dependency>
注意:这里有个坑,如果你使用的springcloudalibaba对应的rocketmq版本大于4.4.0集成是会出问题的,高版本不要用springcloudstream集成rocketmq,仅限4.4.0一下版本,可以考虑我使用的版本:alibaba: 2.2.6.RELEASE cloud和boot都有其对应的版本。
2、生产者
package com.testPro.component;
import org.apache.rocketmq.common.message.MessageConst;
import org.springframework.cloud.stream.messaging.Source;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageHeaders;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
@RestController
public class MyProducer {
@Resource
private Source source;
public void sendMessage(String message){
//封装消息头
Map<String,Object> headers=new HashMap<>();
headers.put(MessageConst.PROPERTY_TAGS,"TagA");
MessageHeaders messageHeaders=new MessageHeaders(headers);
//创建消息对象
Message<String> message1 = MessageBuilder.createMessage(message, messageHeaders);
//发送消息
source.output().send(message1);
}
@GetMapping("/test/{s}")
public void testSendMessage(@PathVariable String s){
sendMessage(s);
}
}
启动类:
package com.testPro;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.messaging.Source;
@SpringBootApplication
@EnableBinding(Source.class)
public class ProducerApplication {
public static void main(String[] args) {
SpringApplication.run(ProducerApplication.class,args);
}
}
3、消费者
package com.testPro.component;
import org.springframework.cloud.stream.annotation.StreamListener;
import org.springframework.cloud.stream.messaging.Sink;
import org.springframework.stereotype.Component;
@Component
public class MyListener {
@StreamListener(Sink.INPUT)
public void processMessage(String message){
System.out.println("接收到的消息是:"+message);
}
}
启动类:
package com.testPro;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.messaging.Sink;
/**
* author: Dragon Wu
* date: 2022-09-10 12:51
*/
@SpringBootApplication
@EnableBinding(Sink.class)
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class,args);
}
}
4、配置文件
生产者配置:
server:
port: 8001
spring:
cloud:
stream:
bindings:
output:
# 生产者目的地topic
destination: TestTopic
# rocket-mq连接的broker地址
rocketmq:
binder:
name-server: localhost:9876
消费者配置:
server:
port: 8888
spring:
cloud:
stream:
bindings:
input: # 对应消费者
destination: TestTopic
group: scGroup #消费者组
#配置name-srv地址
rocketmq:
binder:
name-server: localhost:9876
5、运行效果
监听成功!
集成更多问题见我的解决博客: