2

私はアクター モデルにまったく慣れていないため、アクターやフューチャーなどの美しい構成可能な抽象化を使用して、私の一般的なシナリオに対処する確立されたパターンが既に存在すると思います。

次の要件を持つ非同期操作があります。

  • 低レベルのリクエストを送信し、ポーリングでエンティティの状態を監視することで、レガシー システムを使用します。したがって、実際の操作の結果は延期された方法でのみ利用可能であり、監視された状態が目的の状態に達したときにリクエスターに通知する必要があります。
  • これらの操作は、他のいくつかの操作が完了した後にのみ発行できます。これらの操作は、並行して待機する必要があります。
  • 操作はキャンセルできます。もちろん、すでに発行された低レベルのリクエストは取り消すことができません。キャンセルとは、依存する操作が終了した後に実際の操作を発行しないことを意味します。もちろん、これは再帰的に伝播する必要があります (依存関係を待っていて、保留中の操作が複数ある場合は、それらを発行しないでください)。

私はFuturesで考えています:最初の要件は、たとえばAkkaのmap/で解決でき、2番目の要件は、依存関係/依存関係を手続き的に維持することなくflatMap、コンビネーターで解決できます。しかし、キャンセルtraverseの解決策が思いつきません。フューチャーはキャンセルできず、構成されている場合、それらのコンポーネントには到達できません。「現在の操作のキャンセル」を機能的な方法でカプセル化する方法は? Scala の Actor フレームワークでこれをサポートしているものはありますか?

4

2 に答える 2

3

リスナーを使用する: https://github.com/jboner/akka/blob/release-1.2/akka-actor/src/main/scala/akka/routing/Listeners.scala

リスナーを使用してポーリングの状態をすべてのリスナーに伝達するアクタを作成します。その後、メッセージ パッシング ループを使用して、ポーリングを再開できます。

class MyActor extends Actor with Listeners {

  override def preStart {
    self ! 'poll //Start looping on start
  }

  def receive = listenerManagement orElse {
    case 'poll => val result = pollYourExternalDude()
    gossip(result)
    self ! 'poll //Loop
  }
}

次に、停止または PoisonPill の送信を使用してアクターを停止できます。

それは役に立ちますか?

于 2011-08-31T10:14:52.690 に答える
0

Guava のListenableFutureは、一緒にバインドされた場合のレベルへのキャンセルをサポートします(ただし、 collection から結合された場合はサポートされません)。

于 2012-01-17T15:22:53.967 に答える