Saurabh Gour
Saurabh Gour

Reputation: 753

How to fix Hazelcast from throwing 'java.lang.IllegalStateException: User Code Deployment is not enabled' for EntryProcessor

I am trying to set up a code for Hazelcast using EntryProcessor for our application. To analyze why the code for EntryProcessor was not working in our application, I am trying to setup a similar example on my local machine to reproduce the issue. However, even before I can reproduce the same issue I am facing another issue which should be reproducible as follows:

  1. Download Hazelcast IMDG 3.10.6 from here. and unzip it.
  2. Create a new Java application and add the code given under Java Client --> EntryProcessor of the main page.
  3. Add hazelcast-3.10.6 and hazelcast-client-3.10.6 jars present under lib folder of the unzipped hazelcast folder.
  4. Start hazelcast member (server) from start.bat file present under bin folder.
  5. Run the Java Client code given in step 2.

I am pasting the Java client code below as well for reference.

package client;
import com.hazelcast.client.HazelcastClient;
import com.hazelcast.client.config.ClientConfig;
import com.hazelcast.client.config.ClientUserCodeDeploymentConfig;
import com.hazelcast.core.HazelcastInstance;
import com.hazelcast.core.IMap;
import com.hazelcast.map.AbstractEntryProcessor;

import java.io.Serializable;
import java.util.Map;

public class EntryProcessorSample {

    public static class IncEntryProcessor extends AbstractEntryProcessor<String, Integer> implements Serializable {
        @Override
        public Object process(Map.Entry<String, Integer> entry) {
            // Get the value passed
            int oldValue = entry.getValue();
            // Update the value
            int newValue = oldValue + 1;
            // Update the value back to the entry stored in the Hazelcast Member this EntryProcessor is running on.
            entry.setValue(newValue);
            // No need to return anything back to the caller, we can return whatever we like here.
            return null;
        }
    }

    public static void main(String[] args) {
        // Enable Code Deployment from this Client classpath to the Cluster Members classpath
        // User Code Deployment needs to be enabled on the Cluster Members as well.
        ClientConfig config = new ClientConfig();
        ClientUserCodeDeploymentConfig userCodeDeploymentConfig = config.getUserCodeDeploymentConfig();
        userCodeDeploymentConfig.setEnabled(true);
        userCodeDeploymentConfig.addClass(EntryProcessorSample.IncEntryProcessor.class);
        // Start the Hazelcast Client and connect to an already running Hazelcast Cluster on 127.0.0.1
        HazelcastInstance hz = HazelcastClient.newHazelcastClient(config);
        // Get the Distributed Map from Cluster.
        IMap<String, Integer> map = hz.getMap("my-distributed-map");
        // Put the integer value of 0 into the Distributed Map
        map.put("key", 0);
        // Run the IncEntryProcessor class on the Hazelcast Cluster Member holding the key called "key"
        map.executeOnKey("key", new IncEntryProcessor());
        // Show that the IncEntryProcessor updated the value.
        System.out.println("new value:" + map.get("key"));
        // Shutdown this Hazelcast Client
        hz.shutdown();
    }
} 

I expected the code to run without any issues, since the Map example given for Java Client in the hazelcast site works just fine. Also since we are explicitly enabling user code deployment for the ClientConfig, I do not understand why we are getting this issue.

Upvotes: 0

Views: 1681

Answers (1)

Ozan Kılı&#231;
Ozan Kılı&#231;

Reputation: 591

You need to enable User Code Deployment at the member side too.

Upvotes: 2

Related Questions