Hazelcast IMap TTL 到期

Hazelcast IMap TTL Expiry

在IMap的put方法中,一旦TTL集过期,如何调用一个方法将数据同步到一些DB或Kafka class。

eg:IMap.put(key,value,TTL,TimeUnit.SECONDS);

如果上面的 TTL 设置为 10 秒左右,我必须调用一些存储或某种机制,以便我可以将该键和值实时同步到 DB 或 Kafka。截至目前,当我尝试存储方法时,它会立即调用该方法,而不是等待 10 秒。

您可以为您的地图配置设置一个 EntryExpiredListener。

它以两个基于过期的驱逐来源为食,它们是 max-idle-secondstime-to-live-seconds

示例侦听器 class:

@Slf4j
public class MyExpiredEntryListener implements EntryExpiredListener<String, String>, MapListener {

    @Override
    public void entryExpired(EntryEvent<String, String> event) {
        log.info("entry Expired {}", event);
    }
}

您可以通过编程方式添加此配置,或者您可以通过 xml 配置文件设置 mapconfig。

用法示例:

public static void main(String[] args) {
   Config config = new Config();

   MapConfig mapConfig = config.getMapConfig("myMap");
   mapConfig.setTimeToLiveSeconds(10);
   mapConfig.setEvictionPolicy(EvictionPolicy.RANDOM);

   HazelcastInstance hz = Hazelcast.newHazelcastInstance(config);

   IMap<String, String> map = hz.getMap("myMap");
   map.addEntryListener(new MyExpiredEntryListener(), true);
   for (int i = 0; i < 100; i++) {
        String uuid = UUID.randomUUID().toString();
        map.put(uuid, uuid);
   }
}

当运行执行此操作时,您将看到如下日志。

entry Expired EntryEvent{entryEventType=EXPIRED, member=Member [192.168.1.1]:5701 - ca76c6d8-abe0-4efe-a6a6-24330657675b this, name='myMap', key=70ee594c-ffea-4584-aefe-1148b9fcdf9f, oldValue=70ee594c-ffea-4584-aefe-1148b9fcdf9f, value=null, mergingValue=null}

另外,您可以根据自己的需要使用其他入口监听器。