Java 无法使用DeadLetterPublishingRecoverer创建Kafka DealLetterTopic

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

我正在尝试使用DeadLetterPublishingRecoverer创建死信主题,但无法创建它。 下面是我定义的bean

但是我在日志中看到,在ProducerConfig中,我没有看到属性allow.auto.create.topics。它丢失了,因此无法创建DLT主题

有人能推荐一下吗

@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行使用卡夫卡主题?那么当我们从不使用卡夫卡主题的框架中执行时?