首页 > 解决方案 > 当条目达到其生存时间时,我们如何将 Hazelcast 地图条目保存在数据库或文件中?

问题描述

在我的应用程序中,我们使用 Hazelcast 和 oracle DB。

当我们开始一个转换时,我们在 Hazelcast 映射中放置一个包含转换 id 的条目。

如果在 TTL 中使用了该转换 id,那就没问题了。我的应用程序使用了它,并且同一个线程从 hazelcast 映射中逐出该条目并将该转换 ID 保存在数据库中。 没有任何问题

当该转换 ID 未在其 TTL 内使用时,我的问题就出现了。Hazelcast 只是从地图中删除该条目。

我想检索该条目并将其保存在数据库中。

你会如何解决这个问题?我正在使用在至少有 4 个节点的集群中运行的 Hazelcast。

标签: hazelcast

解决方案


一种解决方案是通过Mapstore 接口存储 Hazelcast 地图,因此即使启用了 TTL 的数据被逐出,它也会保留在您的后备存储中。

另一种解决方案是捕获被驱逐的条目并将其存储在某个后备存储中。

这是一个示例应用程序,您可以自己尝试。

    HazelcastInstance hazelcastInstance = Hazelcast.newHazelcastInstance();
    IMap<String, String> map = hazelcastInstance.getMap("test");
    map.addEntryListener(new EntryEvictedListener<String,String>() {
        @Override
        public void entryEvicted(EntryEvent<String, String> entryEvent) {
            System.out.println(entryEvent.getKey() + ":" + entryEvent.getOldValue());
        }
    },true);
    map.put( "1", "John", 10, TimeUnit.SECONDS );

10 秒后,您将看到该条目被逐出并打印到控制台。

事件被发送到所有节点,因此最好实现EntryListenerConfig,将其添加到 MapConfig 并将本地参数设置为 true 以仅接收本地事件。

请参阅注册地图侦听器了解更多信息。


推荐阅读