Skip to content

Commit 5e4d37c

Browse files
feat(kafka): honor allow.auto.create.topics (#1741)
1 parent ccc714c commit 5e4d37c

File tree

3 files changed

+54
-19
lines changed

3 files changed

+54
-19
lines changed

docs/content/user-guide/en/transport/kafka.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,18 @@ services.AddCap(capOptions =>
6464

6565
[https://github.com/edenhill/librdkafka/blob/master/CONFIGURATION.md](https://github.com/edenhill/librdkafka/blob/master/CONFIGURATION.md)
6666

67+
To prevent CAP from creating topics automatically, disable topic auto creation:
68+
69+
```csharp
70+
services.AddCap(capOptions =>
71+
{
72+
capOptions.UseKafka(kafkaOption =>
73+
{
74+
kafkaOption.MainConfig.Add("allow.auto.create.topics", "false");
75+
});
76+
});
77+
```
78+
6779
#### CustomHeadersBuilder Options
6880

6981
When the message sent from a heterogeneous system, because of the CAP needs to define additional headers, so an exception will occur at this time. By providing this parameter to set the custom headersn to make the subscriber works.

docs/content/user-guide/zh/transport/kafka.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,18 @@ MainConfig 为配置字典,你可以通过以下链接找到其支持的配置
6565

6666
[https://github.com/edenhill/librdkafka/blob/master/CONFIGURATION.md](https://github.com/edenhill/librdkafka/blob/master/CONFIGURATION.md)
6767

68+
要禁止 CAP 自动创建主题,可以关闭该功能:
69+
70+
```csharp
71+
services.AddCap(capOptions =>
72+
{
73+
capOptions.UseKafka(kafkaOption =>
74+
{
75+
kafkaOption.MainConfig.Add("allow.auto.create.topics", "false");
76+
});
77+
});
78+
```
79+
6880
#### CustomHeadersBuilder Options
6981

7082
有关 `CustomHeadersBuilder` 的说明:

src/DotNetCore.CAP.Kafka/KafkaConsumerClient.cs

Lines changed: 30 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -49,30 +49,41 @@ public ICollection<string> FetchTopics(IEnumerable<string> topicNames)
4949

5050
var regexTopicNames = topicNames.Select(Helper.WildcardToRegex).ToList();
5151

52-
try
52+
var allowAutoCreate = true;
53+
if (_kafkaOptions.MainConfig.TryGetValue("allow.auto.create.topics", out var autoCreateValue)
54+
&& bool.TryParse(autoCreateValue, out var parsedValue))
5355
{
54-
var config = new AdminClientConfig(_kafkaOptions.MainConfig) { BootstrapServers = _kafkaOptions.Servers };
56+
allowAutoCreate = parsedValue;
57+
}
58+
59+
if (allowAutoCreate)
60+
{
61+
try
62+
{
63+
var config = new AdminClientConfig(_kafkaOptions.MainConfig)
64+
{ BootstrapServers = _kafkaOptions.Servers };
5565

56-
using var adminClient = new AdminClientBuilder(config).Build();
66+
using var adminClient = new AdminClientBuilder(config).Build();
5767

58-
adminClient.CreateTopicsAsync(regexTopicNames.Select(x => new TopicSpecification
68+
adminClient.CreateTopicsAsync(regexTopicNames.Select(x => new TopicSpecification
69+
{
70+
Name = x,
71+
NumPartitions = _kafkaOptions.TopicOptions.NumPartitions,
72+
ReplicationFactor = _kafkaOptions.TopicOptions.ReplicationFactor
73+
})).GetAwaiter().GetResult();
74+
}
75+
catch (CreateTopicsException ex) when (ex.Message.Contains("already exists"))
5976
{
60-
Name = x,
61-
NumPartitions = _kafkaOptions.TopicOptions.NumPartitions,
62-
ReplicationFactor = _kafkaOptions.TopicOptions.ReplicationFactor
63-
})).GetAwaiter().GetResult();
64-
}
65-
catch (CreateTopicsException ex) when (ex.Message.Contains("already exists"))
66-
{
67-
}
68-
catch (Exception ex)
69-
{
70-
var logArgs = new LogMessageEventArgs
77+
}
78+
catch (Exception ex)
7179
{
72-
LogType = MqLogType.ConsumeError,
73-
Reason = "An error was encountered when automatically creating topic! -->" + ex.Message
74-
};
75-
OnLogCallback!(logArgs);
80+
var logArgs = new LogMessageEventArgs
81+
{
82+
LogType = MqLogType.ConsumeError,
83+
Reason = "An error was encountered when automatically creating topic! -->" + ex.Message
84+
};
85+
OnLogCallback!(logArgs);
86+
}
7687
}
7788

7889
return regexTopicNames;

0 commit comments

Comments
 (0)