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

How to schedule a task on Hazelcast that queries on the IMap?

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

//主要class

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 实例的引用 运行ning in。从那里你可以做 instance.getMap("my-map") 并将地图引用存储在 run() 方法可以使用的瞬态字段中。