RocketMQ的封装使用思路

RocketMQ在win安装:链接
RocketMQ在win可视化:链接
RocketMQ在win若jdk版本不是1.8可参考:链接
RocketMQ基本使用方法:链接

使用思路
使用到的依赖有

<!--gson用来对象与json字符串的转换-->
	<dependency>
	<groupId>com.google.code.gson</groupId>
	<artifactId>gson</artifactId>
	<version>2.9.0</version>
 </dependency>
 <!--rocketmq消息队列,消息生产者消费者都要有此依赖-->
<dependency>
	<groupId>org.apache.rocketmq</groupId>
	<artifactId>rocketmq-spring-boot-starter</artifactId>
	<version>2.2.2</version>
</dependency>

消息生产者yml

server:
  port: 9090
#消息队列
rocketmq:
  name-server: localhost:9876
  producer:
    group: 看着起

消息消费者yml

#消息队列
rocketmq:
  name-server: localhost:9876

生产者可选yml配置

# 配置 rocketmq
rocketmq:
  name-server: 127.0.0.1:9876
  #生产者
  producer:
    #生产者组名,规定在一个应用里面必须唯一
    group: group1
    #消息发送的超时时间 默认3000ms
    send-message-timeout: 3000
    #消息达到4096字节的时候,消息就会被压缩。默认 4096
    compress-message-body-threshold: 4096
    #最大的消息限制,默认为128K
    max-message-size: 4194304
    #同步消息发送失败重试次数
    retry-times-when-send-failed: 3
    #在内部发送失败时是否重试其他代理,这个参数在有多个broker时才生效
    retry-next-server: true
    #异步消息发送失败重试的次数
    retry-times-when-send-async-failed: 3

封装一个用来传输消息的类

import lombok.AllArgsConstructor;
import lombok.Data;

import java.io.Serializable;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class MqResult implements Serializable{

    private String key;//方法名
    private Object data;//方法所需参数
}

随便的一个测试传值类,用来模拟方法所需参数

@Data
@AllArgsConstructor
@NoArgsConstructor
public class ResSelectLabelList{
    private String label;//标签名
}

生产者传输消息(当访问/ceshi/ceshi时会向topic值为test-topic-1的消息消费者发送一条值为MqResult对象的消息)

@RestController
@RequestMapping(value="ceshi")
public class CuserController implements CommandLineRunner {
    @Resource
    private RocketMQTemplate rocketMQTemplate;

    Gson gson=new Gson();
    @GetMapping(value = "ceshi")
    public void ceshi() {
        rocketMQTemplate.convertAndSend("test-topic-1", new MqResult("ceshifangfa",new ResSelectLabelList("asdaa111sfsa")));
    }

    @Override
    public void run(String... args) throws Exception {
        System.out.println("在容器对象创建完成");
    }

}

消息消费者(与其他mq封装不同的是,不需要返回消费成功或是失败,而是只要没有异常出现,那么就消费成功,有异常就重新进行发送)

@Component
@RocketMQMessageListener(topic = "test-topic-1", consumerGroup = "ceshi")
public class RocketMQTool implements RocketMQListener<MqResult> {

    private Gson gson=new Gson();
    @Override
    public void onMessage(MqResult mqres){
        ffjueze(mqres.getKey(), mqres.getData().toString());//参数1为要调用的方法,2为传的值
    }
    //测试调用方法
    public int ceshifangfa(ResSelectLabelList res){
        System.out.println(res);
        return 0;
    }
    //用来解析调用哪个方法
    public void ffjueze(String k,String o){
        switch (k){
            case "ceshifangfa":
                ceshifangfa(gson.fromJson(o,ResSelectLabelList.class));
                break;
        }
    }
}

访问/ceshi/ceshi结果
在这里插入图片描述
消费者若希望获取消息id等信息可改成(无论发送什么类型都可用MessageExt进行接收)

@Component
@RocketMQMessageListener(topic = "test-topic-1", consumerGroup = "ceshi")
@Slf4j
public class RocketMQTool implements RocketMQListener<MessageExt> {

    private Gson gson=new Gson();

    @Override
    public void onMessage(MessageExt messageExt) {
        String body = new String(messageExt.getBody(), StandardCharsets.UTF_8);
        MqResult mqResult = gson.fromJson(body, MqResult.class); // json转对象
        log.info("收到消息: msgId={} topic={} queueId={} body={}", messageExt.getMsgId(), messageExt.getTopic(), messageExt.getQueueId(), mqResult);
        // 业务执行完毕没有抛出异常则由代理类自动提交ACK
    }
}

效果:
在这里插入图片描述

若想实现顺序消费可操作
1.消息生产者使用syncSendOrderly(同步有序发送)或asyncSendOrderly(异步有序发送)方法,前两个参数不变,第三个参数多次调用时使用固定相同的任意字符串。
2.消费者@RocketMQMessageListener注解添加属性consumeMode = ConsumeMode.ORDERLY,使消费变为同步操作

事务消息发布与消费(事务消息即数据库操作与消息发送本身是一个事务,要么数据库事务提交消息发送,要么数据库回滚消息不发送)

可能遇到的问题与解决方案

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

翎墨袅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值