2017-09-11 4 views
0

J'essaie de définir TTL sur un enregistrement dans IMap qui est chargé à partir de cassandra mapStore. Pour ce faire, j'ai implémenté un listener d'événements EntryAdded et EntryUpdated pour l'IMap. Mais les méthodes ne sont pas invoquées quand je lis les données de mapstore et les remets à noisetier.Hazelcast 3.8 Les listeurs d'entrées EntryAdded ou EntryUpdated ne sont PAS invoqués lorsqu'une entrée est chargée à partir de maptsore

Mes attentes sont-elles erronées? Si oui, quelles sont les solutions possibles pour y parvenir?

Merci

Répondre

1

MapLoader.loadAll() génèreront il AJOUTÉE événement lorsque le IMap est initialement peuplée. Par la suite, MapLoader.load() ne générera pas l'événement ADDED pour les objets chargés par la suite.

Cela est incompatible et enregistrée comme un problème, https://github.com/hazelcast/hazelcast/issues/7771

Même fois le problème résolu, il ne sera pas le TTL à l'entrée différemment d'une autre.

Pour cela, vous voudrez peut-être enquêter sur la « cache-côté » modèle de conception, où votre code teste la IMap pour la présence de données, et ne Cassandre récupérer et Hazelcast sauver, ce qui permettrait à un TTL différent par entrée.

+0

Salut, merci pour l'aide.J'ai découvert qu'il y a un problème avec l'approche que vous avez mentionné.Si je fais un Map.containsKey (key) alors la méthode MapLoader.load() est déclenchée et charge l'enregistrement dans hazelcast à partir de mapstore sans ttl. Cela échoue le but que j'essaie d'atteindre. Je n'ai pas non plus implémenté loadAllkeys. Hazelcast version 3.8 – user2966021

+0

Ce que je voulais dire pour "_cache-aside_", c'est que _IMAP_ n'utilise pas de chargeur de cartes. Votre code fait IMap.containsKey, si le résultat est faux, votre code se charge à partir de Cassandra, puis fait un IMap.put. Puis, à ce stade, la clé est dans l'IMap de toute façon, donc ils peuvent faire IMap.get –

+0

On dirait que ce comportement de chargeur de carte pourrait être amélioré, https://github.com/hazelcast/hazelcast/issues/11342. –

1

Je ne pense pas qu'il soit possible de définir le TTL lors du chargement de l'entrée à l'aide de MapLoader. Voici l'approche que vous pouvez suivre: 1. Vérifiez si l'entrée n'est pas dans le cache 2. Si ce n'est pas dans le cache - l'obtenir du magasin de données. Utilisez la méthode PUT qui permettra de définir le TTL. Vous pouvez envelopper cette logique à l'intérieur de Hazelcast Callable, qui peut être configuré en fonction de la partition. Cela permettra d'économiser le coût du réseau car il va exécuter le code sur le nœud où les données résident