1

マップ名に基づいてデータを整理する Hazelcast インスタンスがあります。マップ名は動的であるため、Hazelcast インスタンスが開始されるまでマップ名がどうなるかわかりません。MapStore 機能を使用してこのデータをデータベースに保存したいと考えていますが、マップ名で設定した編成は保持したいと考えています。MapStore の機能を見ると、オブジェクトの元となったマップまたはマップ名を取得する方法がわかりません。私が得るのは、MapStore 実装のキーと値のペアだけのようです。

より広い意味で、保存する必要があるキーと値のペアに関する情報 (マップ名だけでなく) を取得する方法はありますか? データを保存する方法についての知識を伝えたいです... map.put(..) を呼び出すときの情報は知っていますが、その情報を MapStore 呼び出しに伝える方法がわかりません...

4

2 に答える 2

2

似たようなものが必要だったのですが、 com.hazelcast.core.MapStoreFactoryインターフェイスを実装できることがわかりました。その ' newMapStore ' メソッドは、config からマップ名とプロパティを取得します。そこから、マップ名を渡して独自の MapStore 実装を「新規」にします。

public class MyMapStoreFactory implements MapStoreFactory {

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

そして、このファクトリ クラスを hazelcast.xml 構成で次のように構成します。

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

マップ名のワイルドカードと、<factory-class-name> を設定したら <class-name> 要素を表示してはならないことに注意してください。

これを Hazelcast 3.6.1 でテストしたところ、非常にうまく動作しました。

于 2016-04-08T15:02:56.127 に答える
0

私の理解によると、hazelcast にはすぐに使用できるサポートはありません。以下は、私が考えることができるいくつかの回避策です。

  1. 追加情報 (マップ名、データの保存方法など) をコンテキスト オブジェクトにカプセル化し、キーに対して別の Java マップに保存します。後で MapStore 実装でこのマップを使用して、キーと値のペアを永続化するのに役立つそれぞれの情報を取得します。

置くと操作が似てくるかもしれません。

hzMap.put(key, value);
Context context = new Context();
context.setHowToStoreData();
context.setMapName();
// any othe rother information
context.xxx();
// create a unique context key which can be later deduced from (key,value) pair.
contextKey = getUniqueContextKey(key, value);
contextMap.put(contextKey, context);

MapStore の実装では、この contextMap を使用して追加の値を取得できます。

  1. 2 番目の方法は、(キー、値) ペア内に情報をカプセル化することです。CacheEntry という新しいクラスを作成して、キャッシュ値と追加情報を格納できます。その後、キャッシュ値と追加情報を iMap 自体から取得できます。

置くと操作が似てくるかもしれません。

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

MapStore の実装では、値 (CacheEntry オブジェクト) 自体を使用して、実際のvalue( のインスタンスYourValueClass) だけでなく追加情報も取得できます。

于 2015-12-05T07:50:08.093 に答える