2013-09-30 16 views
10

Celem jest zaimplementowanie bardzo prostej pamięci podręcznej dla aktora, który musi wywoływać usługę zewnętrzną (lub jakąś kosztowną, ale wysoce buforowaną operację) bez użycia stanu zmiennego.Czy to bezpieczne, aby aktor Akka stał się metodą zamykania niezmiennego stanu?

class A extends Actor{ 
    def receive = { 
    case GetCommand => 
     val response = callExternalService() 
     context.become(receiveWithCache(response)) 
     context.system.scheduler.schedule(1 day, 1 day, self, InvalidateCache) 
     sender ! response 
    } 
    def receiveWithCache(cachedResponse:R): PartialFunction[Any,Unit] = { 
    case GetCommand => sender ! cachedResponse 
    case InvalidateCache => context.unbecome 
    } 
} 

wiem, że istnieją bardziej zaawansowane sposoby realizacji tej, wśród których pełnoprawną CacheSystem, które można znaleźć na stronach wzory Akka, ale w niektórych przypadkach, że naprawdę nie jest wymagane.

Co więcej, warto wiedzieć, czy odpowiedź na to pytanie jest bezpieczna.

+0

Nie mogę się doczekać odpowiedzi, ponieważ jest to bardzo eleganckie. – yan

+0

Dlaczego zamknięcie stanu niezmiennego nie byłoby bezpieczne? –

+0

1) Nie sądzę, aby unikanie (lokalnego) stanu za wszelką cenę było rozsądne - proszę oświecić mnie, jeśli czegoś brakuje - i 2) nie byłoby ładniej używać anonimowej (częściowej) funkcji z 'kontekstem. stać się "zamiast metody? –

Odpowiedz

12

O ile wiem, ta technika jest dobra i powinna być dobra do użycia. W rzeczywistości jest to bardziej sprytny sposób na obejście konieczności posiadania zmiennego kodu var response. Wykorzystałem tę technikę w odpowiedzi na pytanie: here, a Viktor z zespołu Akka uznał, że to dobre rozwiązanie. Jedną rzeczą, można zmienić:

def receiveWithCache(cachedResponse:R): PartialFunction[Any,Unit] = { 
    case GetCommand => sender ! cachedResponse 
    case InvalidateCache => context.unbecome 
} 

do:

def receiveWithCache(cachedResponse:R): Receive = { 
    case GetCommand => sender ! cachedResponse 
    case InvalidateCache => context.unbecome 
} 

Typ Receive jest skróconym alias PartialFunction[Any,Unit].

+5

Jest to nawet zalecany sposób robienia tego. Aby rozwinąć pytanie: 'stań się' nie opuszcza kontekstu aktora, więc jest całkowicie bezpieczny, nawet dla stanu zmiennego. –

Powiązane problemy