Skip to content

Commit 8da1aa3

Browse files
GH-3483: Allow Overriding KafkaAdmin#createAdmin()
Fixes: #3483 #3483 - Refactor `KafkaAdmin` to use `Admin` interface - Change `createAdmin()` method to protected visibility - Update the return type to `org.apache.kafka.clients.admin.Admin` - Modify `KafkaAdmin` to use `Admin` interface instead of `AdminClient` class
1 parent a12edfb commit 8da1aa3

File tree

3 files changed

+31
-15
lines changed

3 files changed

+31
-15
lines changed

spring-kafka-docs/src/main/antora/modules/ROOT/pages/whats-new.adoc

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,13 @@ For more details, see xref:kafka/sending-messages.adoc[Sending Messages] section
4646

4747
When using `DeadLetterPublishingRecovererFactory`, the user applications can override the `maybeLogListenerException` method to customize the logging behavior.
4848

49+
[[x33-customize-admin-client-in-KafkaAdmin]]
50+
=== Customize Admin client in KafkaAdmin
51+
52+
When extending `KafkaAdmin`, user applications may override the `createAdmin` method to customize Admin client creation.
53+
4954
[[x33-customize-kafka-streams-implementation]]
5055
=== Customizing The Implementation of Kafka Streams
5156

52-
When using `KafkaStreamsCustomizer` it is now possible to return a custom implementation of the `KafkaStreams` object by overriding the `initKafkaStreams` method.
57+
When using `KafkaStreamsCustomizer` it is now possible to return a custom implementation of the `KafkaStreams` object by overriding the `initKafkaStreams` method.
58+

spring-kafka/src/main/java/org/springframework/kafka/core/KafkaAdmin.java

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import java.util.stream.Collectors;
3737

3838
import org.apache.commons.logging.LogFactory;
39+
import org.apache.kafka.clients.admin.Admin;
3940
import org.apache.kafka.clients.admin.AdminClient;
4041
import org.apache.kafka.clients.admin.AdminClientConfig;
4142
import org.apache.kafka.clients.admin.AlterConfigOp;
@@ -68,14 +69,15 @@
6869
import org.springframework.util.Assert;
6970

7071
/**
71-
* An admin that delegates to an {@link AdminClient} to create topics defined
72+
* An admin that delegates to an {@link Admin} to create topics defined
7273
* in the application context.
7374
*
7475
* @author Gary Russell
7576
* @author Artem Bilan
7677
* @author Adrian Gygax
7778
* @author Sanghyeok An
7879
* @author Valentina Armenise
80+
* @author Anders Swanson
7981
*
8082
* @since 1.3
8183
*/
@@ -114,9 +116,9 @@ public class KafkaAdmin extends KafkaResourceFactory
114116
private String clusterId;
115117

