原文:自研 Pulsar Starter:winfun-pulsar-spring-boot-starter

里程碑

版本 功能点 作者 完成
1.0.0 支持PulsarTemplate发送消息&支持自定义注解实例化Consumer监听消息 howinfun
1.1.0 支持动态开启/关闭Consumer消费线程池、支持自定义配置Consuemr消费线程池参数 howinfun
1.2.0 支持Spring容器停止时,释放Pulsar所有相关资源 howinfun TODO
1.3.0 支持多Pulsar数据源 howinfun TODO

一、背景

Pulsar 作为新生代云原生消息队列,越来越受到开发者的热爱;而我们现在基本上的项目都是基于 SpringBoot 上开发的,但是我们可以发现,至今都没有比较大众和成熟的关于 Pulsar 的 Starter,所以我们需要自己整一个,从而避免常规使用 Pulsar API 时产生大量的重复代码。

二、设计思路

由于是第一版的设计,所以我们是从简单开始,不会一开始就设计得很复杂,尽量保留 Pulsar API 原生的功能。

2.1、PulsarClient

我们都知道,不管是 Producer 还是 Consumer,都是由 PulsarClient 创建的。

当然了,PulsarClient 可以根据业务需要自定义很多参数,但是第一版的设计只会支持比较常用的参数。

我们这个组件支持下面功能点:

  • 支持 PulsarClient 参数配置外部化,参数可配置在 applicatin.properties 中。
  • 支持 applicatin.properties 提供配置提示信息。
  • 读取外部配置文件,根据参数实例化 PulsarClient,并注入到 IOC 容器中。

2.2、Producer

Producer是发送消息的组件。

  • 这里我们提供一个模版类,可以根据需求创建对应的 Producer 实例。
  • 支持将 Topic<->Producer 关系缓存起来,避免重复创建 Producer 实例。
  • 支持同步/异步发送消息。

2.3、Consumer

Consumer是消费消息的组件。

  • 这里我们提供一个抽象类,开发者只需要集成此实现类并实现 doReceive 方法即可,即消费消息的逻辑方法。
  • 接着还提供一个自定义注解,自定义注解支持自定义 Consmuer 配置,例如Topic、Tenant、Namespace等。
  • 实现类加入上述自定义注解后,组件将会自动识别并且生成对应的 Consumer 实例。
  • 支持同步/线程池异步消费。

三、使用例子

3.1、引入依赖

<dependency>
<groupId>io.github.howinfun</groupId>
<artifactId>winfun-pulsar-spring-boot-starter</artifactId>
<version>1.1.0</version>
</dependency>

3.2、加入配置

pulsar.service-url=pulsar://127.0.0.1:6650
pulsar.tenant=winfun
pulsar.namespace=study
pulsar.operation-timeout=30
pulsar.io-threads=10
pulsar.listener-threads=10

3.3、发送消息

/**
* 发送消息
* @author: winfun
**/
@RestController
@RequestMapping("msg")
public class MessageController { @Autowired
private PulsarTemplate pulsarTemplate;
@Autowired
private PulsarProperties pulsarProperties; /***
* 往指定topic发送消息
* @author winfun
* @param topic topic
* @param msg msg
* @return {@link String }
**/
@GetMapping("/{topic}/{msg}")
public String send(@PathVariable("topic") String topic,@PathVariable("msg") String msg) throws Exception {
this.pulsarTemplate.createBuilder().persistent(Boolean.TRUE)
.tenant(this.pulsarProperties.getTenant())
.namespace(this.pulsarProperties.getNamespace())
.topic(topic)
.send(msg);
return "success";
}
}

3.4、消费消息

/**
* @author: winfun
* @date: 2021/8/20 8:13 下午
**/
@Slf4j
@PulsarListener(topics = {"test-topic2"},
threadPool = @ThreadPool(
coreThreads = 2,
maxCoreThreads = 3,
threadPoolName = "test-thread-pool"))
public class ConsumerListener extends BaseMessageListener { /**
* 消费消息
* @param consumer 消费者
* @param msg 消息
*/
@Override
protected void doReceived(Consumer<String> consumer, Message<String> msg) {
log.info("成功消费消息:{}",msg.getValue());
try {
consumer.acknowledge(msg);
} catch (PulsarClientException e) {
e.printStackTrace();
}
} /***
* 是否开启异步消费
* @return {@link Boolean }
**/
@Override
public Boolean enableAsync() {
return Boolean.TRUE;
}
}

四、源码

源码就不放在这里分析了,大家可到Github上看看,如果有什么代码上面的建议或意见,欢迎大家提MR。

