2013-08-27 43 views
1

我創建了一個使用Java + Akka的actor的系統。 特別是,我通過提供onReceive()方法的實現來定義無類型的參與者。非類型化Actor(Java + Akka):重新處理未處理的消息

在該方法中,我通過定義接收消息時要執行的邏輯來實現參與者的行爲。這可能是一些爲:

public void onReceive(Object msg) throws Exception { 
    if(msg instanceof MsgType1){ ... } 
    else if(msg instanceof MsgType2){ ... } 
    else unhandled(msg); 
} 

但是,如果演員有興趣只有一個類型味精? 是否可以實現選擇性接收,以便演員等待某個信息(並且系統會自動重新排隊所有其他類型的信息)?

回答

3

Akka AFAIK不提供此「a la Erlang」消息處理模式。但是,您可以使用Stash來獲得所需的效果。

因此,代碼看起來像這樣

public void onReceive(Object msg) throws Exception { 
    if(msg instanceof MsgType1){ ... } 
    else if(msg instanceof MsgType2){ ... } 
    else stash(); 
} 

在某一點上的消息處理,你會切換到另一種狀態(比如通過調用getContext().become)。您還將執行unstashAll()調用,以便將您忽略的消息重新附加到該位置,然後再回到郵箱。