Czy jest możliwe, aby Actor
czekać X ilość sekund, aby odebrać wiadomość, a jeśli wiadomość jest odbierana, przetwarzać jak zwykle, w przeciwnym razie wyślij wiadomość do innego Actor
(wstępnie określonego w konstruktorze)?Aktor Akka - poczekaj chwilę, aby spodziewać się wiadomości, w przeciwnym razie wyślij wiadomość
Odpowiedz
Tak, jeśli chcesz czekać na żadnego wiadomość, wystarczy ustawić ReceiveTimeout: http://doc.akka.io/docs/akka/current/scala/actors.html#receive-timeout
(Docs jest tutaj nieco mylące, możesz ustawić receiveTimeout również po każdej wiadomości)
Jest to możliwe, spójrz na Akka Actor "ask" and "Await" with TimeoutException. Należy jednak pamiętać, że blokowanie wewnątrz aktora to bardzo zły pomysł, ponieważ w tym czasie aktor nie może obsłużyć żadnych innych wiadomości. Ponadto blokuje jeden wątek przetwarzania Akka.
Lepszym rozwiązaniem jest wysłanie wiadomości (pożar i zapomnienie) i zaplanowanie jakiegoś zdarzenia timeout przy użyciu Akka scheduler. Kiedy nadejdzie odpowiedź, anuluj to wydarzenie lub ustaw flagę, aby się nie uruchamiała, jeśli odpowiedź rzeczywiście nadejdzie na czas.
Może to być przesada, ale możesz sprawdzić cechę 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
}
Oto ona w akcji:
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. Czy aktor Akka może w razie potrzeby wysyłać wiadomości ze swojej skrzynki pocztowej?
- 2. Akka: Wyślij wiadomość do przyszłego aktora
- 3. Czy jest jakiś lekki aktor w Akka?
- 4. Jak mogę sprawdzić, czy istnieje aktor Akka (akka 2.2)?
- 5. Poczekaj na asynchroniczne Przyszłe połączenie przed przetworzeniem następnej wiadomości w Akka
- 6. AngularJS: ngRoute, w przeciwnym razie nie działa
- 7. Jak ustawić odporność na uszkodzenia akka Aktor?
- 8. SignalR - Wyślij wiadomość OnConnected
- 9. mechanizmy wiadomości Akka przykładem
- 10. akka: jak sprawdzić, czy aktor został zatrzymany
- 11. Akka wysyłanie zamknięcie do zdalnego aktor
- 12. Telegram C# przykład wyślij wiadomość
- 13. W jaki sposób Akka obsługuje wersje wiadomości?
- 14. wyślij wiadomość tekstową przez .net
- 15. Sprawdź połączenie z bazą danych, w przeciwnym razie wyświetl komunikat:
- 16. Jak przetestować, że aktor Akka został utworzony w Scali
- 17. Czy to bezpieczne, aby aktor Akka stał się metodą zamykania niezmiennego stanu?
- 18. Ratchet WebSocket - natychmiast wyślij wiadomość
- 19. Przeglądanie: W razie potrzeby użyj module.exports, w przeciwnym razie można wyeksponować globalne
- 20. Wyślij wiadomość do skryptu w języku Python
- 21. Sprawdź, czy istnieje wiersz, w przeciwnym razie wstaw
- 22. jeśli, w przeciwnym razie, jeśli i koniec Lua
- 23. Tworzenie drzew wyrażeń do reprezentowania, jeśli w przeciwnym razie
- 24. MongoDB- Wstaw, jeśli nie istnieje, w przeciwnym razie pomiń
- 25. UIActivityViewController wyślij wiadomość html ios6
- 26. Wyzwalacz SQL Server - Wyślij wiadomość do kolejki
- 27. Python - Flask-SocketIO wyślij wiadomość z wątku: nie zawsze działa
- 28. Scala Akka i bufory protokołów
- 29. Poczekaj na Android AsyncTask, aby zakończyć
- 30. Poprawny sposób na odkładanie wiadomości w Akka
+1 dla harmonogramu r rozwiązanie. – paradigmatic