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
_______________________________________________
Dev mailing list
Dev@wso2.org
http://wso2.org/cgi-bin/mailman/listinfo/dev

Reply via email to