1

最近、ソフトウェアで Akka を使い始めましたが、コードのほとんどはまだ「従来の」Java コードです。私は現在、既存のクラスで Akka を使用したい立場にありますが、これらのクラスも使用する既存のコードをすべて書き直すことはできません。

特に、データ オブジェクトのマップを管理するクラスがあります。マップはすでに異なるスレッドによって同時に使用されているため、マネージャー クラスはマップへのすべてのアクセスが同期されていることを確認します。不要になったオブジェクトをマップから削除するクリーンアップ ジョブを作成する必要があります。このジョブはバックグラウンドで非同期に実行されることになっているため、Akka エージェントを使用します。つまり、多かれ少なかれ次のようなコードがあります。

Agent< ObjectManager > myObjectManagerAgent = new Agent< ObjectManager >( myObjectManager, myActorSystem );

...

myObjectManagerAgent.sendOff(
    new Function< ObjectManager, ObjectManager >()
    {
        @Override
        public ObjectManager apply( final ObjectManager objectManager )
        {
           ...

           objectManager.erase( irrelevantObjectIds );

           return objectManager;
        }
     }
  );

ただし、同じオブジェクト マネージャは、ソフトウェア内の他のいくつかの場所からエージェントなしで直接書き込まれます。前述のように、このアクセスはスレッドセーフですが、Akka、アクター、またはエージェントについては何も知りません。

ここで私の質問は次のとおりです。それとも、ここで自分の足を撃っていますか?一般的に機能する場合でも、知っておくべき潜在的なトラップや安全対策はありますか?

4

2 に答える 2

0

Akkaを使用して既存のコードを呼び出すのはごく普通のことであり、ここで行うのはこれだけです。ObjectManagerはスレッドセーフであり、ソフトウェアの他の部分もそれを使用しているとあなたは述べているので、Akkaを導入すると本質的に問題が発生すると考える理由はありません。一方、コアロジックをAkkaアクターに移動し、Akka以外のコンシューマーにその上にシンプルなファサードを提供することもできます。

于 2012-12-13T18:53:25.640 に答える
0

このオブジェクトが Agent 内にラップされているのを見ると少し混乱するでしょう (これは通常、同期されていない変更可能なリソースを複数のスレッドまたは実行コンテキスト間で安全に共有できるようにするために行いますが、実際にはそれ自体がスレッドセーフであるだけではありません)プログラム全体をエージェントベースのアプローチに移行している間は問題ないかもしれませんが、そのままにしておくのは奇妙に思えます.エージェントをまったく関与させたくない.その場合。

于 2012-12-14T14:47:52.203 に答える