背景
由于发现公司很多项目都用到了RocketMQ 但有些项目例如支付系统。涉及到了要对接多个集群。例如业务A 链接着自己的MQ集群A,业务系统B连接着MQ集群B。
发生支付后,支付成功或失败的的消息,A业务到发送到集群A ,B业务的发送到集群B。
而支付系统本身可能还需要监听着多套集群的消息。
自己封装SDK的契机
由于本人在公司的基础架构组。所以这个事情自然的落在了我的头上。本人也不是什么高手,正常思维先上网查一波。但本人阅读能力有限。看了很多文章,要不其实解决不了我的需求,要不能解决但我读的云山雾罩。所以并不是本人装X,实在能力有限。开始了自己编写
目标
由于公司是完全用的腾讯云(腾讯云也确实好使,比如自定义延迟队列这些,不用自己费脑子),所以目标之一,这个SDK要兼容腾讯云。既然是SDK 就还是采用了 rocket的原生jar包。而没有采用spring的。最好可以像Spring的SDK一样可以采用注解进行配置
最终目标就是实现 多集群兼容的消息SDK
准备工作
不废话,大家都是专业人士,直接上代码加注
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>4.9.4</version>
</dependency>
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-acl</artifactId>
<version>4.9.4</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
MQ配置类
/**
* Rocket抽象
* @author wangyuanquan
* @data 2023/4/28 11:45
*/
@Data
public class RocketMqProperties {
/**
* namesev 地址 多个用逗号隔开
*/
private String address;
/**
* 是否开启
*/
private Boolean enable = false;
/**
* 扫描路径 用于注解
*/
private Boolean scanAllPackage;
/**
* 生产者
*/
private List<ProducerProperties> producers;
/**
* 消费者
*/
private List<ConsumerProperties> consumers;
}
生产者配置类
/**
* 生产者属性
* @author wangyuanquan
* @data 2023/4/28 09:50
*/
@Data
public class ProducerProperties {
/**
* 地址
*/
private String address;
/**
* 生产组
*/
private String group;
/**
* bean 名称
*/
private String beanName;
/**
* 生成者秘钥
*/
private String accessKey;
/**
* 生产者角色
*/
private String secretKey;
/**
* 生产者组
*/
private String namespace;
}
消费者配置类:
/**
* @author wangyuanquan
* @data 2023/4/28 17:32
*/
@Data
public class ConsumerProperties {
/**
* 地址
*/
private String address;
/**
* 消费组
*/
private String group;
/**
* 集群还是广播 1:集群 2:广播
*/
private Integer model = 1;
/**
* 主题
*/
private String topic;
/**
* tag
*/
private String tag;
/**
* 消息监听器 全类名
*/
private String listener;
/**
* 消费方式
* last:消费者客户端从之前停止的地方开始。 如果是新启动的消费者客户端,根据消费者群体的老化情况,
* 有两种情况:如果consumer group是最近创建的,最早订阅的消息还没有过期,说明consumer group代表最近上线的业务,
* 从头开始消费;
* <p>
* first:消费者客户端将从最早可用的消息开始,也就是从头开始消费
* <p>
* timestamp:Consumer客户端将从指定的时间戳开始,这意味着在consumeTimestamp之前产生的消息将被忽略
*/
private String consumeFromWhere;
/**
* 当consumeFromWhere=timestamp 时这个字段必填写
* 格式:TODO
*/
private String consumeTimestamp;
/**
* 最小消费线程数量
*/
private Integer consumeThreadMin = 20;
/**
* 最大线程消费数量
*/
private Integer consumeThreadMax = 20;
/**
* MQ消费者每次去拉取消息拉取多少条
*/
private Integer pullBatchSize;
/**
* 生成者秘钥
*/
private String accessKey;
/**
* 生产者角色
*/
private String secretKey;
/**
* 生产者组
*/
private String namespace;
}
SPI: spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.zettayotta.req.producer.config.RocketMqAutoConfig
SDK配置类
/**
* @author wangyuanquan
* @data 2023/5/13 09:50
*/
@Configuration
@Import(RocketMqDynamicRegistryConfig.class)
public class RocketMqAutoConfig {
}
至此准备工作完成。后面讲进入正式编写