问题描述
我想在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()
方法可以使用的瞬态字段中即可。