Я пытался интегрировать Hazelcast в свое приложение, но столкнулся с поведением, которого я не ожидал с прослушивателем onExpired и onRemoved.
В идеале, я хотел бы выполнить некоторый код всякий раз, когда значениеудалено из моего кешаЯ настроил политику Expiry для кеша и ожидаю, что мой слушатель onRemoved будет следовать после истечения срока действия значения в моем кэше, но, похоже, это не так.
Вызывает ли Hazelcast слушатель onRemoved после удаленияистекшее значение из кэша или только при явном cache.remove()
вызове?
Моя конфигурация:
hazelcastInstance = HazelcastInstanceFactory.getOrCreateHazelcastInstance(getHazelcastConfig());
// Add cache used by adams
CacheSimpleConfig cacheSimpleConfig = new CacheSimpleConfig()
.setName(CACHE_NAME)
.setKeyType(UserRolesCacheKey.class.getName())
.setValueType((new String[0]).getClass().getName())
.setReadThrough(true)
.setInMemoryFormat(InMemoryFormat.OBJECT)
.setEvictionConfig(new EvictionConfig()
.setEvictionPolicy(EvictionPolicy.LRU)
.setSize(1000)
.setMaximumSizePolicy(EvictionConfig.MaxSizePolicy.ENTRY_COUNT))
.setExpiryPolicyFactoryConfig(
new ExpiryPolicyFactoryConfig(
new TimedExpiryPolicyFactoryConfig(ACCESSED,
new DurationConfig(
120,
TimeUnit.SECONDS))));
hazelcastInstance.getConfig().addCacheConfig(cacheSimpleConfig);
ICache<UserRolesCacheKey, String[]> userRolesCache = hazelcastInstance.getCacheManager().getCache(CACHE_NAME);
userRolesCache.registerCacheEntryListener(new MutableCacheEntryListenerConfiguration<>(
new UserRolesCacheListenerFactory(), null, false, false));
}
}
}
Мой слушатель довольно прост:
public class UserRolesCacheListenerFactory implements Factory<CacheEntryListener<UserRolesCacheKey, String[]>> {
@Override
public CacheEntryListener create() {
return new UserRolesCacheEntryListener();
}
}
И:
public class UserRolesCacheEntryListener implements CacheEntryRemovedListener<UserRolesCacheKey, String[]>{
private final static Logger LOG = LoggerFactory.getLogger(UserRolesCacheEntryListener.class);
@Override
public void onRemoved(Iterable<CacheEntryEvent<? extends UserRolesCacheKey, ? extends String[]>> cacheEntryEvents) throws CacheEntryListenerException {
cacheEntryEvents.forEach(this::deleteDBData);
}
Я ожидаю, что когда-нибудь после 120-х годов мой метод onRemoved
будет вызываться Hazelcast, так как он удаляет значение с истекшим сроком из кэша, но, похоже, никогда не будет.
Это ожидаемое поведение?Чего-то не хватает в моей конфигурации кэша?