Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache kafka 如何使用自定义Kafka Streams ProductionExceptionHandler?_Apache Kafka_Apache Kafka Streams - Fatal编程技术网

Apache kafka 如何使用自定义Kafka Streams ProductionExceptionHandler?

Apache kafka 如何使用自定义Kafka Streams ProductionExceptionHandler?,apache-kafka,apache-kafka-streams,Apache Kafka,Apache Kafka Streams,我正在开发一个kafka streams应用程序,但覆盖默认ProductionExceptionHandler时遇到问题 我已经创建了一个实现ProductionExceptionHandler的类 public class RtaCustomProcessingExceptionHandler implements ProductionExceptionHandler { private static final Logger log = LoggerFactory.getLogge

我正在开发一个kafka streams应用程序,但覆盖默认ProductionExceptionHandler时遇到问题
我已经创建了一个实现ProductionExceptionHandler的类

public class RtaCustomProcessingExceptionHandler implements ProductionExceptionHandler {
    private static final Logger log = LoggerFactory.getLogger(RtaCustomProcessingExceptionHandler.class);
    private RtaHandlerClient handlerClient;

    @Override
    public void configure(Map<String, ?> map) {
        handlerClient = RtaHandlerClient.getInstance();
    }

    @Override
    public ProductionExceptionHandlerResponse handle(final ProducerRecord<byte[], byte[]> record,
                                                     final Exception exception) {
        log.debug("PASSING");

        return ProductionExceptionHandlerResponse.CONTINUE;
    }
}
我用它来实例化卡夫卡斯特团队

this.streams = new KafkaStreams(BasicTopology.createTopology(config), config.asProperties());

当应用程序启动时,我可以在日志中看到我的处理程序正在启动

[2018-10-10 07:58:40,471] INFO StreamsConfig values: 
    application.id = xdr-0
    application.server = 
    bootstrap.servers = [kafka-1:9092]
    buffered.records.per.partition = 1000
    cache.max.bytes.buffering = 10485760
    client.id = 
    commit.interval.ms = 1000
    connections.max.idle.ms = 540000
    default.deserialization.exception.handler = class org.apache.kafka.streams.errors.LogAndFailExceptionHandler
    default.key.serde = class org.apache.kafka.common.serialization.Serdes$ByteArraySerde
    default.production.exception.handler = class com.ericsson.dcp.rtang.kafka.streams.xdr.error.handler.RtaCustomProcessingExceptionHandler
    default.timestamp.extractor = class org.apache.kafka.streams.processor.WallclockTimestampExtractor
    default.value.serde = class org.apache.kafka.common.serialization.Serdes$ByteArraySerde
    metadata.max.age.ms = 300000
但后来在日志中它似乎被覆盖了一些奇怪的原因,我无法理解

 [2018-10-10 07:58:40,958] INFO StreamsConfig values: 
    application.id = xdr-0
    application.server = 
    bootstrap.servers = [kafka-1:9092]
    buffered.records.per.partition = 1000
    cache.max.bytes.buffering = 10485760
    client.id = xdr-0-99215001-f1fd-43ae-8c3f-026cbd11d013-StreamThread-1-consumer
    commit.interval.ms = 30000
    connections.max.idle.ms = 540000
    default.deserialization.exception.handler = class org.apache.kafka.streams.errors.LogAndFailExceptionHandler
    default.key.serde = class org.apache.kafka.common.serialization.Serdes$ByteArraySerde
    default.production.exception.handler = class org.apache.kafka.streams.errors.DefaultProductionExceptionHandler
    default.timestamp.extractor = class org.apache.kafka.streams.processor.FailOnInvalidTimestamp
    default.value.serde = class org.apache.kafka.common.serialization.Serdes$ByteArraySerde
有人知道为什么会这样吗?

BR
-吉恩西

编辑:按请求使用实际处理程序实现进行更新


EDIT2:我设置了我的测试,因此我为处理设置了10个项目,其中第6个项目包含一个值,该值会导致异常,通常是我自己的
公共类RTA可恢复处理异常扩展了ApiException
,但也包括
RecordTooLargeException
,这两个项目都应该由自定义处理程序作为据我所知。我还在162行(
producer.send(..
和166行(
if.)添加了断点(异常..
我可以看到,对于前五项,流程正确地通过了第162行和第166行。但是,当抛出异常时,第166行没有通过。从我可以看出,即使抛出异常,它也应该通过第166行,因为它似乎是在第191行处理的(
否则,如果(productionExceptionHandler.handle..

您的kafka streams异常处理程序
RtaCustomProcessingExceptionHandler
是正确的,应该可以工作。 您可以通过在
ProductionExceptionHandler
的方法
handle
中放置断点来测试它,并模拟异常情况(例如,在处理消息期间抛出任何异常)


即使是从日志的第一部分,您也会看到应用了
default.deserialization.exception.handler
。提供的日志的第二部分用于kafka streams的内部需求,并且它采用默认配置值(如果您比较其他属性,如
commit.interval.ms
,您也会看到所有属性都是默认的).

是的,我想是这样。应用程序使用了一些自定义异常,这些异常在不同的场合抛出,但我也尝试抛出本机“RecordTooLargeException”异常,但我的处理程序从未被调用。我尝试过调试它,但正如预期的那样,处理程序从未被调用,我对调用结构有点理解cture所以我不确定应该在哪里调用处理程序。请提供您的
RtaCustomProcessingExceptionHandler
实现,并指定您尝试在哪个位置引发异常?在
map()
process()内
或其他什么?还有,您使用哪个版本的Kafka streams?我用当前(非常简单)的异常处理程序实现更新了原始帖子。异常作为映射步骤的一部分在一个简单的
stream.map(…).to(…)中抛出;
-语句。Kafka streams版本是2.0.0。Wooow..发生了一些奇怪的事情。在调试模式下运行xxx次时,调试器突然在处理程序中的断点处停止!!!正如预期的那样。但是当我现在重新运行它时,它又回到了跳过处理程序的状态!!真的很奇怪吗?我的实现非常简单,所以我一辈子都做不到我的大多数人都明白这是怎么发生的。它以前确实发生过,但我很困惑,我想我一定是被误用了,但现在我确定它发生了。你知道这是怎么发生的吗?流中的错误?流中的错误-第一个打印的配置是正确的。你可以忽略第二个。它在即将发布的2.1版本中得到修复轻松通过
 [2018-10-10 07:58:40,958] INFO StreamsConfig values: 
    application.id = xdr-0
    application.server = 
    bootstrap.servers = [kafka-1:9092]
    buffered.records.per.partition = 1000
    cache.max.bytes.buffering = 10485760
    client.id = xdr-0-99215001-f1fd-43ae-8c3f-026cbd11d013-StreamThread-1-consumer
    commit.interval.ms = 30000
    connections.max.idle.ms = 540000
    default.deserialization.exception.handler = class org.apache.kafka.streams.errors.LogAndFailExceptionHandler
    default.key.serde = class org.apache.kafka.common.serialization.Serdes$ByteArraySerde
    default.production.exception.handler = class org.apache.kafka.streams.errors.DefaultProductionExceptionHandler
    default.timestamp.extractor = class org.apache.kafka.streams.processor.FailOnInvalidTimestamp
    default.value.serde = class org.apache.kafka.common.serialization.Serdes$ByteArraySerde