116118
/**
117-
* Create an instance with an {@link AdminClient} based on the supplied
119+
* Create an instance with an {@link Admin} based on the supplied
118120
* configuration.
119-
* @param config the configuration for the {@link AdminClient}.
121+
* @param config the configuration for the {@link Admin}.
120122
*/
121123
public KafkaAdmin(Map<String, Object> config) {
122124
this.configs = new HashMap<>(config);
@@ -251,7 +253,7 @@ public void afterSingletonsInstantiated() {
251253
public final boolean initialize() {
252254
Collection<NewTopic> newTopics = newTopics();
253255
if (!newTopics.isEmpty()) {
254-
AdminClient adminClient = null;
256+
Admin adminClient = null;
255257
try {
256258
adminClient = createAdmin();
257259
}
@@ -347,7 +349,7 @@ protected Collection<NewTopic> newTopics() {
347349
@Nullable
348350
public String clusterId() {
349351
if (this.clusterId == null) {
350-
try (AdminClient client = createAdmin()) {
352+
try (Admin client = createAdmin()) {
351353
this.clusterId = client.describeCluster().clusterId().get(this.operationTimeout, TimeUnit.SECONDS);
352354
if (this.clusterId == null) {
353355
this.clusterId = "null";
@@ -365,14 +367,14 @@ public String clusterId() {
365367

366368
@Override
367369
public void createOrModifyTopics(NewTopic... topics) {
368-
try (AdminClient client = createAdmin()) {
370+
try (Admin client = createAdmin()) {
369371
addOrModifyTopicsIfNeeded(client, Arrays.asList(topics));
370372
}
371373
}
372374

373375
@Override
374376
public Map<String, TopicDescription> describeTopics(String... topicNames) {
375-
try (AdminClient admin = createAdmin()) {
377+
try (Admin admin = createAdmin()) {
376378
Map<String, TopicDescription> results = new HashMap<>();
377379
DescribeTopicsResult topics = admin.describeTopics(Arrays.asList(topicNames));
378380
try {
@@ -389,7 +391,13 @@ public Map<String, TopicDescription> describeTopics(String... topicNames) {
389391
}
390392
}
391393

392-
AdminClient createAdmin() {
394+
/**
395+
* Creates a new {@link Admin} client instance using the {@link AdminClient} class.
396+
* @return the new {@link Admin} client instance.
397+
* @since 3.3.0
398+
* @see AdminClient#create(Map)
399+
*/
400+
protected Admin createAdmin() {
393401
return AdminClient.create(getAdminConfig());
394402
}
395403

@@ -409,7 +417,7 @@ protected Map<String, Object> getAdminConfig() {
409417
return configs2;
410418
}
411419

412-
private void addOrModifyTopicsIfNeeded(AdminClient adminClient, Collection<NewTopic> topics) {
420+
private void addOrModifyTopicsIfNeeded(Admin adminClient, Collection<NewTopic> topics) {
413421
if (!topics.isEmpty()) {
414422
Map<String, NewTopic> topicNameToTopic = new HashMap<>();
415423
topics.forEach(t -> topicNameToTopic.compute(t.name(), (k, v) -> t));
@@ -439,7 +447,7 @@ private void addOrModifyTopicsIfNeeded(AdminClient adminClient, Collection<NewTo
439447
}
440448

441449
private Map<ConfigResource, List<ConfigEntry>> checkTopicsForConfigMismatches(
442-
AdminClient adminClient, Collection<NewTopic> topics) {
450+
Admin adminClient, Collection<NewTopic> topics) {
443451

444452
List<ConfigResource> configResources = topics.stream()
445453
.map(topic -> new ConfigResource(Type.TOPIC, topic.name()))
@@ -484,7 +492,7 @@ private Map<ConfigResource, List<ConfigEntry>> checkTopicsForConfigMismatches(
484492
}
485493
}
486494

487-
private void adjustConfigMismatches(AdminClient adminClient, Collection<NewTopic> topics,
495+
private void adjustConfigMismatches(Admin adminClient, Collection<NewTopic> topics,
488496
Map<ConfigResource, List<ConfigEntry>> mismatchingConfigs) {
489497
for (Map.Entry<ConfigResource, List<ConfigEntry>> mismatchingConfigsOfTopic : mismatchingConfigs.entrySet()) {
490498
ConfigResource topicConfigResource = mismatchingConfigsOfTopic.getKey();
@@ -556,7 +564,7 @@ else if (topic.numPartitions() > topicDescription.partitions().size()) {
556564
return topicsToModify;
557565
}
558566

559-
private void addTopics(AdminClient adminClient, List<NewTopic> topicsToAdd) {
567+
private void addTopics(Admin adminClient, List<NewTopic> topicsToAdd) {
560568
CreateTopicsResult topicResults = adminClient.createTopics(topicsToAdd);
561569
try {
562570
topicResults.all().get(this.operationTimeout, TimeUnit.SECONDS);
@@ -579,7 +587,7 @@ private void addTopics(AdminClient adminClient, List<NewTopic> topicsToAdd) {
579587
}
580588
}
581589

582-
private void createMissingPartitions(AdminClient adminClient, Map<String, NewPartitions> topicsToModify) {
590+
private void createMissingPartitions(Admin adminClient, Map<String, NewPartitions> topicsToModify) {
583591
CreatePartitionsResult partitionsResult = adminClient.createPartitions(topicsToModify);
584592
try {
585593
partitionsResult.all().get(this.operationTimeout, TimeUnit.SECONDS);

spring-kafka/src/test/java/org/springframework/kafka/core/KafkaAdminTests.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import java.util.concurrent.atomic.AtomicReference;
3535

3636
import org.apache.kafka.clients.CommonClientConfigs;
37+
import org.apache.kafka.clients.admin.Admin;
3738
import org.apache.kafka.clients.admin.AdminClient;
3839
import org.apache.kafka.clients.admin.AdminClientConfig;
3940
import org.apache.kafka.clients.admin.AlterConfigOp;
@@ -69,6 +70,7 @@
6970
/**
7071
* @author Gary Russell
7172
* @author Adrian Gygax
73+
* @author Anders Swanson
7274
*
7375
* @since 1.3
7476
*/
@@ -286,7 +288,7 @@ void nullClusterId() {
286288
KafkaAdmin admin = new KafkaAdmin(Map.of()) {
287289

288290
@Override
289-
AdminClient createAdmin() {
291+
protected Admin createAdmin() {
290292
return mock;
291293
}
292294

0 commit comments

Comments
 (0)