我无法在 Apache Felix框架中运行简单的 Kafka流应用程序,将其作为普通jar运行可以正常运行。它将引发以下异常:
ERROR: bundle com.openet.odf.streamer-simple:1.0.0.SNAPSHOT (149)[com.openet.streamer.impl.streamerImpl(0)] : The activate method has thrown an exception [0/609]
java.lang.ExceptionInInitializerError
at org.apache.kafka.streams.KafkaStreams.<init>(KafkaStreams.java:544)
at com.openet.streamer.impl.streamerImpl.activate(streamerImpl.java:122)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
...
Caused by: org.apache.kafka.common.config.ConfigException: Invalid value org.apache.kafka.streams.errors.LogAndFailExceptionHandler for configuration default.deserialization.exception.handler: Class org.apache.kafka.streams.
errors.LogAndFailExceptionHandler could not be found.
我的代码:
Properties props = new Properties();
props.put(StreamsConfig.APPLICATION_ID_CONFIG, "streams-pipe");
props.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, "10.0.150.12:9092");
props.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_CONFIG, Serdes.String().getClass());
props.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_CONFIG, Serdes.String().getClass());
StreamsBuilder builder = new StreamsBuilder();
builder.stream("test").to("streams-pipe-output");
Topology topology = builder.build();
KafkaStreams streams = new KafkaStreams(topology, props); // throws error here
在Apache Felix Framework 6.0.3中使用Java 8
复制步骤:
感谢所有帮助/指针。
答案 0 :(得分:1)
我认为,这与程序包着色有关。尝试在分片之前显式设置配置(即default.deserialization.exception.handler
)以覆盖指向原始程序包名称(即org.apache.kafka.streams.errors.LogAndContinueExceptionHandler
)的默认值。
我希望您也需要覆盖其他默认配置,这可能会遇到相同的问题。查看文档以获取有关配置及其默认设置的更多详细信息:https://docs.confluent.io/current/streams/developer-guide/config-streams.html
答案 1 :(得分:0)
感谢一位比我更了解OSGi的同事,我设法做到了以下几点:
更多详细信息在这里: OSGi Classloading
KafkaStreams streams = null;
ClassLoader currentCL = Thread.currentThread().getContextClassLoader();
try {
Thread.currentThread().setContextClassLoader(LogAndFailExceptionHandler.class.getClassLoader());
streams = new KafkaStreams(builder.build(), props);
streams.start();
}
catch (Exception e) {
System.out.println(e.getMessage());
}
finally {
Thread.currentThread().setContextClassLoader(currentCL);
}
好吧,另一个问题: 该解决方案仅在做一些琐碎的事情时才起作用。当做一些更有意义的事情(例如count等)时,我会收到与rockdb相关的错误。
Caused by: java.lang.NoClassDefFoundError: org/rocksdb/Options
at org.apache.kafka.streams.state.internals.RocksDbKeyValueBytesStoreSupplier.get(RocksDbKeyValueBytesStoreSupplier.java:41)
at org.apache.kafka.streams.state.internals.RocksDbKeyValueBytesStoreSupplier.get(RocksDbKeyValueBytesStoreSupplier.java:23)
at org.apache.kafka.streams.state.internals.TimestampedKeyValueStoreBuilder.build(TimestampedKeyValueStoreBuilder.java:55)
at org.apache.kafka.streams.state.internals.TimestampedKeyValueStoreBuilder.build(TimestampedKeyValueStoreBuilder.java:35)
at org.apache.kafka.streams.processor.internals.InternalTopologyBuilder$StateStoreFactory.build(InternalTopologyBuilder.java:135)
at org.apache.kafka.streams.processor.internals.InternalTopologyBuilder.buildProcessorNode(InternalTopologyBuilder.java:953)
at org.apache.kafka.streams.processor.internals.InternalTopologyBuilder.build(InternalTopologyBuilder.java:856)
at org.apache.kafka.streams.processor.internals.InternalTopologyBuilder.build(InternalTopologyBuilder.java:809)
at org.apache.kafka.streams.processor.internals.InternalTopologyBuilder.build(InternalTopologyBuilder.java:792)
at org.apache.kafka.streams.KafkaStreams.<init>(KafkaStreams.java:671)
at org.apache.kafka.streams.KafkaStreams.<init>(KafkaStreams.java:634)
at org.apache.kafka.streams.KafkaStreams.<init>(KafkaStreams.java:544)
at com.openet.streamer.impl.streamerImpl.activate(streamerImpl.java:69)
... 81 common frames omitted
Caused by: java.lang.ClassNotFoundException: org.rocksdb.Options not found by org.apache.servicemix.bundles.kafka-streams [150]
at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1639)
at org.apache.felix.framework.BundleWiringImpl.access$200(BundleWiringImpl.java:80)
at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:2053)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)