2012-05-10 17 views
6

Sto costruendo qualcosa di simile (ma non identico) al modello di domanda in Akka, dove ho bisogno di istanziare un attore temporaneo che ha gestito un singolo messaggio e poi si uccide. Ho implementato il flusso di lavoro di base usando actorOf() una volta per richiesta, ma questo non sembra giusto, poiché registrerà ogni volta un nuovo attore in un nuovo percorso.Come faccio ad attivare correttamente un attore temporaneo in Akka?

Qual è il modo corretto di farlo?

+3

Perché hai bisogno di un attore se è solo una tantum? basta usare un futuro? Futuro ({process (msg)}) (context.dispatcher) pipeTo someOtherActor –

+0

Nel contesto, avevo bisogno che fosse un attore in modo che potessi passarlo come mittente a un altro attore. Il problema più grande potrebbe essere il design che richiede questo, comunque. – SoftMemes

risposta

5

Sembra che sia necessario utilizzare uno future. Per quanto ho capito, i futures Akka si occupano della creazione degli attori & smaltimento per voi; se fai un numero di flatMap più di un futuro, noterai che alcuni eseguono all'interno dello stesso attore, mentre per altri ne viene creato uno nuovo. Per parafrasare spudoratamente la documentazione:

import akka.japi.Function; 
import java.util.concurrent.Callable; 
import akka.dispatch.Futures; 
import akka.dispatch.OnComplete; 

Future<String> f = Futures.future(new Callable<String>() { 
    public String call() { 
    return "Hello" + "World"; 
    } 
}, system.dispatcher()).andThen(new OnComplete<String>() { 
    public void onComplete(Throwable err, String result) { 
     // do something with the err and/or result 
    } 
    }); 
}); 

Suppongo che qualcosa come sopra potrebbe essere sufficiente? Guarda il documento per altri esempi ...

@ viktor-clang potrebbe sapere altrimenti, ma non penso che dovresti preoccuparti particolarmente del numero di attori generati nel caso generale; sono molto più economici da creare rispetto ai thread del sistema operativo.

Problemi correlati