2015-01-04 10 views
11

私はAkkaを使用してアプリケーションを開発しています。その間、そのような種類のバグは、Actorのメッセージ宣言に関係しています。どこでメッセージを宣言すればよいですか?受信者のコンパニオンオブジェクトまたは送信者のコンパニオンオブジェクトまたはいくつかの3位に? in the Receiver's Companion objectレシーバがreceive一部機能を実装し、それがサポートするすべてのメッセージについて知っておく必要があるため:アクターメッセージはどこで宣言されるべきですか?

答えて

6

アッカ・チームは、メッセージがprops方法があるべき同じ場所で定義されるべき推奨しています。また、複数の送信者は、受信者によって実装された一連のメッセージを送信できるため、1つの送信者に送信することはできません。

+0

*「Akkaチームが推奨する」*を展開してください。ウェブページが適切である。 –

+3

私たちはこれをお勧めします:-) Soumyaの答え=> http://doc.akka.io/docs/akka/2.3.8/scala/actors.html#recommended-practicesへのドキュメントへのリンクを追加しました –

+0

ありがとうKonrad! –

3

the official Typesafe Activator template activator-akka-scala-seedは、アッカのグッドプラクティスに関するいかなる重要なものである場合は、次のPingActor俳優(テンプレートから直接コピー)に示すように、メッセージはコンパニオンオブジェクトの一部である必要があります:すべての保持

package com.example 

import akka.actor.{Actor, ActorLogging, Props} 

class PingActor extends Actor with ActorLogging { 
    import PingActor._ 

    var counter = 0 
    val pongActor = context.actorOf(PongActor.props, "pongActor") 

    def receive = { 
    case Initialize => 
     log.info("In PingActor - starting ping-pong") 
     pongActor ! PingMessage("ping") 
    case PongActor.PongMessage(text) => 
     log.info("In PingActor - received message: {}", text) 
     counter += 1 
     if (counter == 3) context.system.shutdown() 
     else sender() ! PingMessage("ping") 
    } 
} 

object PingActor { 
    val props = Props[PingActor] 
    case object Initialize 
    case class PingMessage(text: String) 
} 

PingActor俳優が受け入れたメッセージです(PongActor.PongMessageも受け入れていますが、コンパニオンオブジェクトPingActorで定義されていないため、厳密にはそれに従わないことに気づいたかもしれません)。

別の質問How to restrict actor messages to specific types?Viktor saidから:一般的な方法は、俳優は何を知って 、それは非常に簡単になります俳優のコンパニオンオブジェクトに を受け取ることができますどのようなメッセージを宣言することです

それは受け取ることができます。

+1

実際、この例は、異なるアクター間でメッセージタイプを(再)使用できることを示しています。 _command_メッセージを受信側アクターのコンパニオンオブジェクトに入れ、_event_メッセージを他の場所に入れるのは良い方法でしょうか?ここでは 'PingMessage'は' PingActor'のコンパニオンオブジェクトにはありません**。このアクターはこのメッセージを受け取らないためです。適切な場所は、「PongActor」の付随オブジェクトです。 'PongMessage'は、受信する' PingActor'コンパニオンオブジェクトになければなりません。しかし、それはイベント・アイであり、中立的なオブジェクトで定義され、他のアクターからも放出される可能性があります。 – Sebastian

+0

@セバスチャンは私の好みではあまりにも複雑すぎると思う。誰かがすぐに答えられない "どこで"尋ねれば、簡単なルールを使って "仲間の中で"簡単に覚えていて、 "理解している人"のように意味が分かります。これは "それはみんな*プロトコル*"です。 –

+0

@ Konrad'ktoso'Malawski私はあなたのコメントに3つのことが好きです:1.慣習、2.プロトコルと3.オブジェクト/アクターを生き物のように扱う_talking_お互いに。しかし、最初の質問は:_どこでメッセージを宣言すればよいですか?受信者のコンパニオンオブジェクトまたは送信者のコンパニオンオブジェクトでは?_私はあまりにも厳しい場合は申し訳ありませんが、上記の例では、どのオブジェクトで 'PingMessage'と' PongMessage'を宣言するべきか明確ではありません。受け取った 'PongActor'は、彼の_protocol_の' PingMessage'を国際大会で理解する必要がありますか? ;-) – Sebastian

関連する問題