1

Dao を介して、DB 操作をブロックするルーターの背後に DB ワーカー アクターのプールがあります。foo オブジェクトを Dao に挿入 ("putting") すると、同じ foo を 2 回挿入しようとすると、DuplicateKeyException がスローされます。その場合、 DuplicateFoo(foo) メッセージで応答したいと思います。成功したら、FooAdded(foo) で応答したいと思います。これが私が行った方法です。より良い方法はありますか?

def receive = {
  case PutFoo(foo) =>
    try {
      dao.put(foo)
      sender ! FooAdded(foo)
    } catch {
      case DuplicateKeyException(_) =>
        sender ! DuplicateFoo(foo)
    }
}

Dao は DuplicateKeyException をスローした後もリクエストを処理し続けても問題ないので、ワーカーを再起動する必要はあまりないと思います。

4

1 に答える 1

1

理論的な観点から、あなたがしていることは「含む」チェックであり、次に「プット」または「通知」です。実用的な観点からは、それがどのように実装されるかは「置く」ことであり、地獄が解き放たれた場合は「通知する」ことです。

理論的には予期しない動作はないためput 、失敗した場合の実装は理想的ではありません。一意性が必要な場合は、「含む」チェックが予想されるため、put(またはシナリオでは) 「配置」しようとして内部的PutFooにキャッチしようとしても、Status(Success|Failure) を返す必要があります。、または、または、または独自のステータス ADT を取得しますが、時々発生すると予想される何かに対して例外をスローしないでくださいDuplicateKeyExceptionBooleanOptionEitherTry

例外がなければ、ワーカーを再起動する必要はありませんが、あなたの腸はずっとこれを伝えようとしていたと思います。;)

于 2013-04-13T04:55:38.937 に答える