10

私はこのようなことをしたい。

アクター A :

    actorB ! "info"

     def receive()={
     case _ => {
          println("Remote address is "+ _)

        }
}

アクター B : (これはリモートで展開されます)

def receive()={
 case "info" => {
      sender tell self.path.address.toString

    }

}

文字列 akka://10.4.20.40:2555/slave/user/slaverunner を返してほしい。しかし、私が得るのは akka://slave だけです。リモートホストとポートを取得するにはどうすればよいですか? . アドレス オブジェクトのプロパティ host、port、および hostport は何も返さない

4

4 に答える 4

8

あなたが電話する場合

sender.path.toString

アクターAでは、送信者のアドレスを取得します。したがって、メッセージを送信できる限り、アドレスを別のアクターシステムに渡す必要はありません。

Akkaは、ローカルシステム内のアクターのリモートパスを提供しません。そのためself.path.address.toString、アクターBでは機能しません。

本当にホストとポートをBからAに送信したい場合は、RemoteActorRefProviderを介してにアクセスする必要がありますExtendedActorSystem。これを行う公式の方法は、拡張機能を使用することです。例えば:

class MyExtensionImpl(system: ExtendedActorSystem) extends Extension {
  def address = system.provider match {
    case rarp: RemoteActorRefProvider => rarp.transport.address
    case _ => system.provider.rootPath.address
  }
}

object MyExtension extends ExtensionKey[MyExtensionImpl]

val address = MyExtension(system).address

そして、それはあなたがBとリモートで通信するために必要な正確なアドレスをあなたに与えるでしょう。

RemoteActorRefProvider(このコードはAkka 2.0.xで動作することに注意してください。2.1.xでは、を使用して通過を回避できますsystem.provider.getDefaultAddress

Akkaでは、この方法でアクターアドレスの作成を使用している場合actorForは、ホスト名が完全に一致していることを確認する必要があります。

たとえば、ActorSystemがホストがfoo.bar.comであると判断した場合、リモートホストからに送信されたメッセージを無視します。actorFor("akka://slave@foo:2555/user/slaverunner")

于 2013-01-12T02:49:53.883 に答える
3

最近の akka バージョン (2.1+) では、これを使用します。

class RemoteAddressExtensionImpl(system: ExtendedActorSystem) extends Extension {
  def address = system.provider.getDefaultAddress
}

object RemoteAddressExtension extends ExtensionKey[RemoteAddressExtensionImpl]

val remoteAddr = RemoteAddressExtension(context.system).address
val remotePath = self.path.toStringWithAddress(remoteAddr))

remotePath はあなたが探していたものです:

文字列 akka://10.4.20.40:2555/slave/user/slaverunner を返してほしい

最近の akka バージョン (2.5.3) の場合は、次を使用します。

class RemoteAddressExtensionImpl(system: ExtendedActorSystem) extends Extension {
  def address = system.provider.getDefaultAddress
}

object RemoteAddressExtension extends ExtensionId[RemoteAddressExtensionImpl]
with ExtensionIdProvider {
  override def lookup = RemoteAddressExtension
  override def createExtension(system: ExtendedActorSystem) = new RemoteAddressExtensionImpl(system)
  override def get(system: ActorSystem): RemoteAddressExtensionImpl = super.get(system)
}
于 2014-10-22T10:25:53.997 に答える
1

私はこれを包みましたString

 ConfigString("akka://serversys@127.0.0.1:2552")

使用system.settings:

context.system.settings.config.getValue("akka.actor.deployment.\"/root\".remote")

アクターは、「アクターが死んでいるかどうかを判断する」に関するメール グループ ディスカッションで Viktor Klang によって提案されたファブリック スキームの「ルート」アクターでした。次のように作成されました。

lazy val rootActor = actorSystem.actorOf(Props[Root], "root")

そこからActorSystem、次のように作成されました。

lazy val actorSystem = ActorSystem("serversys", ConfigFactory.parseString(""" 
akka {
  loglevel = "DEBUG"
  actor {
    provider = "akka.remote.RemoteActorRefProvider"
  }
  remote {
    transport = "akka.remote.netty.NettyRemoteTransport"
  }
}
serverconf {
  include "common"
  akka {
    actor {
      deployment {
        /root {
          remote = "akka://serversys@127.0.0.1:2552"
        }    
      }
    }
    remote {
      netty {
        hostname = "127.0.0.1"
        port = 2552
      }
    }
  }
}
""").getConfig("serverconf"))

私がまだ使用している Akka 2.0.3 を使用して Scala 2.9.2 REPL でテストしました。

Configここのドキュメントを使用して実際の値をアンラップします: http://typesafehub.github.com/config/v0.3.0/

于 2013-01-12T00:35:50.133 に答える
1

アクターシステムの公開アドレスを参照してください。完全な議論を読み、「通常」ホスト/ポートを取得する必要がないことに注意してください。

于 2013-01-12T14:54:12.230 に答える