如何修复Hazelcast避免为EntryProcessor抛出“ java.lang.IllegalStateException:用户代码部署未启用”

时间:2019-02-01 07:42:52

标签: java hazelcast

我正在尝试为我们的应用程序使用EntryProcessor为Hazelcast设置代码。为了分析为什么EntryProcessor的代码无法在我们的应用程序中运行,我试图在本地计算机上设置一个类似的示例来重现该问题。但是,即使在我可以重现同一问题之前,我也面临着另一个问题,该问题应可以如下再现:

  1. here下载Hazelcast IMDG 3.10.6。并解压缩。
  2. 创建一个新的Java应用程序,并添加在main page的Java客户端-> EntryProcessor下给出的代码。
  3. 在解压缩的hazelcast文件夹的lib文件夹下添加存在的hazelcast-3.10.6和hazelcast-client-3.10.6 jar。
  4. 从bin文件夹下的start.bat文件启动hazelcast成员(服务器)。
  5. 运行步骤2中给出的Java客户端代码。

我也在下面粘贴Java客户端代码以供参考。

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();
    }
} 

我希望代码可以正常运行,因为hazelcast site中为Java Client提供的Map示例可以正常工作。另外,由于我们明确为ClientConfig启用了用户代码部署,因此我不明白为什么会遇到此问题。

1 个答案:

答案 0 :(得分:2)

您还需要在成员端启用User Code Deployment

相关问题