Hazelcast запускает прослушиватель onRemoved для истекших значений кэша? - PullRequest
0 голосов
/ 01 мая 2019

Я пытался интегрировать 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, так как он удаляет значение с истекшим сроком из кэша, но, похоже, никогда не будет.

Это ожидаемое поведение?Чего-то не хватает в моей конфигурации кэша?

1 Ответ

0 голосов
/ 01 мая 2019

Согласно спецификации JCache, раздел 8.4, событие REMOVED предназначено только для явных операций.

Прослушивание события EXPIRED будет лучше, но все же не идеально.

Обратите внимание на формулировку в спецификации и код здесь .EXPIRED события зависят от реализации - провайдеру кэширования разрешено никогда не замечать, что срок действия данных истек, никогда не удалять его, и поэтому никогда не генерировать событие.

Hazelcast замечает см. Здесь , но это делает своевременное появление нужного вам события зависимым от реализации.

...