2015-12-04 1 views
1

J'ai une instance Hazelcast qui organise les données en fonction des noms de cartes. Les noms des cartes sont dynamiques, donc je ne sais pas ce qu'ils seront jusqu'à ce que l'instance de Hazelcast soit déjà commencée. Je veux maintenant stocker ces données dans une base de données via la fonctionnalité MapStore, mais conserver l'organisation que j'ai configuré avec les noms de carte. Lorsque je regarde la fonctionnalité MapStore, je ne vois aucun moyen de récupérer la carte ou le nom de la carte d'où provient l'objet. On dirait que tout ce que je reçois est la paire clé-valeur dans l'implémentation de MapStore. Sur une note plus large, existe-t-il un moyen d'obtenir TOUTES les informations (pas seulement le nom de la carte) sur la paire de valeurs-clés devant être stockée?Mapstore Hazelcast basé sur le nom de la carte

Je voudrais transférer quelques connaissances sur la façon de stocker les données ... Je connais l'information quand j'appelle map.put (..), mais je ne sais pas comment transférer cette information à l'appel MapStore ...

+1

pourriez-vous ajouter des informations supplémentaires à la clé? – MarianP

Répondre

0

Selon ce que je comprends, il n'y a pas de support prêt à l'emploi en noisette. Voici quelques solutions de contournement, je peux penser à:

  1. encapsulent les informations supplémentaires (nom de la carte, comment stocker les données, etc.) dans un objet de contexte et le stocker dans une carte java différente contre votre clé. Utilisez cette carte dans votre implémentation MapStore plus tard pour récupérer les informations respectives qui vous aideront à conserver vos clés, paires de valeurs.

Vous pouvez mettre l'opération peut ressembler. Dans votre implémentation MapStore, vous pouvez utiliser ce contextMap pour extraire des valeurs supplémentaires dans votre implémentation MapStore.

  1. La deuxième solution consisterait à encapsuler les informations dans la paire (clé, valeur). Vous pouvez créer une nouvelle classe appelée CacheEntry pour stocker les valeurs de cache ainsi que des informations supplémentaires. Vous pouvez ensuite récupérer votre valeur de cache ainsi que des informations supplémentaires de iMap lui-même.

Vous pouvez mettre l'opération peut ressembler.

CacheEntry<YourValueClass> cacheEntry = new CacheEntry<YourValueClass>(); 
cacheEntry.setValue(value); 
cacheEntry.howToStoreData(..); 
cacheEntry.setMapName(..); 
imap.put(key, cacheEntry); 

Dans votre implémentation MapStore, vous pouvez alors utiliser la valeur (ce qui serait un objet CacheEntry) lui-même pour récupérer des informations supplémentaires ainsi que réelle value (instance de YourValueClass).

1

Je voulais juste quelque chose de similaire et a constaté que vous pouvez mettre en œuvre com.hazelcast.core.MapStoreFactory Interface dont « newMapStore » méthode vous donne le nom de la carte et les propriétés de configuration. À partir de là, votre nouvelle implémentation MapStore passe le nom de la carte.

public class MyMapStoreFactory implements MapStoreFactory { 

    @Override 
    public MapStore newMapStore(String mapName, Properties properties) { 
     return new MyMapStoreImplementation(mapName, properties); 
    } 
} 

Et configurer cette classe d'usine dans la configuration de hazelcast.xml comme ceci:

<map name="MapX*"> 
    <map-store enabled="true" initial-mode="EAGER"> 
     <factory-class-name>MyMapStoreFactory</factory-class-name> 
    </map-store> 
</map> 

Notez que le caractère générique sur le nom de la carte et que < élément classe nom > ne doit pas apparaître une fois que vous définissez < usine -class-name >.

Testé avec Hazelcast 3.6.1 et il fonctionne très bien.