Thank you for your help! I "think" this is working. *One thing I did notice in my test environment is that the events can be raised in drastically different times? *
It is not a huge deal since getting the item (providing the near cache has expired it) will trigger the expiration on Ignite which will in turn raise the events but I was just curious why such the delay especially in a local test environment... What is really odd to me is that no matter what I do, what order I put items in, what order the cache gets initially created, anything in "cache1" always seems to raise the event in a timely manner and both caches have the exact same configuration. My test case, which uses sleep() to simulate the expiration, seems to show more consistent results with the events being raised more timely. *For example:* 1) Spin up a single Ignite node (embedded / server / partitioned / EVT_CACHE_OBJECT_EXPIRED ) a) cache1 defined via configuration (eager TTL = true) b) cache2 defined via configuration (eager TTL = true) I assign a node attribute to each cache (cache = true) and then use a predicate to filter only those specific nodes in the listener. 2) Using a dummy REST resource (in same instance) put entries into the near-cache (caffeine) which writes through to the far-cache (ignite). Caffeine expires in 30s / Ignite expires in 60s On the first call to caffeine (which would be per Ignite node as well), if I have not initialized the ignite side, attach the listener (so, this happens just once on the node). Idea is to listen on any "expired" events and raise the action to the local near-cache. Then... a) put k1/aaa into cache1 b) put k2/bbb into cache2 c) put k3/ccc into cache2 /Output looks something like (9:35):/ [DEBUG] CaffeineConfigurableCacheManager : Created cache cache1 [ WARN] CaffeineConfigurableCacheManager : Initialized.... [DEBUG] IgniteCacheBuilder : Writing aaa to cache1 [DEBUG] CaffeineConfigurableCacheManager : Created cache cache2 [DEBUG] IgniteCacheBuilder : Writing bbb to cache2 [DEBUG] IgniteCacheBuilder : Writing ccc to cache2 3) Sit and wait (just looking at the events only, not if I get the record which forces the expiry on expired items)... /Within the ~"60s" expiration policy on Ignite I see (9:36):/ [DEBUG] IgniteCacheBuilder : Received remote event cache1 CACHE_OBJECT_EXPIRED aaa [DEBUG] IgniteCacheBuilder : Eviction callback cache1 CACHE_OBJECT_EXPIRED aaa /Much later I see (9:52):/ [DEBUG] IgniteCacheBuilder : Received remote event cache2 CACHE_OBJECT_EXPIRED bbb [DEBUG] IgniteCacheBuilder : Eviction callback cache2 CACHE_OBJECT_EXPIRED bbb [DEBUG] IgniteCacheBuilder : Received remote event cache2 CACHE_OBJECT_EXPIRED ccc [DEBUG] IgniteCacheBuilder : Eviction callback cache2 CACHE_OBJECT_EXPIRED ccc *My current code looks something like this:* ignite.events(ignite.cluster().forPredicate(new AttributeNodeFilter<>(CACHE_NODE_ATTRIBUTE_KEY, true))) .remoteListen( null, new IgnitePredicate<CacheEvent>() { @IgniteInstanceResource private transient Ignite ignite; @SpringResource(resourceClass = CacheManager.class) private transient CacheManager cacheManager; @Override public boolean apply(final CacheEvent event) { log.debug("Received remote event {} {} {} / {} {} ", event.cacheName(), event.name(), event.key(), event.node().id(), event.eventNode().id()); //Broadcase the callback ignite.compute().broadcastAsync((IgniteCallable)() -> { try { log.debug("Eviction callback {} {} {} / {} {} ", event.cacheName(), event.name(), event.key(), event.node().id(), event.eventNode().id()); //Evict item from cache cacheManager .getCache(event.cacheName()) .evict(event.key()); } catch (Exception x) { log.error("Callback error: {}", x.getMessage(), x); } //Return the event return true; }); return true; } }, EVT_CACHE_ENTRY_EVICTED, EVT_CACHE_OBJECT_EXPIRED); ----- KJQ -- Sent from: http://apache-ignite-users.70518.x6.nabble.com/