Actor
はメッセージを受信するまでにX秒間待つことができますか?メッセージが受信された場合は、そうでない場合は、他のActor
(コンストラクタであらかじめ決められたもの)にメッセージを送信しますか?Akka Actor - メッセージを待つ時間を少し待ってください。そうでない場合はメッセージを送信してください。
8
A
答えて
3
あなたがのために任意のメッセージを待ちたい場合は、[はい、あなたは、単にreceivetimeoutのを設定します。http://doc.akka.io/docs/akka/current/scala/actors.html#receive-timeout
(ドキュメントがありますここでやや誤解を招くこともありますが、すべてのメッセージの後にreceiveTimeoutを設定することもできます)
16
Akka Actor "ask" and "Await" with TimeoutExceptionをご覧ください。しかし、その間アクターは他のメッセージを処理することができないので、俳優の内部をブロックすることは非常に悪い考えです。さらに、1つのAkka処理スレッドをブロックします。
より良いアプローチは、メッセージ送信(火災とを忘れる)とAkka schedulerを使用して、いくつかのタイムアウトイベントをスケジュールすることです。応答が到着したら、そのイベントをキャンセルするか、または何らかのフラグを設定して、実際に応答があった場合にトリガーしないようにします。
4
恐ろしいかもしれませんが、Finite State Machine (FSM)の特性をチェックしてください。
import akka._
import actor._
import util._
import duration._
import Impatient._
object Impatient {
sealed trait State
case object WaitingForMessage extends State
case object MessageReceived extends State
case object TimeoutExpired extends State
sealed trait Data
case object Unitialized extends Data
// In
case object Message
}
class Impatient(receiver: ActorRef) extends Actor with FSM[State, Data] {
startWith(WaitingForMessage, Unitialized)
when(WaitingForMessage, stateTimeout = 3 seconds) {
case Event(StateTimeout, data) => goto(TimeoutExpired) using data // data is usually modified here
case Event(Message, data) => goto(MessageReceived) using data // data is usually modified here
}
onTransition {
case WaitingForMessage -> MessageReceived => stateData match {
case data => log.info("Received message: " + data)
}
case WaitingForMessage -> TimeoutExpired => receiver ! TimeoutExpired
}
when(MessageReceived) {
case _ => stay
}
when(TimeoutExpired) {
case _ => stay
}
initialize
}
ここではアクションである:
object Main extends App {
import akka._
import actor._
import Impatient._
val system = ActorSystem("System")
val receiver = system.actorOf(Props(new Actor with ActorLogging {
def receive = {
case TimeoutExpired => log.warning("Timeout expired")
}
}))
val impatient = system.actorOf(Props(new Impatient(receiver)), name = "Impatient")
impatient ! Message
val impatient2 = system.actorOf(Props(new Impatient(receiver)), name = "Impatient2")
Thread.sleep(4000)
impatient2 ! Message
system.shutdown()
}
関連する問題
- 1. SP.UI.ModalDialog(メッセージをお待ちください)
- 2. クライアントがメッセージを送信しないようにしてくださいsocket.io
- 3. Webhookを受信してから待ってください
- 4. アニメーションGIFで待ってください
- 5. フラッシングバッファーを期待してください
- 6. 新しいメッセージを待っている間もまだ動作しているAkkaの俳優?
- 7. 信号Rでしばらくの間切断されたユーザにメッセージを送信してください
- 8. Qtで長時間稼動している間は「お待ちください」?
- 9. すべてのボットユーザーに新しいメッセージを送ってください
- 10. 返信を待たずにPhpMailerにメールを送ってください
- 11. FBで友だちを招待してください。
- 12. C++で正しい場合はプログラムを実行してください。そうでない場合は、もう一度入力してください。
- 13. async/UIスレッドに戻って待たないでください
- 14. エラーの場合は、式をそのまま残してください/何もしないでください。
- 15. 遅延を待つか、タイマを使用してください
- 16. 送信してくださいjavascriptで
- 17. Outlook数秒待ってから実行してください
- 18. fileSystemWatcherを待つように教えてください
- 19. インテントで電子メールクライアントを開きます(ただし、メッセージを送信しないでください)
- 20. count(data)が4以下の場合は、印刷してください。そうでない場合は2つ印刷してください。
- 21. シートが存在する場合は、サブを実行します。そうでない場合は、メッセージを表示してサブを終了してください
- 22. http.getがオブジェクトを返すまで待ってください
- 23. メッセージを暗号化し、Objective-Cでデコードしてください
- 24. 招待状の送信者を知る方法を教えてください。
- 25. コンソールでメッセージ401(Unauthorized)を印刷しないでください。
- 26. 子PIDがScanfを待っているか確認してください
- 27. ラジオボタンがチェックされていない場合にフォームを送信しないでください。
- 28. yauzl、fromBufferそして完了時を知ってください
- 29. Railsでコントローラーアクションの期待パラメーターを定義してください
- 30. プルを待つ方法を教えてください。
+1 rソリューション。 – paradigmatic