Joe O'Connor created KAFKA-3218: ----------------------------------- Summary: 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
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.3.4#6332)