如何解决如何在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()
方法可以使用的瞬态字段中即可。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。