2012-11-05 10 views
5

Uso Akka per controllare l'accesso ai processi del sistema in esecuzione.In Akka, posso spoofare un messaggio da un altro attore?

Ho un singolo CommandActor che gestisce le richieste di comando in arrivo da qualsiasi attore nel sistema (chiamiamolo RequestActor) e per ogni nuova richiesta CommandActor genera un attore CmdChildWorker separato per gestire quella particolare richiesta. CommandActor limita inoltre il numero di CmdChildWorkers e assegna un id univoco a ciascuna richiesta, quindi è più complicato di un semplice router.

Al termine del comando e periodicamente durante l'esecuzione del processo di sistema, gli attori CmdChildWorker inviano aggiornamenti periodici al RequestActor originale (ad esempio, l'output del processo fino a quel momento).

Tuttavia, per mantenere un design pulito, speravo che sarei stato in grado di mantenere CmdChildWorker completamente nascosto dal RequestActor originale, con la sua unica interfaccia al singolo CommandActor.

Ovviamente, potrei inviare qualsiasi messaggio di risposta da CmdChildWorker tramite CommandActor, ma mi chiedevo se è possibile rispondere al RequestActor direttamente da CmdChildWorker senza dover instradare il messaggio tramite CommandActor, ma comunque facendo finta che il messaggio sia stato restituito da CommandActor.

I.e. Vorrei spoofare l'indirizzo dei mittenti attori CmdChildWorker per essere quello del suo attore genitore. È possibile? E forse, cosa più importante, è questo design sensibile o buono?

Grazie

risposta

9

vedere il metodo tell su attore. Quando il CommandActor inoltra il suo messaggio, chiamare:

childActor.tell(msg, sender)

e la childActor avrà il suo mittente come mittente originale.

+0

Grazie! Questo risponde al come. Hai una visione se questo è un buon design per attori? –

+0

"buono" è difficile da dire, dal momento che qualcuno può sempre venire con qualcosa di meglio, ma non direi che è affatto male. In realtà, questo è il potere del paradigma dell'attore non tipizzato. Vai con esso fino a quando non è più fantastico. –

+1

Dovresti controllare alcune delle presentazioni dei pattern degli attori. Passare i messaggi ai lavoratori tramite 'tell' con un altro mittente è un modo abbastanza comune per collegare lo" stato "a una transazione. Fondamentalmente costruisci un attore per ricordare lo "stato della sessione" e passargli tutte le informazioni. È responsabile per rispondere alla query originale. Direi che è un buon modello :) – jsuereth

4

Se comprendo correttamente il proprio requisito, è necessario utilizzare in avanti. Da documenti:

È possibile inoltrare un messaggio da un attore a un altro. Ciò significa che l'indirizzo/riferimento del mittente originale viene mantenuto anche se il messaggio sta attraversando un "mediatore". Questo può essere utile quando si scrive attori che funzionano come router, carico-bilanciatori, replicatori ecc

myActor.forward (messaggio)

Problemi correlati