微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何在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 举报,一经查实,本站将立刻删除。