I raised the question in Hazelcast Gitter community and they got back to me saying to use the com.hazelcast.config.Config#setClassLoader(...) to set the requeired class loader as the solution.
Since the issue affects all the users of carbon Hzelcast module we have to fix this in carbon Hazelcast module. @Kishanthan I've created a PR [1] with the suggested fix (by Hazelcast) to add the carbon hazelcast module class loader as the class loader of hazelcast bundle. Please review and merge. [1] https://github.com/wso2/carbon-kernel/pull/974 On Tue, May 10, 2016 at 5:13 PM, Asitha Nanayakkara <asi...@wso2.com> wrote: > Hi All, > > We came across an issue with Hazelcast topics when passing custom message > objects (Can occur for Maps and all the other data structures in Hazelcast) > with C5 Hazelcast module. We have created an issue for this as well [1]. > Use case > > I'm working with Hazelcast reliable topics in an OSGi environment. I'm > using a custom message object with Hazelcast topics ClusterNotification > <https://github.com/wso2/andes/blob/v3.1.5/modules/andes-core/broker/src/main/java/org/wso2/andes/server/cluster/coordination/ClusterNotification.java> > . > > public class ClusterSubscriptionChangedListener implements > MessageListener<ClusterNotification> { > > /** > * This method is triggered when a subscription is changed in clustered > environment. > * > * @param message contains the ClusterNotification > */ > @Override > public void onMessage(Message<ClusterNotfication> message) { > // message handling logic > } > } > > I'm publishing/receiving messages to/from Hazelcast topics from another > OSGi bundle. > Issue > > I can publish messages to the topic successfully. But I don't receive the > messages from the listener. This is because, when the Hazelcast topic ring > buffer runners try to pick the serialized message and de-serialize, it > throws a ClassNotFoundException. *And the exception is silently ignored* > and the message never received. > Root cause > > Class loader of the Hazelcast bundle cannot see the classes of my bundle. > Therefore even though I can publish the message from my bundle, Within > Hazelcast it can't de-serialize the ClusterNotification > <https://github.com/wso2/andes/blob/v3.1.5/modules/andes-core/broker/src/main/java/org/wso2/andes/server/cluster/coordination/ClusterNotification.java> > object since the class loader of Hazelcast bundle cannot see the class. > Solution, way forward? > > > 1. After having an offline discussion with Kishanthan we built the > hazelcast bundle with <DynamicImport-Package>*</DynamicImport-Package> > in the hazelcast pom.xml > <https://github.com/hazelcast/hazelcast/blob/v3.6/hazelcast/pom.xml> > and we successfully received the messages (We didn't get the > ClassNotFoundException). But we need a fix from Hazelcast. > 2. Another way Hazelcast has provided is to set the class loader for > the HazelcastInstance. So Internally Hazelcast instance will use the > provided class loader to deserialize the objects. If we provide our bundle > class loader it will properly deserialize the object without an issue. > > > @Kishanthan I tried to set the class loader of the carbon-kernel hazelcast > module to the hazelcast instance (when creating the hazelcast instance[2]) > and added dynamic imports * property (to get the solution 2 working from > the carbon kernel hazelcast module itself). Still I'm having issues in > loading the Andes classes thorough the carbon Hazelcast module class > loader. > [1] https://github.com/hazelcast/hazelcast/issues/8139 > [2] > https://github.com/wso2/carbon-kernel/blob/hamming-release-poc/modules/carbon-hazelcast/component/src/main/java/org/wso2/carbon/hazelcast/internal/CarbonHazelcastComponent.java#L60 > > Regards, > Asitha > > -- > *Asitha Nanayakkara* > Software Engineer > WSO2, Inc. http://wso2.com/ > Mob: +94 77 853 0682 > > -- *Asitha Nanayakkara* Software Engineer WSO2, Inc. http://wso2.com/ Mob: +94 77 853 0682
_______________________________________________ Dev mailing list Dev@wso2.org http://wso2.org/cgi-bin/mailman/listinfo/dev