2013-05-14 69 views
2

在Java中,onReceive的聲明包含對作爲對象的消息的引用。AKKA接收對消息的引用

public void onReceive(Object message) 
{ 
    if(message instanceof MyClass) 
    { 

在斯卡拉但是沒有這樣的參考包括與案件具體

def receive { 
    case "test" => println("ttt") 
} 

是否有斯卡拉訪問接收消息的方式嗎?例如,我想手動將任何未知消息轉發給特定的演員。像

def receive { 
    case "test" => println("ttt") 
    case _ => AnotherActor ! TheMessage 
} 

回答

8

東西是的,這是非常簡單:

def receive { 
    case "test" => println("ttt") 
    case theMessage => AnotherActor ! theMessage 
} 
+0

但是在這種情況下theMessage必須是聲明的情況下類。如果我想要抓住所有可以將未知情況轉發給遠程演員的情況,希望他們有這方面的知識嗎? – 2013-05-14 11:58:04

+1

nope,在這裏它只是一個別名,將捕獲所有未知的案例,而不是類 – 2013-05-14 12:01:15

+0

你是對的,經過測試,它的工作原理。只要我可以標記爲已回答。 – 2013-05-14 12:07:00

0

這將是很好,如果Scala的API有類似sender一個currentMessage。當然,相同的注意事項不適用於closing over the actor's state/methods

例如,如果您的演員回覆了十幾條消息,om-nom-nom建議的方法可能不實用。

這是解決問題的一種方法:

var currentMessage: Any = _ 

object saveMessage extends Receive { 
    def isDefinedAt(x: Any) = { currentMessage = x; false } 
    def apply(x: Any) { throw new UnsupportedOperationException("saveMessage apply") } 
} 

def receive = saveMessage orElse { 
    case Foo(x) => // do something special for Foo 
    case Bar(y) => // something different for Bar 
    case Baz(z) => // something else 
    case Bip(a) => // etc 
    case Bop(b, c) => ....... 
} 

假設上述所有結束了,呼籲在某些時候需要訪問當前消息的常用方法,這可能會派上用場。

但是再次 - 從來沒有關閉currentMessage(我猜測危險是爲什麼它不在當前的API中)。

0

我用這個助手方法(基於sourcedelica)

def extractMessage(msgToReceive: Any => Receive): Receive = { 
    var msg: Any = null 
    new Receive { 
     def isDefinedAt(x: Any) = { 
     msg = x 
     false 
     } 

     def apply(x: Any) { 
     ??? 
     } 
    } orElse msgToReceive(msg) 
    } 

用法:

override def receive = extractMessage(msg => { 
    //your normal receive cases here: 
    case "one thing" => 
    case "another" => 
})