私はAkkaを使用してアプリケーションを開発しています。その間、そのような種類のバグは、Actor
のメッセージ宣言に関係しています。どこでメッセージを宣言すればよいですか?受信者のコンパニオンオブジェクトまたは送信者のコンパニオンオブジェクトまたはいくつかの3位に? in the Receiver's Companion objectレシーバがreceive
一部機能を実装し、それがサポートするすべてのメッセージについて知っておく必要があるため:アクターメッセージはどこで宣言されるべきですか?
答えて
アッカ・チームは、メッセージがprops
方法があるべき同じ場所で定義されるべき推奨しています。また、複数の送信者は、受信者によって実装された一連のメッセージを送信できるため、1つの送信者に送信することはできません。
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から:一般的な方法は、俳優は何を知って 、それは非常に簡単になります俳優のコンパニオンオブジェクトに を受け取ることができますどのようなメッセージを宣言することです
それは受け取ることができます。
実際、この例は、異なるアクター間でメッセージタイプを(再)使用できることを示しています。 _command_メッセージを受信側アクターのコンパニオンオブジェクトに入れ、_event_メッセージを他の場所に入れるのは良い方法でしょうか?ここでは 'PingMessage'は' PingActor'のコンパニオンオブジェクトにはありません**。このアクターはこのメッセージを受け取らないためです。適切な場所は、「PongActor」の付随オブジェクトです。 'PongMessage'は、受信する' PingActor'コンパニオンオブジェクトになければなりません。しかし、それはイベント・アイであり、中立的なオブジェクトで定義され、他のアクターからも放出される可能性があります。 – Sebastian
@セバスチャンは私の好みではあまりにも複雑すぎると思う。誰かがすぐに答えられない "どこで"尋ねれば、簡単なルールを使って "仲間の中で"簡単に覚えていて、 "理解している人"のように意味が分かります。これは "それはみんな*プロトコル*"です。 –
@ Konrad'ktoso'Malawski私はあなたのコメントに3つのことが好きです:1.慣習、2.プロトコルと3.オブジェクト/アクターを生き物のように扱う_talking_お互いに。しかし、最初の質問は:_どこでメッセージを宣言すればよいですか?受信者のコンパニオンオブジェクトまたは送信者のコンパニオンオブジェクトでは?_私はあまりにも厳しい場合は申し訳ありませんが、上記の例では、どのオブジェクトで 'PingMessage'と' PongMessage'を宣言するべきか明確ではありません。受け取った 'PongActor'は、彼の_protocol_の' PingMessage'を国際大会で理解する必要がありますか? ;-) – Sebastian
- 1. libgit2 GIT_BUF_INITは宣言されていません。それはどこで宣言されるべきですか?
- 2. SHOULDプロトコルは迅速に宣言されるべきですか?
- 3. クラスフィールドはC++でどのように宣言されるべきですか?
- 4. コード・イグナイターでは、グローバル変数はどこで宣言すべきですか?
- 5. WaitHandle(s)volatileが宣言されるべきですか?
- 6. Classクラスは宣言されています/それを宣言する方法はどこですか?
- 7. ログはどこで宣言されていますか?
- 8. struct vop_vectorはどこで宣言されていますか?
- 9. Switch宣言で型宣言を行うことはできますか?
- 10. EF DbContextを使用したグローバルサービスのHangfire RecurringJobはどこに宣言されるべきです
- 11. Puppetでは、どのノードでpuppetlabs-awsクラスを宣言すべきですか?
- 12. coutはどこに宣言されていますか?
- 13. XDisplayNameはどこに宣言されていますか?
- 14. カタログヘルパーはどこに宣言されていますか?
- 15. これはどのような宣言ですか?
- 16. この関数はなぜ2回宣言されていますか?コールバック関数はどこで宣言されていますか?
- 17. Cの構造体がどこで宣言されているか調べるには?
- 18. Javascriptで配列を宣言するときに従うべきベストプラクティスはどれですか?
- 19. Bison/Flex宣言の混乱...どのように含めるべきですか/どこで宣言しますか?
- 20. IIFEで宣言された変数はどこにありますか?
- 21. インタフェース定義時に例外を宣言するか、宣言するべきではありませんか?
- 22. ここでの宣言はC言語で許可されていません。
- 23. パペット重複宣言:クラス[Mongodb]は既に宣言されています。再宣言できません
- 24. MSDNのC#WCFの例:CalculatorClientはどこで宣言されましたか?
- 25. モジュールの宣言とエクスポートはどのように行うべきですか?
- 26. このクラス宣言で使用されるJavascriptの形式は何ですか?
- 27. ここには何が宣言されていますか?
- 28. var宣言でエラーが予想される宣言
- 29. Swift - 'View Controller'の宣言で期待される宣言
- 30. モデルビューの文字セットはどこで宣言できますか? Zend FrameWork
*「Akkaチームが推奨する」*を展開してください。ウェブページが適切である。 –
私たちはこれをお勧めします:-) Soumyaの答え=> http://doc.akka.io/docs/akka/2.3.8/scala/actors.html#recommended-practicesへのドキュメントへのリンクを追加しました –
ありがとうKonrad! –