You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jira@kafka.apache.org by "Michal Hlavac (JIRA)" <ji...@apache.org> on 2017/11/09 10:59:00 UTC
[jira] [Commented] (KAFKA-3218) Kafka-0.9.0.0 does not work as OSGi
module
[ https://issues.apache.org/jira/browse/KAFKA-3218?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16245497#comment-16245497 ]
Michal Hlavac commented on KAFKA-3218:
--------------------------------------
I have same problem when using stream API and kafka 1.0.0 in karaf 4.1.13
{code}
Caused by: org.apache.kafka.common.KafkaException: org.apache.kafka.streams.processor.internals.StreamPartitionAssignor ClassNotFoundException exception occurred
at org.apache.kafka.common.config.AbstractConfig.getConfiguredInstances(AbstractConfig.java:288) ~[?:?]
at org.apache.kafka.common.config.AbstractConfig.getConfiguredInstances(AbstractConfig.java:263) ~[?:?]
at org.apache.kafka.clients.consumer.KafkaConsumer.<init>(KafkaConsumer.java:732) ~[?:?]
... 51 more
Caused by: java.lang.ClassNotFoundException: org.apache.kafka.streams.processor.internals.StreamPartitionAssignor
at java.net.URLClassLoader.findClass(URLClassLoader.java:381) ~[?:?]
at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[?:?]
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335) ~[?:?]
at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[?:?]
at java.lang.Class.forName0(Native Method) ~[?:?]
at java.lang.Class.forName(Class.java:348) ~[?:?]
at org.apache.kafka.common.utils.Utils.newInstance(Utils.java:308) ~[?:?]
at org.apache.kafka.common.config.AbstractConfig.getConfiguredInstances(AbstractConfig.java:286) ~[?:?]
at org.apache.kafka.common.config.AbstractConfig.getConfiguredInstances(AbstractConfig.java:263) ~[?:?]
at org.apache.kafka.clients.consumer.KafkaConsumer.<init>(KafkaConsumer.java:732) ~[?:?]
... 51 more
{code}
Workaround is to wrap code:
{code:java}
ClassLoader cl = Thread.currentThread().getContextClassLoader();
try {
Thread.currentThread().setContextClassLoader(KStream.class.getClassLoader());
// original code of init streams
} finally {
Thread.currentThread().setContextClassLoader(cl);
}
{code}
> Kafka-0.9.0.0 does not work as OSGi module
> ------------------------------------------
>
> Key: KAFKA-3218
> URL: https://issues.apache.org/jira/browse/KAFKA-3218
> Project: Kafka
> Issue Type: Bug
> Components: clients
> Affects Versions: 0.9.0.0
> Environment: Apache Felix OSGi container
> jdk_1.8.0_60
> Reporter: Joe O'Connor
> Assignee: Rajini Sivaram
> Fix For: 0.10.1.0
>
> Attachments: ContextClassLoaderBug.tar.gz
>
>
> KAFKA-2295 changed all Class.forName() calls to use currentThread().getContextClassLoader() instead of the default "classloader that loaded the current class".
> OSGi loads each module's classes using a separate classloader so this is now broken.
> Steps to reproduce:
> # install the kafka-clients servicemix OSGi module 0.9.0.0_1
> # attempt to initialize the Kafka producer client from Java code
> Expected results:
> - call to "new KafkaProducer()" succeeds
> Actual results:
> - "new KafkaProducer()" throws ConfigException:
> {quote} Suppressed: java.lang.Exception: Error starting bundle54: Activator start error in bundle com.openet.testcase.ContextClassLoaderBug [54].
> at org.apache.karaf.bundle.command.BundlesCommand.doExecute(BundlesCommand.java:66)
> ... 12 more
> Caused by: org.osgi.framework.BundleException: Activator start error in bundle com.openet.testcase.ContextClassLoaderBug [54].
> at org.apache.felix.framework.Felix.activateBundle(Felix.java:2276)
> at org.apache.felix.framework.Felix.startBundle(Felix.java:2144)
> at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:998)
> at org.apache.karaf.bundle.command.Start.executeOnBundle(Start.java:38)
> at org.apache.karaf.bundle.command.BundlesCommand.doExecute(BundlesCommand.java:64)
> ... 12 more
> Caused by: java.lang.ExceptionInInitializerError
> at org.apache.kafka.clients.producer.KafkaProducer.<init>(KafkaProducer.java:156)
> at com.openet.testcase.Activator.start(Activator.java:16)
> at org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:697)
> at org.apache.felix.framework.Felix.activateBundle(Felix.java:2226)
> ... 16 more
> *Caused by: org.apache.kafka.common.config.ConfigException: Invalid value org.apache.kafka.clients.producer.internals.DefaultPartitioner for configuration partitioner.class: Class* *org.apache.kafka.clients.producer.internals.DefaultPartitioner could not be found.*
> at org.apache.kafka.common.config.ConfigDef.parseType(ConfigDef.java:255)
> at org.apache.kafka.common.config.ConfigDef.define(ConfigDef.java:78)
> at org.apache.kafka.common.config.ConfigDef.define(ConfigDef.java:94)
> at org.apache.kafka.clients.producer.ProducerConfig.<clinit>(ProducerConfig.java:206)
> {quote}
> Workaround is to call "currentThread().setContextClassLoader(null)" before initializing the kafka producer.
> Possible fix is to catch ClassNotFoundException at ConfigDef.java:247 and retry the Class.forName() call with the default classloader. However with this fix there is still a problem at AbstractConfig.java:206, where the newInstance() call succeeds but "instanceof" is false because the classes were loaded by different classloaders.
> Testcase attached, see README.txt for instructions.
> See also SM-2743
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)