自研 Pulsar Starter:winfun-pulsar-spring-boot-starter的更多相关文章

  1. Spring Boot Starter 介绍

    http://www.baeldung.com/spring-boot-starters 作者:baeldung 译者:http://oopsguy.com 1.概述 依赖管理是任何复杂项目的关键部分 ...

  2. spring -boot s-tarter 详解

    Starter POMs是可以包含到应用中的一个方便的依赖关系描述符集合.你可以获取所有Spring及相关技术的一站式服务,而不需要翻阅示例代码,拷贝粘贴大量的依赖描述符.例如,如果你想使用Sprin ...

  3. Spring Boot (一): Spring Boot starter自定义

    前些日子在公司接触了spring boot和spring cloud,有感于其大大简化了spring的配置过程,十分方便使用者快速构建项目,而且拥有丰富的starter供开发者使用.但是由于其自动化配 ...

  4. SpringBoot 之Spring Boot Starter依赖包及作用

    Spring Boot 之Spring Boot Starter依赖包及作用 spring-boot-starter 这是Spring Boot的核心启动器,包含了自动配置.日志和YAML. spri ...

  5. Spring boot starter pom的依赖关系说明

    Spring Boot 通过starter依赖为项目的依赖管理提供帮助.starter依赖起始就是特殊的maven依赖,利用了传递依赖解析,把常用库聚合在一起,组成了几个为特定功能而定制的依赖. sp ...

  6. Spring Boot Starter列表

    转自:http://blog.sina.com.cn/s/blog_798f713f0102wiy5.html Spring Boot Starter 基本的一共有43种,具体如下: 1)spring ...

  7. 创建自己的Spring Boot Starter

    抽取通用模块作为项目的一个spring boot starter.可参照mybatis的写法. IDEA创建Empty Project并添加如下2个module,一个基本maven模块,另一个引入sp ...

  8. 自己写spring boot starter

    自己写spring boot starter 学习了:<spring boot实战>汪云飞著 6.5.4节 pom.xml <project xmlns="http://m ...

  9. 自定义的Spring Boot starter如何设置自动配置注解

    本文首发于个人网站: 在Spring Boot实战之定制自己的starter一文最后提到,触发Spring Boot的配置过程有两种方法: spring.factories:由Spring Boot触 ...

  10. 手把手教你定制标准Spring Boot starter,真的很清晰

    写在前面 我们每次构建一个 Spring 应用程序时,我们都不希望从头开始实现具有「横切关注点」的内容:相反,我们希望一次性实现这些功能,并根据需要将它们包含到任何我们要构建的应用程序中 横切关注点 ...

随机推荐

  1. 第三十二篇 -- CreateFile、ReadFile、WriteFile

    一.CreateFile 这是一个多功能的函数,可打开或创建文件或者I/O设备,并返回可访问的句柄:控制台,通信资源,目录(只读打开),磁盘驱动器,文件,邮槽,管道. 函数原型: HANDLE WIN ...

  2. elementUI的el-input和el-select宽度 一致

    在用vue时,用到了element组件的 el-input 和 el-select(多选框)组件,但是宽度显示不一样,查看了多选框的css,发现element-style是写死的 添加style=&q ...

  3. AHKManager.ahk AHK管理器 2019年12月15日

    AHKManager.ahk  AHK管理器  2019年12月15日 快捷键   {Alt} + {F1} ///////////////////////////////////////////// ...

  4. 几张图搞懂 NodeJS 的流

    假设我们现在要盖一座房子,我们买了一些砖块,厂家正在送货.现在我们有两个选择,一是等所有砖块都到了以后再开始动工:二是到一批砖块就开始动工,砖块到多少我们就用多少. 这两种方式哪种效率更高呢?显然是第 ...

  5. Mybatis学习笔记-CRUD

    namespace namesapce中的包名需与Dao/Mapper接口的包名一致 SELCET 选择,查询语句 id:对应namespace中的方法: resultType:Sql语句执行的返回值 ...

  6. i春秋“百度杯”CTF比赛 十月场-Vld(单引号逃逸+报错注入)

    题目源代码给出了提示index.php.txt,打开拿到了一段看不太懂得东西. 图片标注的有flag1,flag2,flag3,同时还有三段字符,然后还出现了_GET,脑洞一一点想到访问 ?flag1 ...

  7. 用 区间判断(if)来猜价格的高低

    1 #include <stdio.h> 2 #include <stdlib.h> 3 int main() 4 { 5 int price = 150; 6 int gue ...

  8. dubbo学习实践(3)之Dubbo整合Consul及Dubbo配置方式

    前言:上一篇中,已经写到了使用zookeeper为注册中心的配置,下面写下配置Consul为注册中心 1. Consul注册中心验证 修改provider和consumer的服务配置文件 Provid ...

  9. 计算机毕业设计项目-基于SSM的学生会管理系统-基于ssm的社团信息管理系统

    注意:该项目只展示部分功能,如需了解,评论区咨询即可. 1.开发环境 开发语言:Java 后台框架:SSM 前端技术:HTML+CSS+JavaScript+Bootstrap+jQuery 数据库: ...

  10. HTML5内嵌文本编辑器

    1.这个编辑器用的是KindEditor 先看下效果: 2.准备: a):从官网下载KindEditor--->http://kindeditor.net/down.php b):解压到桌面测试 ...