2016-04-25 9 views
0

ハゼルキャストを初めて使っていて、私の意見ではかなり簡単な問題ですが、解決できませんでした。ハゼルキャストでいっぱいになったらマップから値を取得

私は2番目のAPIを使用して別のサーバーから5秒後に値を取得する必要がある1つのサーバー(1番目のAPI)の2つのWebサービスを持っています。値を識別/取得/投入するために両方のサーバー間のreferenceId。言い換えれば、私の1番目のApiがIDで呼び出されると、そのIDを持つ2番目のApiにプッシュされたものが返されます。

この図は、私が第一と第二のAPIを接続することによって解決したいものをよりよく示しています enter image description here

だから、私は、IMAPを使用していると「取得」と、このように「置く」ん:

//- First API -// 
Integer referenceId = XXXX; // coming in the step 2 
IMap<Integer, String> map = hazelcastInstance.getMap("ResponseMap"); 

Thread.sleep(5000); // Sleep here does the trick but it's the worst performance 
String strResponse = map.get(referenceId); 

一方、他のサーバは、データを入れるために起こっているこのような5秒まで後:これに伴う問題は、そのマップである

//- Second API -// 
String refId = captureRefId(YYYY) 
IMap<Integer, String> map = hazelcastInstance.getMap("ResponseMap"); 
map.put(refId, YYYY); 

.getはその時点で値が存在しないので常にnullを返しますが、もし私がsleep(5)を追加すると、すべて正常に動作します。

私の質問は、map.get(referenceId)を他のサーバーがその特定のIDでマップに移入するまでブロックするにはどうすればよいですか? IMapを使うよりも良い選択肢がありますか?

+0

ポーリングループは数ミリ秒の待ち時間で問題を解決できませんか?私はあなたの質問/問題を完全に理解しているかどうかはわかりません。 IMapにはこのようなブロッキング操作がありません。おそらくIQueueはそれをより良く解決しますが、実際に達成したいことに依存します。たぶんあなたはもっと詳しく説明することができます。あなたのコメントのために@noctariusありがとう – noctarius

+0

私はダイアグラムで質問を更新しました。私の第二のAPIが実行されるのを待っている第一のAPIを持ち、そのデータを移植したいという私の問題をより良く示す。 –

+0

まだ、ポーリングは問題を解決していませんか?代わりに、マップリスナー? – noctarius

答えて

2

@noctariusが述べたように、必ずIMapを使用したい場合はEntryListenerが最適なアプローチになります。 EntryListenerの動作例を次に示します。

https://github.com/hazelcast/hazelcast-code-samples/blob/master/distributed-map/entry-listener/src/main/java/ListeningMember.java

あなたは購読してエントリが追加されるたびに通知を受けます。その後、あなたのロジックを発火させることができます。

+0

答えを評価する機会はありましたか?それを行うための唯一の方法。 –