Spring integration 如何在与kafka扩展的spring集成中停止我的生产者容器/API

Spring integration 如何在与kafka扩展的spring集成中停止我的生产者容器/API,spring-integration,kafka-producer-api,spring-kafka,spring-integration-dsl,Spring Integration,Kafka Producer Api,Spring Kafka,Spring Integration Dsl,我正在使用spring与kafka producer API的集成。当我收到一些MessageException或ProducerException时,我想停止我的ProducerAPI 在consumer(普通的spring kafka)中,我使用ConsumerAwareListenerErrorHandler轻松停止我的侦听器 以同样的方式,我正在寻找SI中的一些处理程序来停止我的生产者容器 创建了一个错误通道并将我的所有异常放入该通道,但找不到停止容器的方法。尝试使用SmartLifeC

我正在使用spring与kafka producer API的集成。当我收到一些MessageException或ProducerException时,我想停止我的ProducerAPI

在consumer(普通的spring kafka)中,我使用ConsumerAwareListenerErrorHandler轻松停止我的侦听器

以同样的方式,我正在寻找SI中的一些处理程序来停止我的生产者容器

创建了一个错误通道并将我的所有异常放入该通道,但找不到停止容器的方法。尝试使用SmartLifeCycle执行某些操作,但没有成功

在这里我的Bean发布消息到卡夫卡主题

@Bean
public IntegrationFlow hanldeKafka() {
    return IntegrationFlows.from(sendToKafkaChannel)
            .handle(
                    kafkaMessageHandler(producerFactory, topicName),
                    e -> e.id("myProducer"))
            .get();
}


public KafkaProducerMessageHandlerTemplateSpec<String, String> kafkaMessageHandler(
        ProducerFactory<String, String> producer, String topic) {
    return Kafka
            .outboundChannelAdapter(producer)
            .sync(true)
            .headerMapper(kafkaHeaderMapper())
            .messageKey(m ->  {
                try {
                Message value = jsonObjectMapper.fromJson(m.getPayload(), Message.class);
                return value.getlId();
                } catch (Exception e) {
                    log.error(e.toString());
                    throw new MessagingException(m);
                }
            })
            //.partitionId(m -> 10)
            .topicExpression("headers[kafka_topic] ?: '" + topic + "'")
            .configureKafkaTemplate(t -> t.id("kafkaTemplate:" + topic));
}
@Bean
公共集成流hanldeKafka(){
返回IntegrationFlows.from(sendToKafkaChannel)
.处理(
kafkaMessageHandler(producerFactory,主题名称),
e->e.id(“myProducer”))
.get();
}
公共KafkaProducerMessageHandler模板规范kafkaMessageHandler(
生产者工厂生产者,字符串主题){
返回卡夫卡
.outboundChannelAdapter(生产者)
.sync(真)
.headerMapper(kafkaHeaderMapper())
.messageKey(m->{
试一试{
Message value=jsonObjectMapper.fromJson(m.getPayload(),Message.class);
返回值.getlId();
}捕获(例外e){
log.error(例如toString());
抛出新的MessaginException(m);
}
})
//.分区ID(m->10)
.topicExpression(“标题[kafka_topic]?:“+topic+”))
.configureKafkaTemplate(t->t.id(“kafkaTemplate:+主题”);
}

任何人都可以建议,如何添加一些处理程序/控制器来停止生产者容器/API。

不清楚“生产者容器”是什么意思-没有这样的东西


要永久关闭
DefaultKafkaProducerFactory
上的
Producer
(s)调用
reset()
,您不清楚“Producer container”是什么意思-没有这样的东西


要永久关闭
DefaultKafkapProducerFactory

Hi Gary上的
Producer
(s)调用
reset()
,非常感谢您的回复。我知道此重置()将永久关闭我的制作人。然而,我正在寻找类似于MessageListenerContainer的东西,在这里我们可以使用start()和stop()方法处理侦听器容器。我们是否有类似的东西来启动和停止我的卡夫卡消息生成器线程。我的意图不是永久性地阻止我的制作人。相反,我希望在出现任何问题(例如:我的上游接口关闭或任何其他运行时异常)时停止将消息发布到我的主题,在生产者端没有等效的侦听器容器。当您想要发布消息时,我们会从工厂得到一位制作人;默认工厂缓存所有调用方使用的单个生产者(除非正在使用事务)。不清楚你在说什么“线索”。在这种情况下,您需要在生产者代码中使用逻辑才能不发布。感谢agian@Gary Russell提供的宝贵意见。是否有任何特定的意图,不让监听器容器在生产者端有这样的等价物??在消费者方面,使用消费者客户端的自然方式是调用
poll()
获取记录。Spring有一个
MessageListenerContainer
的概念,其中用户只提供一个侦听器bean,容器负责所有的基础结构,并以消息驱动的方式为
poll()
返回的每个记录调用侦听器方法。有多种技术的消息侦听器容器,JMS、RabbitMQ等。由于一次只发送一条记录,所以在生产者端根本不需要这样做。它是完全被动的,除了客户端的心跳线程。如果重置生产者工厂,生产者将关闭;下次您
send()
记录时,将创建一个新记录。一点也不清楚你想要实现什么。嗨,加里,非常感谢你的回复。我知道此重置()将永久关闭我的制作人。然而,我正在寻找类似于MessageListenerContainer的东西,在这里我们可以使用start()和stop()方法处理侦听器容器。我们是否有类似的东西来启动和停止我的卡夫卡消息生成器线程。我的意图不是永久性地阻止我的制作人。相反,我希望在出现任何问题(例如:我的上游接口关闭或任何其他运行时异常)时停止将消息发布到我的主题,在生产者端没有等效的侦听器容器。当您想要发布消息时,我们会从工厂得到一位制作人;默认工厂缓存所有调用方使用的单个生产者(除非正在使用事务)。不清楚你在说什么“线索”。在这种情况下,您需要在生产者代码中使用逻辑才能不发布。感谢agian@Gary Russell提供的宝贵意见。是否有任何特定的意图,不让监听器容器在生产者端有这样的等价物??在消费者方面,使用消费者客户端的自然方式是调用
poll()
获取记录。Spring有一个
MessageListenerContainer
的概念,其中用户只提供一个侦听器bean,容器负责所有的基础结构,并以消息驱动的方式为
poll()
返回的每个记录调用侦听器方法。有多种技术的消息侦听器容器,JMS、RabbitMQ等。由于一次只发送一条记录,所以在生产者端根本不需要这样做。它是完全被动的,除了客户端的心跳线程。如果重置生产者工厂,生产者将关闭;一个新的将是c