### **4.1.1 配置主題(Configuring Topics)**
*****
如果您在應用程序上下文中定義了一個 `KafkaAdmin` Bean,則它可以自動將主題(Topic)添加到代理(Broker)。 為此,您可以將每個主題的 `NewTopic` `@Bean` 添加到應用程序上下文中。 版本 2.3 引入了新類 `TopicBuilder`,以使 Bean 的創建更加方便。 以下示例顯示了如何執行此操作:
~~~
@Bean
public KafkaAdmin admin() {
Map<String, Object> configs = new HashMap<>();
configs.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, ...);
return new KafkaAdmin(configs);
}
@Bean
public NewTopic topic1() {
return TopicBuilder.name("thing1")
.partitions(10)
.replicas(3)
.compact()
.build();
}
@Bean
public NewTopic topic2() {
return TopicBuilder.name("thing2")
.partitions(10)
.replicas(3)
.config(TopicConfig.COMPRESSION_TYPE_CONFIG, "zstd")
.build();
}
@Bean
public NewTopic topic3() {
return TopicBuilder.name("thing3")
.assignReplicas(0, Arrays.asList(0, 1))
.assignReplicas(1, Arrays.asList(1, 2))
.assignReplicas(2, Arrays.asList(2, 0))
.config(TopicConfig.COMPRESSION_TYPE_CONFIG, "zstd")
.build();
}
~~~
<br >
> 注意:使用 Spring Boot 時,會自動注冊一個 KafkaAdmin Bean,因此您只需要 NewTopic @Bean 即可。
<br >
默認情況下,如果代理(Broker)不可用,則會記錄一條消息,但是上下文會繼續加載。 您可以以編程方式調用 Admin 的 initialize() 方法,以便稍后再試。 如果您希望這種情況被認為是致命的,請將 Admin 的 fatalIfBrokerNotAvailable 屬性設置為 true。 這樣上下文就無法初始化了。
<br >
> 如果代理(Broker)支持(1.0.0或更高版本),并且 Admin 發現現有主題的分區數少于 NewTopic.numPartitions,則 Admin 會自動增加分區數。
<br >
要獲得更多高級功能,可以直接使用 AdminClient。 以下示例顯示了如何執行此操作:
~~~
@Autowired
private KafkaAdmin admin;
...
AdminClient client = AdminClient.create(admin.getConfig());
...
client.close();
~~~