RocketMQ在SpringCloud/SpringBoot中的使用

一、微服务之间的调用方式

调用方式有两种:

RPC方式:紧耦合,常用的有Feign、ribbon。

事务驱动方式(消息发送方式包含事件通知、事件溯源):松耦合,常用的有ActiveMQ,RabbitMQ,RocketMQ/Kafka。

二、项目依赖

        <!-- https://mvnrepository.com/artifact/org.apache.rocketmq/rocketmq-client -->
        <dependency>
            <groupId>org.apache.rocketmq</groupId>
            <artifactId>rocketmq-client</artifactId>
            <version>4.9.1</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.rocketmq/rocketmq-spring-boot-starter -->
        <dependency>
            <groupId>org.apache.rocketmq</groupId>
            <artifactId>rocketmq-spring-boot-starter</artifactId>
            <version>2.1.1</version>
        </dependency>

三、application.yml配置

消息生产方-发消息:添加如下红色信息

server:
  port: 7000

#nacos注册中心相关配置
spring:
  application:
    name: @project.artifactId@
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.30.160:8849

#rocketmq相关配置
rocketmq:
  name-server: 192.168.30.160:9876
  producer:
    group: myProductGroup-02

消费方-接收消息:添加如下红色信息

server:
  port: 9080

#nacos注册中心相关配置
spring:
  application:
    name: @project.artifactId@
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.30.160:8849

#rocketmq相关配置
rocketmq:
  name-server: 192.168.30.160:9876

四,消息生产方发送消息

请求的发送,分为同步/异步/单向oneway

发送方式

发送TPS

发送结果反馈

可靠性

同步发送   

不丢失

异步发送   

不丢失

单向发送   

最快

可能丢失

@RequestMapping("/send")
    public String fun(){
        rocketMQTemplate.convertAndSend("MyTopic","要发送的消息");
        return "发送成功";
    }
    @RequestMapping("/send1")
    public String fun1(){
        Object myTopic = rocketMQTemplate.sendAndReceive("MyTopic2", "123abc可以接受应答", String.class);
        return "发送成功:"+myTopic;
    }

    @RequestMapping("/send2")
    public String fun2(){
        SendResult sendResult = rocketMQTemplate.syncSend("MyTopic", "123abc梵蒂冈大");
        SendStatus sendStatus = sendResult.getSendStatus();
        return "发送成功:"+sendStatus;
    }

    @RequestMapping("/send3")
    public String fun3(){
        rocketMQTemplate.sendOneWay("MyTopic", "123abc冬瓜豆腐");
        return "发送成功";
    }

    @RequestMapping("/send4")
    public String fun4(){
        rocketMQTemplate.asyncSend("MyTopic", "123abc看见了是个分公司",new SendCallback(){

            @Override
            public void onSuccess(SendResult sendResult) {
                System.out.println("发送成功了");
            }

            @Override
            public void onException(Throwable throwable) {
                System.out.println("发送失败了");
            }
        });
        return "发送成功";
    }

五,接收消息

@Service
@RocketMQMessageListener(consumerGroup = "myProductGroup-03",topic = "MyTopic")
public class ConsumerLister2 implements RocketMQListener {

    @Value("${server.port}")
    private int port;

    @Override
    public void onMessage(Object message) {
        System.out.println(port+":"+message);
    }
}

六,测试可以看到控制台已经接收到了消息

        

 

 七、前面消息发出后我们所看到的只是发送结果,即有没有发送成功,当我们查询数据需要返回查找的结果的时候怎么办呢?

 发送端发送消息接收结果:

@RequestMapping("/send1")
    public String fun1(){
        Object myTopic = rocketMQTemplate.sendAndReceive("MyTopic2", "123abc可以接受应答", String.class);
        return "发送成功:"+myTopic;
    }

接收端接收消息并返回结果给发送端:

@Service
@RocketMQMessageListener(consumerGroup = "myProductGroup-01",topic = "MyTopic2")
public class ConsumerListener implements   RocketMQReplyListener {

    @Value("${server.port}")
    private int port;
    @Override
    public Object onMessage(Object s) {

        //数据处理、数据库等操作
        System.out.println(s);

        //消息应答
        return port+":"+"辣椒石头酸菜1234567777!";
    }
}

测试接口可以看发送端接收到了消息消费端返回的消息:

 

posted @ 2022-04-26 16:31  蒂雪凌星  阅读(578)  评论(0)    收藏  举报
Live2D