1

Ignite がデータ グリッド内のオブジェクトのプロパティの変更をリッスンし、そのオブジェクトに対して何らかの操作を実行する必要があるユース ケースを調査しています。パフォーマンスのために、データがあるノードと同じノードで処理を実行したいと考えています。

  • オブジェクトのプロパティが特定の値に変更されたときにイベントを取得するにはどうすればよいですか (たとえば、オブジェクト ' ' には ' ' から ' 'に設定されXたプロパティ ' ' があります)、イベントのみがノードから取得されるようにするにはどうすればよいですかオブジェクトはどこに住んでいますか?statescheduledcreated

  • イベントを取得して処理を開始したときに、処理が完了するまで (つまり、イベントが取得されるとすぐにトランザクションが開始されるまで) 誰もオブジェクトを変更しない (読み取りのみが許可される) ことを確認するにはどうすればよいですか?

  • 処理コードがすべてのノードにデプロイされ (処理はステートレス)、ローカル データでのみ動作するようにするにはどうすればよいですか (データ オブジェクトとコードの間にハード リンクがない、つまり、処理コードが更新された場合)。未来、オブジェクトは手付かずのままです)

ドキュメントから得たものは次のとおりです。

// Local listener that listenes to local events.
IgnitePredicate<CacheEvent> locLsnr = evt -> {


  // CODE

  return result;
};

// Subscribe to specified cache events occuring on local node.
ignite.events().localListen(locLsnr,
  EventType.EVT_CACHE_OBJECT_PUT);
  • CODEブロックで; state' ' の変更を確認する必要がありevt.newValue()ます。それをもっと早く行うことはできませんか? すなわち。何とかlocalListenへのパラメータとして?

  • ブロックでは、CODE結果を返すまでオブジェクトはロックされていますか? 言い換えれば、誰もオブジェクトを変更できず、オブジェクトを安全に変更できると確信しているのはここですか? IMOハンドラークラスではなく、「述語」定義でそれを行うのは奇妙な場所です。

スヴェン

4

1 に答える 1

2

スヴェン、

コードは正しいように見え、期待どおりに動作するはずです。質問への回答:

  • イベントリスナーは値が更新された直後に呼び出されるので、リスナーの中で気になるフィールドを確認しておけばOKだと思います。フィールドが変更されていない場合は、すぐに戻ります。
  • エントリの同期ブロック内でリスナーが呼び出されるため、オブジェクトはロックされます。同じオブジェクトを変更できますが、エラーが発生しやすく、パフォーマンスに影響を与える可能性があるため、リスナー内でキャッシュの更新などの同期操作を実行することはお勧めしません。ロックができるだけ早く解放されるように、これを非同期で行う必要があります。
于 2016-01-05T22:46:09.787 に答える