消费时Kafka-Streams抛出NullPointerException

时间:2017-02-01 15:44:59

标签: groovy kafka-consumer-api apache-kafka-streams

我有这个问题:

当我使用Processor API消耗主题时,当在处理器内部使用方法context().forward(K, V)时,Kafka Streams会抛出空指针异常。

这是它的堆栈跟踪:

Exception in thread "StreamThread-1" java.lang.NullPointerException
at org.apache.kafka.streams.processor.internals.StreamTask.forward(StreamTask.java:336)
at org.apache.kafka.streams.processor.internals.ProcessorContextImpl.forward(ProcessorContextImpl.java:187)
at org.apache.kafka.streams.processor.ProcessorContext$forward.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:133)
at com.bnsf.ltf.processor.ConversionProcessor.process(ConversionProcessor.groovy:23)
at com.bnsf.ltf.processor.ConversionProcessor.process(ConversionProcessor.groovy)
at org.apache.kafka.streams.processor.internals.ProcessorNode.process(ProcessorNode.java:68)
at org.apache.kafka.streams.processor.internals.StreamTask.forward(StreamTask.java:338)
at org.apache.kafka.streams.processor.internals.ProcessorContextImpl.forward(ProcessorContextImpl.java:187)
at org.apache.kafka.streams.processor.internals.SourceNode.process(SourceNode.java:64)
at org.apache.kafka.streams.processor.internals.StreamTask.process(StreamTask.java:174)
at org.apache.kafka.streams.processor.internals.StreamThread.runLoop(StreamThread.java:320)
at org.apache.kafka.streams.processor.internals.StreamThread.run(StreamThread.java:218)

My Gradle依赖项如下所示:

compile('org.codehaus.groovy:groovy-all')
compile('org.apache.kafka:kafka-streams:0.10.0.0')

更新:我尝试使用版本0.10.0.1但它仍然会抛出相同的错误。

这是我正在构建的拓扑代码...

 topologyBuilder.addSource('inboundTopic', stringDeserializer, stringDeserializer, conversionConfiguration.inTopic)
    .addProcessor('conversionProcess', new ProcessorSupplier() {
        @Override
        Processor get() {
            return conversionProcessor
        }
    }, 'inboundTopic')
    .addSink('outputTopic', conversionConfiguration.outTopic, stringSerializer, stringSerializer, 'conversionProcess')

    stream = new KafkaStreams(topologyBuilder, streamConfig)
    stream.start()

我的处理器如下所示:

@Override
void process(String key, String message) {
    // Call to a service and the return of the service is set on the
    // converted local variable named converted
    context().forward(key, converted)
    context().commit()
}

1 个答案:

答案 0 :(得分:1)

直接提供您的处理器。

.addProcessor('conversionProcess', () -> new MyProcessor(), 'inboundTopic')
反过来,

MyProcessor应继承自AbstractProcessor