如何在Hazelcast上安排在IMap上进行查询的任务?

问题描述

我想在Hazelcast上安排一个以固定间隔运行的任务,并使用击中其余端点后获得的一些数据更新IMap。下面是示例代码:

//主班

IScheduledExecutorService service = hazelcast.getScheduledExecutorService("default");

service.scheduleAtFixedRate(TaskUtils.named("my-task",myTask),30,1);

//任务

@Singleton
public class MyTask implements Runnable,Serializable {

    RestClient restClient;

    IMap<String,JsonObject> map;

    @Inject
    MyTask() { // Inject hazelcast and restclient
        map = hazelcastInstace.getMap("my-map");
        this.restClient = restClient;
    }

    @Override
    public void run() {
        Collection<JSONObject> values = map.values(new MyCustomFilter());
        for(JSONObject obj : values) {
             // query endpoint based on id
             map.submitToKey(key,response);
        }

    }


    private static class MyCustomFilter implements Predicate<String,JSONObject> {

        public boolean apply(Map.Entry<String,JSONObject> map) {
             // logic to filter relevant keys
        }

    }
}

当我尝试在集群上执行此操作时,我得到:

java.io.NotSerializableException: com.hazelcast.map.impl.proxy.MapProxyImpl

现在,我需要IMap仅根据PredicateFilter选择性地查询一些键,并且这需要是后台计划的作业,因此在此处进行了介绍。任何帮助表示赞赏。 TIA

解决方法

尝试使您的任务也实现HazelcastInstanceAware

提交任务时,它会被序列化,发送到网格以运行,在收到任务后反序列化,并调用run()方法。

如果您的任务实现了HazelcastInstanceAware,则在反序列化和run()之间,Hazelcast将调用方法setHazelcastInstance(HazelcastInstance instance),以将您的代码传递给正在运行的特定Hazelcast实例的引用。在那里,您只需执行instance.getMap("my-map")并将地图参考存储在run()方法可以使用的瞬态字段中即可。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...