Java 无法使用DeadLetterPublishingRecoverer创建Kafka DealLetterTopic
我正在尝试使用DeadLetterPublishingRecoverer创建死信主题,但无法创建它。 下面是我定义的bean 但是我在日志中看到,在ProducerConfig中,我没有看到属性allow.auto.create.topics。它丢失了,因此无法创建DLT主题 有人能推荐一下吗Java 无法使用DeadLetterPublishingRecoverer创建Kafka DealLetterTopic,java,spring-boot,apache-kafka,spring-kafka,kafka-producer-api,Java,Spring Boot,Apache Kafka,Spring Kafka,Kafka Producer Api,我正在尝试使用DeadLetterPublishingRecoverer创建死信主题,但无法创建它。 下面是我定义的bean 但是我在日志中看到,在ProducerConfig中,我没有看到属性allow.auto.create.topics。它丢失了,因此无法创建DLT主题 有人能推荐一下吗 @Autowired private KafkaProperties kafkaProperties; @Bean public ProducerFactory<String, O
@Autowired
private KafkaProperties kafkaProperties;
@Bean
public ProducerFactory<String, Object> produceFactory() {
Map<String, Object> configProps = kafkaProperties.buildProducerProperties();
configProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
configProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JsonSerializer.class);
DefaultKafkaProducerFactory<String, Object> defaultKafkaProducerFactory = new DefaultKafkaProducerFactory<>(
configProps);
return defaultKafkaProducerFactory;
}
@Bean
public KafkaTemplate<String, Object> kafkaTemp() {
MessagingMessageConverter messageConverter = new MessagingMessageConverter();
messageConverter.setHeaderMapper(new SimpleKafkaHeaderMapper("*")); // map all byte[] headers
KafkaTemplate<String, Object> kafkaTemplate = new KafkaTemplate<>(producerFactory());
kafkaTemplate.setMessageConverter(messageConverter);
return kafkaTemplate;
}
@Bean
public KafkaOperations<String, Object> getKafkaTemplate() { // producer to DLQ
return kafkaTemp();
}
@Bean
public DeadLetterPublishingRecoverer deadLetterPublishingRecoverer() {
return new DeadLetterPublishingRecoverer(getKafkaTemplate());
}
@Bean
public SeekToCurrentErrorHandler seekToCurrentErrorHandler(
DeadLetterPublishingRecoverer deadLetterPublishingRecoverer, OfferRESTClient offerRestClient) {
SeekToCurrentErrorHandler errorHandler = new SeekToCurrentErrorHandler((record, exception) -> {
deadLetterPublishingRecoverer.accept(record, exception);
}
});
errorHandler.setCommitRecovered(true);
errorHandler.setBackOffFunction((record, exception) -> {
return new FixedBackOff(0L, 5L;
});
return errorHandler;
}
@Autowired
私人卡夫卡财产卡夫卡财产;
@豆子
公共生产工厂生产工厂(){
Map configProps=kafkaProperties.buildProducerProperties();
configProps.put(ProducerConfig.KEY\u SERIALIZER\u CLASS\u CONFIG,StringSerializer.CLASS);
configProps.put(ProducerConfig.VALUE\u SERIALIZER\u CLASS\u CONFIG,JsonSerializer.CLASS);
DefaultKafkaProducerFactory DefaultKafkaProducerFactory=新建DefaultKafkaProducerFactory(
配置道具);
返回defaultKafkaProducerFactory;
}
@豆子
公共卡夫卡通片卡夫卡通片(){
MessagingMessageConverter messageConverter=新MessagingMessageConverter();
messageConverter.setHeaderMapper(新的SimpleKafkaHeaderMapper(“*”);//映射所有字节[]头
KafkaTemplate KafkaTemplate=新的KafkaTemplate(producerFactory());
kafkaTemplate.setMessageConverter(messageConverter);
返回卡夫卡模板;
}
@豆子
公共kafkao操作getKafkaTemplate(){//producer to DLQ
返回kafkaTemp();
}
@豆子
公开死信发布恢复者死信发布恢复者(){
返回新的死信发布恢复程序(getKafkaTemplate());
}
@豆子
公共SeekToCurrentErrorHandler SeekToCurrentErrorHandler(
DeadLetterPublishingRecoverer DeadLetterPublishingRecoverer,报价客户报价客户){
SeekToCurrentErrorHandler errorHandler=新的SeekToCurrentErrorHandler((记录,异常)->{
deadLetterPublishingRecoverer.accept(记录、异常);
}
});
errorHandler.setCommitRecovered(true);
errorHandler.setBackOffFunction((记录,异常)->{
返回新的固定回退(0L、5L;
});
返回错误处理程序;
}
allow.auto.create.topics是代理属性,而不是客户端属性。您通常不想使用它,因为它可能无法获得所需数量的分区
框架不会自动提供死信主题,您必须自己创建它们,或者添加一个NewTopic
@Bean
,Spring将为您创建它
看
另见
默认情况下,死信记录被发送到名为.DLT
(原始主题名称后缀为.DLT)的主题,并发送到与原始记录相同的分区。因此,使用默认解析程序时,死信主题的分区数必须至少与原始主题的分区数相同
allow.auto.create.topics
是代理属性,而不是客户端属性。您通常不想使用它,因为它可能无法获得所需数量的分区
框架不会自动提供死信主题,您必须自己创建它们,或者添加一个NewTopic
@Bean
,Spring将为您创建它
看
另见
默认情况下,死信记录被发送到名为.DLT
(原始主题名称后缀为.DLT)的主题,并发送到与原始记录相同的分区。因此,使用默认解析程序时,死信主题的分区数必须至少与原始主题的分区数相同
谢谢,但我很困惑,因为…使用与上面相同的设置,但没有为主题定义bean…deadletterpublisher正在本地kafka集群中自己创建主题…但是当我在另一个环境中尝试时,相同的设置就不起作用了…你能解释一下吗?
>…另一个环境。。。
-该代理/集群可能没有将allow.auto.create.topics
设置为true。之所以设置为true,是因为我们可以从命令行创建主题,但不能从代码创建主题…而这同一代码在本地集群中创建主题>我们可以从命令行创建主题
哪个命令行工具?kafka topics
或kafka console producer
?我有时会看到竞争情况。正如我所说,您需要确保主题具有正确数量的分区,因此添加NewTopic
bean。大多数管理员不允许在代理上自动创建主题。我们可以使用kafka主题从命令行创建主题?因此,当我们从不使用kafka主题的框架?谢谢,但我很困惑,因为…使用与上面相同的设置,但没有定义主题的bean…deadletterpublisher正在本地kafka集群中自己创建主题…但是当我在另一个环境中尝试时,相同的设置不起作用…您能抛出一些吗打开它?…另一个环境…
-该代理/集群可能没有将allow.auto.create.topics
设置为true。之所以设置为true,是因为我们可以从命令行创建主题,但不能从代码创建主题…而该代码在本地集群中创建主题>我们可以从命令行创建主题de>哪个命令行工具?kafka主题
或kafka控制台生成器
?我有时会看到竞争情况。正如我所说,您需要确保主题具有正确数量的分区,所以添加一个NewTopic
bean。大多数管理员不允许在代理上自动创建主题。我们可以从comman创建d行使用卡夫卡主题?那么当我们从不使用卡夫卡主题的框架中执行时?