{"id":15567074,"url":"https://github.com/jdk-plus/spring-boot-starter-kafka","last_synced_at":"2026-05-16T13:06:30.913Z","repository":{"id":65510184,"uuid":"532949810","full_name":"JDK-Plus/spring-boot-starter-kafka","owner":"JDK-Plus","description":null,"archived":false,"fork":false,"pushed_at":"2023-12-14T06:15:01.000Z","size":62,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-29T05:16:11.275Z","etag":null,"topics":["kafka","springboot"],"latest_commit_sha":null,"homepage":"https://jdk.plus/spring-boot-starter-kafka/","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/JDK-Plus.png","metadata":{"files":{"readme":"README-CN.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-09-05T15:04:51.000Z","updated_at":"2023-12-14T07:54:34.000Z","dependencies_parsed_at":"2023-01-26T17:30:25.051Z","dependency_job_id":"249306bc-cf1c-4276-bd34-7a64dc1bbe34","html_url":"https://github.com/JDK-Plus/spring-boot-starter-kafka","commit_stats":{"total_commits":12,"total_committers":2,"mean_commits":6.0,"dds":0.08333333333333337,"last_synced_commit":"29cad5a3be8d819765d81b461a1d75fd4e5cec5a"},"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JDK-Plus%2Fspring-boot-starter-kafka","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JDK-Plus%2Fspring-boot-starter-kafka/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JDK-Plus%2Fspring-boot-starter-kafka/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JDK-Plus%2Fspring-boot-starter-kafka/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/JDK-Plus","download_url":"https://codeload.github.com/JDK-Plus/spring-boot-starter-kafka/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246140591,"owners_count":20729802,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["kafka","springboot"],"created_at":"2024-10-02T17:09:53.382Z","updated_at":"2026-05-16T13:06:30.878Z","avatar_url":"https://github.com/JDK-Plus.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch3 align=\"center\"\u003e一个集成Kafka依赖的Springboot扩展\u003c/h3\u003e\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://github.com/JDK-Plus/spring-boot-starter-kafka/blob/master/LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/github/license/JDK-Plus/spring-boot-starter-kafka.svg\" /\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/JDK-Plus/spring-boot-starter-kafka/releases\"\u003e\u003cimg src=\"https://img.shields.io/github/release/JDK-Plus/spring-boot-starter-kafka.svg\" /\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/JDK-Plus/spring-boot-starter-kafka/stargazers\"\u003e\u003cimg src=\"https://img.shields.io/github/stars/JDK-Plus/spring-boot-starter-kafka.svg\" /\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/JDK-Plus/spring-boot-starter-kafka/network/members\"\u003e\u003cimg src=\"https://img.shields.io/github/forks/JDK-Plus/spring-boot-starter-kafka.svg\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n- [English](README.md)\n\n## 引入依赖\n\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003eplus.jdk\u003c/groupId\u003e\n    \u003cartifactId\u003espring-boot-starter-kafka\u003c/artifactId\u003e\n    \u003cversion\u003e1.1.2\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n其他更多引入方法请参见：[spring-boot-starter-kafka](https://search.maven.org/artifact/plus.jdk/spring-boot-starter-kafka/1.0.2/jar)\n\n## 需要添加的配置项\n\n### 启用该组件\n\n```bash\n# 启动该组件\nplus.jdk.kafka.client.enabled=true\n```\n\n### 指定用户名密码\n\n你可以使用如下配置项指定全局的用户名、密码，\n\n```bash\n# 指定kafka全局的用户名\nplus.jdk.kafka.client.user-name=root\n\n# 指定kafka全局的密码\nplus.jdk.kafka.client.password=123456\n```\n\n但是如果存在特殊的topic用户名和密码和全局配置项不同该怎么办呢？你可以向如下配置项来为某个topic单独指定用户名密码\n\n```bash\n# 可选配置项，若不想使用全局的用户名，则可使用该项单独指定\nplus.jdk.kafka.client.topic-definitions[0].user-name=root\n# 可选配置项，若不想使用全局的密码，则可使用该项单独指定\nplus.jdk.kafka.client.topic-definitions[0].password=123456\n```\n\n\n### 指定消费者配置项\n\n你可以使用如下配置制定好全局的消费者配置项：\n\n```bash\n# 可选配置项，指定全局的消费配置项\nplus.jdk.kafka.client.consumer-global-config[0].key=sasl.mechanism\nplus.jdk.kafka.client.consumer-global-config[0].value=PLAIN\nplus.jdk.kafka.client.consumer-global-config[1].key=sasl.mechanism\nplus.jdk.kafka.client.consumer-global-config[1].value=PLAIN\n```\n\n显而易见，特例总会有的。在日常的开发工作中，肯定会出现特殊的topic配置项和其他的不太一致，这时候你可以像这样来单独指定消费的配置项：\n\n```bash\n# 可选配置项，若想覆盖全局的消费配置项，则可通过如下配置指定\nplus.jdk.kafka.client.topic-definitions[0].consumer-configs[0].key=xxx\nplus.jdk.kafka.client.topic-definitions[0].consumer-configs[0].value=xxx\n\n```\n\n### 指定生产者配置项\n\n```bash\n# 可选配置项，指定全局的生产配置项\nplus.jdk.kafka.client.producer-global-config[0].key=sasl.mechanism\nplus.jdk.kafka.client.producer-global-config[0].value=PLAIN\n```\n\n显而易见，特例总会有的。在日常的开发工作中，肯定会出现特殊的topic配置项和其他的不太一致，这时候你可以像这样来单独指定生产的配置项：\n\n```bash\n# 可选配置项，若想覆盖全局的生产配置项，则可通过如下配置指定\nplus.jdk.kafka.client.topic-definitions[0].producer-configs[0].key=xxx\nplus.jdk.kafka.client.topic-definitions[0].producer-configs[0].value=xxx\n```\n\n### 如何描述一个topic生产和消费\n\n#### 指定当前topic配置名称\n\n首先，我们要定义一个topic配置组名称，这是必选项，该值应该为唯一的，不可以重复定义，当启动消费或推送消息时会根据该值初始化消费者和生产者实例\n\n关于这里的设计，有人可能会存在疑问：\"为什么不直接用kafka的topic来作为配置名呢？\"。\n\n其实都是可以的，只不过这里在编写的时候考虑到了线上环境和测试环境topic名称不是同一个的情况，而且这种情况很常见。\n\n你可以使用如下配置来指定当前topic的配置组名称\n\n```bash\nplus.jdk.kafka.client.topic-definitions[0].name=my_first_topic_conf_name\n```\n该名称是和 `@KafkaClient` 直接一起配套使用的，当你在 `@KafkaClient` 中指定配置组名称后，会根据指定的配置组的内容来初始化消费者和生产者。\n\n#### 使用配置描述定义一个生产者\n\n你可以向这样子来指定当前配置组的名称、topic名称以及生产者用于生产消息的broker列表.\n\n```bash\n# 配置组名称\nplus.jdk.kafka.client.topic-definitions[0].name=my_first_topic_conf_name\n# 当前要消费或生产的topic名称，必选项\nplus.jdk.kafka.client.topic-definitions[0].topic=test_topic_name\n# 生产的broker列表，若无需生产消息，则可选，否则必填，若为空，则会导致消息无法推送\nplus.jdk.kafka.client.topic-definitions[0].producer-brokers=127.0.0.1:9090,10.11.1.102:9090\n```\n\n#### 使用配置描述定义一个消费者\n\n关于消费，笔者在编写代码时是按照自己日常的业务需求来添加的配置项，如果你想自定义，你可以通过 `plus.jdk.kafka.client.topic-definitions[0].consumer-configs`配置组指定\n\n```bash\nplus.jdk.kafka.client.topic-definitions[0].name=my_first_topic_conf_name\n# 当前要消费或生产的topic名称，必选项\nplus.jdk.kafka.client.topic-definitions[0].topic=test_topic_name\n# 消费的broker列表，若无需消费消息，则可选，否则必填，若为空，则会导致无法启动消费\nplus.jdk.kafka.client.topic-definitions[0].consume-brokers=127.0.0.1:8888,127.0.0.1:8889\n# 消费的groupName，若无需消费消息，则可选，否则必填，若为空，则会导致无法启动消费\nplus.jdk.kafka.client.topic-definitions[0].group-name=groupName\n# 可选配置项，消费是是否自动提交\nplus.jdk.kafka.client.topic-definitions[0].auto-commit=false\n# 可选配置项，开启几个消费者\nplus.jdk.kafka.client.topic-definitions[0].consumer-num=1\n# 可选配置项，每次消费最大拉取多少条消息\nplus.jdk.kafka.client.topic-definitions[0].consumer-max-poll-record=1\n# 可选配置项，若不想使用全局的用户名，则可使用该项单独指定\nplus.jdk.kafka.client.topic-definitions[0].user-name=root\n# 可选配置项，若不想使用全局的密码，则可使用该项单独指定\nplus.jdk.kafka.client.topic-definitions[0].password=123456\n# 可选配置项，消费拉取消息的超时时间\nplus.jdk.kafka.client.topic-definitions[0].poll-timeout=2\n# 可选配置项，一个bean实例。需要实现plus.jdk.kafka.common.IConsumeDecider接口，来负责判断该topic是否启动消费进程，默认不开启\nplus.jdk.kafka.client.topic-definitions[0].decider=plus.jdk.kafka.common.DefaultConsumeDecider\n\n# 可选配置项，若想覆盖全局的消费配置项，则可通过如下配置指定\nplus.jdk.kafka.client.topic-definitions[0].consumer-configs[0].key=xxx\nplus.jdk.kafka.client.topic-definitions[0].consumer-configs[0].value=xxx\n\n```\n\n在很多时候，我们需要在服务启动时判定是否需要启动消费进程，所以在这里你可以申明一个继承自`plus.jdk.kafka.common.DefaultConsumeDecider` \n的bean实例来用于判断是否启动消费进程。在配置中使用如下配置项来指定它。\n\n```bash\nplus.jdk.kafka.client.topic-definitions[0].decider=plus.jdk.kafka.common.DefaultConsumeDecider\n```\n`plus.jdk.kafka.common.DefaultConsumeDecider` 接口的定义如下：\n\n```java\npackage plus.jdk.kafka.common;\n\npublic class DefaultConsumeDecider implements IConsumeDecider {\n    @Override\n    public boolean consume() {\n        return false; // 若返回true则开启消费进程\n    }\n}\n```\n\n\n**有一个既包含生产者也包含消费者的配置项描述如下**\n\n```bash\nplus.jdk.kafka.client.topic-definitions[0].name=my_first_topic_conf_name\n# 当前要消费或生产的topic名称，必选项\nplus.jdk.kafka.client.topic-definitions[0].topic=test_topic_name\n# 生产的broker列表，若无需生产消息，则可选，否则必填，若为空，则会导致消息无法推送\nplus.jdk.kafka.client.topic-definitions[0].producer-brokers=127.0.0.1:9090,10.11.1.102:9090\n# 消费的broker列表，若无需消费消息，则可选，否则必填，若为空，则会导致无法启动消费\nplus.jdk.kafka.client.topic-definitions[0].consume-brokers=127.0.0.1:8888,127.0.0.1:8889\n# 消费的groupName，若无需消费消息，则可选，否则必填，若为空，则会导致无法启动消费\nplus.jdk.kafka.client.topic-definitions[0].group-name=groupName\n# 可选配置项，消费是是否自动提交\nplus.jdk.kafka.client.topic-definitions[0].auto-commit=false\n# 可选配置项，开启几个消费者\nplus.jdk.kafka.client.topic-definitions[0].consumer-num=1\n# 可选配置项，每次消费最大拉取多少条消息\nplus.jdk.kafka.client.topic-definitions[0].consumer-max-poll-record=1\n# 可选配置项，若不想使用全局的用户名，则可使用该项单独指定\nplus.jdk.kafka.client.topic-definitions[0].user-name=root\n# 可选配置项，若不想使用全局的密码，则可使用该项单独指定\nplus.jdk.kafka.client.topic-definitions[0].password=123456\n# 可选配置项，消费拉取消息的超时时间\nplus.jdk.kafka.client.topic-definitions[0].poll-timeout=2\n# 可选配置项，一个bean实例。需要实现plus.jdk.kafka.common.IConsumeDecider接口，来负责判断该topic是否启动消费进程，默认不开启\nplus.jdk.kafka.client.topic-definitions[0].decider=plus.jdk.kafka.common.DefaultConsumeDecider\n\n# 可选配置项，若想覆盖全局的消费配置项，则可通过如下配置指定\nplus.jdk.kafka.client.topic-definitions[0].consumer-configs[0].key=xxx\nplus.jdk.kafka.client.topic-definitions[0].consumer-configs[0].value=xxx\n\n# 可选配置项，若想覆盖全局的生产配置项，则可通过如下配置指定\nplus.jdk.kafka.client.topic-definitions[0].producer-configs[0].key=xxx\nplus.jdk.kafka.client.topic-definitions[0].producer-configs[0].value=xxx\n\n```\n## 定义一个可以生产消息和消费消息的kafka队列\n\n### 关于kafka队列的消费和生产可以定义如下：\n\n```java\nimport plus.jdk.kafka.global.IKafkaQueue;\nimport plus.jdk.kafka.annotation.KafkaClient;\n\n@KafkaClient(\"my_first_topic_conf_name\")\npublic class MyFirstTopicQueue extends IKafkaQueue\u003cString, String\u003e {\n\n    /**\n     * 处理消息队列中的数据，若不需要消费，则该方法可不实现\n     */\n    @Override\n    protected boolean processMessage(String data) {\n        // 根据传入的data处理消费数据\n        return true;\n    }\n}\n```\n\n上文示例中的 `@KafkaClient` 注解会将该队列的定义申明为一个bean实例。 若配置了消费相关的内容，则会根据上文中的配置启动消费服务。\n\n### 如何推送消息\n\n推送消息时，可以调用上文中已经定义好的 `MyFirstTopicQueue` 队列的`pushMessage`方法来完成消息推送. \n\n```java\nimport javax.annotation.Resource;\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.concurrent.ExecutionException;\nimport java.util.concurrent.Future;\n\n@Slf4j\n@Service\npublic class MyKafkaTestService {\n\n    @Resource\n    private MyFirstTopicQueue myFirstTopicQueue;\n\n    public void test() {\n        List\u003cFuture\u003cRecordMetadata\u003e\u003e futureList = myFirstTopicQueue.pushMessage(Arrays.asList(\"data1\", \"data2\"), (message, recordMetadata, e) -\u003e {\n            if (e != null) {\n                log.error(\"push message {} failed, message:{}\", message, e.getMessage());\n                return;\n            }\n            log.info(\"push message {} success\", message);\n        });\n    }\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjdk-plus%2Fspring-boot-starter-kafka","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjdk-plus%2Fspring-boot-starter-kafka","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjdk-plus%2Fspring-boot-starter-kafka/lists"}