java - 如何指定Actor处理来自特定端口的消息

标签 java akka

现在我尝试在一个看起来相当简单的用例中使用 Akka。我想要一个特定的 Actor 来处理我通过 TCP 收到的消息,但我无法实现这一点,并且文档似乎不够清晰。这是我现在拥有的:

Application.conf:

akka {
  actor {
    provider = "akka.remote.RemoteActorRefProvider"
  }
  remote {
    enabled-transports = ["akka.remote.netty.tcp"]
    netty.tcp {
      hostname = "127.0.0.1"
      port = 2552
    }
 }
}

主要

public class Main {
    public static void main(String[] args) {
        ActorSystem system = ActorSystem.create("Server");
        ActorRef a = system.actorOf(Props.create(SampleActor.class), "Messages");
        a.tell("testmessage", a);
    }
}

SampleActor

public class SampleActor extends UntypedActor {

    private final LoggingAdapter log = Logging.getLogger(getContext().system(), this);

    @Override
    public void onReceive(Object msg) {
        log.info("Sample actor: " + msg.toString());
    }
}

但我不知道如何让 SampleActor 处理我在 127.0.0.1:2552 收到的消息。 这是我运行此应用程序并在浏览器中访问 127.0.0.1:2552 一次时得到的输出:

[INFO] [07/22/2014 15:39:50.953] [main] [Remoting] Starting remoting
[INFO] [07/22/2014 15:39:51.086] [main] [Remoting] Remoting started; listening on addresses :[akka.tcp://Server@127.0.0.1:2552]
[INFO] [07/22/2014 15:39:51.087] [main] [Remoting] Remoting now listens on addresses: [akka.tcp://Server@127.0.0.1:2552]
[INFO] [07/22/2014 15:39:51.092] [Server-akka.actor.default-dispatcher-3] [akka://Server/user/Messages] Sample actor: testmessage
[INFO] [07/22/2014 15:39:59.796] [Server-akka.actor.default-dispatcher-3] [akka://Server/system/transports/akkaprotocolmanager.tcp0/akkaProtocol-tcp%3A%2F%2FServer%40127.0.0.1%3A6993-2] Message [akka.remote.transport.AssociationHandle$Disassociated] from Actor[akka://Server/deadLetters] to Actor[akka://Server/system/transports/akkaprotocolmanager.tcp0/akkaProtocol-tcp%3A%2F%2FServer%40127.0.0.1%3A6993-2#455049767] was not delivered. [1] dead letters encountered. This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' and 'akka.log-dead-letters-during-shutdown'.
[INFO] [07/22/2014 15:39:59.797] [Server-akka.actor.default-dispatcher-3] [akka://Server/system/transports/akkaprotocolmanager.tcp0/akkaProtocol-tcp%3A%2F%2FServer%40127.0.0.1%3A6994-1] Message [akka.remote.transport.AssociationHandle$Disassociated] from Actor[akka://Server/deadLetters] to Actor[akka://Server/system/transports/akkaprotocolmanager.tcp0/akkaProtocol-tcp%3A%2F%2FServer%40127.0.0.1%3A6994-1#548527175] was not delivered. [2] dead letters encountered. This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' and 'akka.log-dead-letters-during-shutdown'.
[INFO] [07/22/2014 15:39:59.800] [Server-akka.actor.default-dispatcher-4] [akka://Server/system/transports/akkaprotocolmanager.tcp0/akkaProtocol-tcp%3A%2F%2FServer%40127.0.0.1%3A6995-3] Message [akka.remote.transport.AssociationHandle$Disassociated] from Actor[akka://Server/deadLetters] to Actor[akka://Server/system/transports/akkaprotocolmanager.tcp0/akkaProtocol-tcp%3A%2F%2FServer%40127.0.0.1%3A6995-3#-105273249] was not delivered. [3] dead letters encountered. This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' and 'akka.log-dead-letters-during-shutdown'.
[INFO] [07/22/2014 15:39:59.933] [Server-akka.actor.default-dispatcher-4] [akka://Server/system/transports/akkaprotocolmanager.tcp0/akkaProtocol-tcp%3A%2F%2FServer%40127.0.0.1%3A6996-4] Message [akka.remote.transport.AssociationHandle$Disassociated] from Actor[akka://Server/deadLetters] to Actor[akka://Server/system/transports/akkaprotocolmanager.tcp0/akkaProtocol-tcp%3A%2F%2FServer%40127.0.0.1%3A6996-4#2016773005] was not delivered. [4] dead letters encountered. This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' and 'akka.log-dead-letters-during-shutdown'.
[INFO] [07/22/2014 15:39:59.934] [Server-akka.actor.default-dispatcher-4] [akka://Server/system/transports/akkaprotocolmanager.tcp0/akkaProtocol-tcp%3A%2F%2FServer%40127.0.0.1%3A6997-5] Message [akka.remote.transport.AssociationHandle$Disassociated] from Actor[akka://Server/deadLetters] to Actor[akka://Server/system/transports/akkaprotocolmanager.tcp0/akkaProtocol-tcp%3A%2F%2FServer%40127.0.0.1%3A6997-5#-1053639148] was not delivered. [5] dead letters encountered. This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' and 'akka.log-dead-letters-during-shutdown'.
[INFO] [07/22/2014 15:39:59.936] [Server-akka.actor.default-dispatcher-3] [akka://Server/system/transports/akkaprotocolmanager.tcp0/akkaProtocol-tcp%3A%2F%2FServer%40127.0.0.1%3A6998-6] Message [akka.remote.transport.AssociationHandle$Disassociated] from Actor[akka://Server/deadLetters] to Actor[akka://Server/system/transports/akkaprotocolmanager.tcp0/akkaProtocol-tcp%3A%2F%2FServer%40127.0.0.1%3A6998-6#-1709546418] was not delivered. [6] dead letters encountered. This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' and 'akka.log-dead-letters-during-shutdown'.

我对 Akka 完全陌生,所以我认为我错过了一些非常简单的东西。我将不胜感激任何帮助。

最佳答案

对于远程处理,您需要运行 2 个单独的参与者系统,具有上面指定的配置的服务器和具有以下配置的客户端

这将告诉 Akka,示例参与者已在远程系统上实例化,并将路由相应发送的消息

akka {
  log-dead-letters-during-shutdown = off
  actor {
    provider = "akka.remote.RemoteActorRefProvider"
    deployment {
      /Messages {
        remote = "akka.tcp://Server@127.0.0.1:2553"
      }
    }
  } 
}

关于java - 如何指定Actor处理来自特定端口的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24886529/

相关文章:

java - RMI 服务器与 RMI 注册表

java - 使用java检查模糊图像

java - Amazon EC2 中的 Spot 实例出价策略

scala - akka 集群感知路由器和 akka 集群分片的不同用例?

authentication - Akka 验证OAuth2Async : credentials missing

java - 如何将基于注释的语法转换为原生 AspectJ 语法

java - 无法更改极坐标图中的图例形状和字体

scala - 如何根据类名创建 Akka Actor

playframework - 更新以 Play 2.0.2 - 地址已与 akka 远程角色一起使用

scala - 为什么异常不会停止 Akka Stream 流