我是 akka 远程处理的新手,我试图简单地向远程参与者发送消息并获得响应作为回报。我在本地主机上有 2 个演员系统 - 不同的端口:MasterSystem 和 WorkerSystem。我在 WorkerSystem 中创建了一个演员,并尝试向其远程地址发送消息。但是我不断收到“遇到死信”的消息!将不胜感激任何帮助。谢谢!
MainMaster.java
package pi_swarm_approx;
import akka.actor.ActorRef;
import akka.actor.ActorSelection;
import akka.actor.ActorSystem;
import akka.actor.UntypedActor;
import com.typesafe.config.ConfigFactory;
public class MainMaster extends UntypedActor{
ActorSystem system;
ActorRef actor;
ActorSelection remoteActor;
public MainMaster() {
system = ActorSystem.create("MasterSystem", ConfigFactory.load("master"));
System.out.println("MasterSystem created");
MainWorker mw = new MainWorker();
System.out.println("MainWorker obj created");
remoteActor = mw.system.actorSelection("akka://WorkerSystem@localhost:2552/user/workerActor");
System.out.println("Remote actor created");
remoteActor.tell("hello", getSelf());
System.out.println("Message sent to remote actor");
}
public void onReceive(Object msg) {
if (msg != null) {
System.out.println("Got it back");
}
else {
unhandled(msg);
getContext().stop(getSelf());
}
}
}
MainWorker.java
package pi_swarm_approx;
import akka.actor.ActorSystem;
import akka.actor.ActorRef;
import com.typesafe.config.ConfigFactory;
import akka.actor.Props;
public class MainWorker {
ActorSystem system;
ActorRef actor;
public MainWorker() {
this.system = ActorSystem.create("WorkerSystem", ConfigFactory.load("worker"));
actor = system.actorOf(Props.create(Worker.class), "workerActor");
}
}
工人.java
package pi_swarm_approx;
import akka.actor.UntypedActor;
public class Worker extends UntypedActor {
public void onReceive(Object msg) {
System.out.println("Worker actor got message");
if (msg != null) {
getSender().tell("Request processed", getSelf());
}
else {
unhandled(msg);
}
getContext().stop(getSelf());
}
}
主配置文件
akka {
actor {
provider = "cluster"
}
remote {
transport = ["akka.remote.netty.tcp"]
netty.tcp {
hostname = "localhost"
port = 2551
}
}
clustering {
cluster.name = "MasterSystem"
role = "master"
}
}
worker.conf
akka {
actor {
provider = "cluster"
deployment {
/workerActor {
remote = "akka.tcp://WorkerSystem@localhost:2552"
}
}
}
输出
In main
MasterSystem created
MainWorker obj created
Remote actor created
Message sent to remote actor
[INFO] [11/22/2021 16:01:34.531] [WorkerSystem-akka.actor.default-dispatcher-5] [akka://WorkerSystem/deadLetters] Message [java.lang.String] from Actor[akka://Main/user/app#402333018] to Actor[akka://WorkerSystem/deadLetters] was not delivered. [1] dead letters encountered. If this is not an expected behavior, then [Actor[akka://WorkerSystem/deadLetters]] may have terminated unexpectedly, This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' and 'akka.log-dead-letters-during-shutdown'.
<=========----> 75% EXECUTING [18s]