RocketMQ是怎么发送消息的呢?
我们直接用SCA来集成RocketMQ,然后使用SpringCloudStream对RocketMQ发送和接收消息
1、创建一个springboot
当前工程表示消息生产者
2、添加pom
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-stream-binder-rocketmq</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Hoxton.SR3</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.2.5.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.1.1.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
3、添加配置信息
server.port=8070 #指定RocketMQ的NameServer地址 spring.cloud.stream.rocketmq.binder.name-server=127.0.0.1:9876 #TopicTest接收指定名称为output的binding消息 spring.cloud.stream.bindings.output.destination=TopicTest spring.cloud.stream.rocketmq.bindings.output.producer.group=producer-demo-group
4、编写接口
@RestController public class HelloController { @Autowired private Source source; @GetMapping("/send") public String send(String msg) { //封装消息 MessageBuilder builder = MessageBuilder.withPayload(msg); Message message = builder.build(); //通过通道发送消息 source.output().send(message); return "rocketmq send:" + msg; } }
5、启动类添加@EnableBinding注解
@SpringBootApplication @EnableBinding({Source.class}) public class RocketProducerApplication { public static void main(String[] args) { SpringApplication.run(RocketProducerApplication.class, args); } }
@EnableBinding({Source.class})表示绑定配置文件中名称为output的消息通道Binding,Source类的作用是它定义的消息通道名称为output,通过接口将入参msg发送给MQ中
6、启动服务
访问:http://localhost:8070/send?msg=123
会返回:rocketmq send:123
但是这样不足以说明消息是否已经发送到MQ中,我们可以看一下控制台Message菜单数据
查看详情,会查到消息文本,同时Topic也自动创建了
这样就说明消息发送成功了
RocketMQ是怎么消费消息的呢?
1、创建一个单体springboot
不过这次创建的是属于消费者
2、添加pom信息
可以直接把生产者的pom拿过来
3、添加配置文件
server.port=8060 spring.cloud.stream.rocketmq.binder.name-server=127.0.0.1:9876 #指定订阅的Topic spring.cloud.stream.bindings.input.destination=TopicTest spring.cloud.stream.bindings.input.group=consumer-group
4、定义消息监听
我是直接在启动类中直接实现的
@SpringBootApplication @EnableBinding({Sink.class}) public class RocketConsumerApplication { public static void main(String[] args) { SpringApplication.run(RocketConsumerApplication.class, args); } @StreamListener(value = Sink.INPUT) public void read(String msg) { System.out.println("TopicTest readMsg is:" + msg); } }
@EnableBinding({Sink.class})标识绑定配置文件中名称为input的消息通道Binding,Sink类定义的消息通道的名称为input,@StreamListener是一个消息监听器,是为了监听MQ消息的
5、启动服务,观察控制台日志
启动完成之后,会直接打印上个生产者的消息,如下:
这里我在生产者那里发送了两次,所以这里一次性全部消费了