Napisałem już kilka aplikacji za pomocą operatorów scala i interesuje mnie, w jaki sposób ludzie podeszli do niektórych napotkanych problemów lub poradzili sobie z nimi.Pisanie aplikacji z aktorami Scala w praktyce
Mnóstwo klas wiadomości lub!?
Mam aktora, który reaguje na operację użytkownika i musi spowodować, że coś się stanie. Powiedzmy, że to react
s do wiadomości UserRequestsX(id)
. Ciągle mam problem z tym, że ponieważ chcę modularyzować moje programy, pojedynczy aktor sam w sobie nie jest w stanie ukończyć działania bez angażowania innych aktorów. Na przykład, przypuśćmy, że muszę użyć parametru id
, aby pobrać kilka wartości, a następnie te muszą zostać usunięte przez innego aktora. Gdybym pisał normalny program w języku Java, mógłbym zrobić coś takiego:
public void reportTrades(Date date) {
Set<Trade> trades = persistence.lookup(date);
reportService.report(trades);
}
Co jest dość proste. Jednak używanie aktorów staje się trochę uciążliwe, ponieważ chcę uniknąć używania !?
. Jeden aktor reaguje na komunikat ReportTrades(date)
, ale musi zapytać o transakcje PersistenceActor
, a następnie ReportActor
, aby je zgłosić. Jedynym sposobem znalazłem na to jest do zrobienia:
react {
case ReportTrades(date) =>
persistenceActor ! GetTradesAndReport(date)
}
tak, że w moim PersistenceActor
mam blok reagowania:
react {
case GetTradesAndReport(date) =>
val ts = trades.get(date) //from persietent store
reportActor ! ReportTrades(ts)
}
Ale teraz mam 2 problemy:
- Muszę utworzyć dodatkowe klasy wiadomości do reprezentowania tego samego żądania (tj. "Transakcje raportów"). W rzeczywistości mam trzy w tym scenariuszu, ale mogę mieć o wiele więcej - staje się problemem śledzenie tych
- Co powinienem nazwać pierwszą i trzecią wiadomością
ReportTrades
? Mylące jest wywoływanie ich zarównoReportTrades
(lub jeśli tak, muszę umieścić je w osobnych pakietach). Zasadniczo nie ma czegoś takiego jakoverloading
klasa typuval
.
Czy jest coś, czego mi brakuje? Czy mogę tego uniknąć? Czy powinienem po prostu zrezygnować i użyć !?
Czy ludzie używają jakiejś struktury organizacyjnej, aby wyjaśnić, co się dzieje?
Czy można bezpiecznie uzyskać dostęp do magazynu trwałego bezpośrednio w trybie "reagowania"? Myślałem, że nie możesz blokować operacji.Być może "otrzymanie" jest potrzebne dla tego konkretnego aktora. –