Akka Remote-未传递消息(Java)
试图使用Akka进行并行计算,但在与参与者交流时遇到问题。我有两个不同的参与者(名字是sender和receiver),他们在两个不同的系统上工作,在同一ip地址的不同端口上工作(名字是SenderSystem和receiver System)。我要做的是将消息从发送方参与者发送到接收方参与者。但在控制台上,我看到这样的消息Akka Remote-未传递消息(Java),java,akka,Java,Akka,试图使用Akka进行并行计算,但在与参与者交流时遇到问题。我有两个不同的参与者(名字是sender和receiver),他们在两个不同的系统上工作,在同一ip地址的不同端口上工作(名字是SenderSystem和receiver System)。我要做的是将消息从发送方参与者发送到接收方参与者。但在控制台上,我看到这样的消息 [INFO] [08/15/2015 12:36:51.645] [SenderSystem-akka.actor.default-dispatcher-4] [akka:
[INFO] [08/15/2015 12:36:51.645] [SenderSystem-akka.actor.default-dispatcher-4] [akka://SenderSystem/sender] Message [com.aliyesilkanat.akkadeneme.Messages$1] from Actor[akka://SenderSystem/deadLetters] to Actor[akka://SenderSystem/sender] 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'.
这里是application.conf
sender.conf
include "application"
akka {
actor {
deployment {
/receiver {
remote = "akka://ReceiverSystem@127.0.0.1:8091"
}
}
}
remote.netty.tcp.port = 8090
}
receiver.conf
include "application"
akka {
remote.netty.tcp.port = 8091
}
Receiver.java
package com.aliyesilkanat.akkadeneme.receiver;
import com.aliyesilkanat.akkadeneme.Messages;
import akka.actor.UntypedActor;
public class Receiver extends UntypedActor {
@Override
public void onReceive(Object msg) throws Exception {
if (msg.equals(Messages.RECEIVE)) {
System.out.println("receiver receives");
}
}
}
ReceiverApplication.java
package com.aliyesilkanat.akkadeneme.receiver;
import akka.actor.ActorRef;
import akka.actor.ActorSystem;
import akka.actor.Props;
import com.typesafe.config.ConfigFactory;
public class ReceiverApplication {
public static void main(String[] args) {
startRecieverSystem();
}
private static void startRecieverSystem() {
final ActorSystem system = ActorSystem.create("ReceiverSystem",
ConfigFactory.load("receiver"));
ActorRef actorOf = system.actorOf(Props.create(Receiver.class),
"receiverActor");
System.out.println("created receiver actor: " + actorOf.toString());
}
}
package com.aliyesilkanat.akkadeneme.sender;
import com.typesafe.config.ConfigFactory;
import akka.actor.ActorRef;
import akka.actor.ActorSystem;
import akka.actor.Props;
public class SenderApplication {
private static ActorSystem system;
public static void main(String[] args) {
startSenderApp();
}
private static void startSenderApp() {
setSystem(ActorSystem.create("SenderSystem",
ConfigFactory.load("sender")));
ActorRef actorOf = getSystem().actorOf(Props.create(Sender.class),
"senderActor");
System.out.println("created sender actor: " + actorOf.toString());
}
public static ActorSystem getSystem() {
return system;
}
public static void setSystem(ActorSystem system) {
SenderApplication.system = system;
}
}
Sender.java
package com.aliyesilkanat.akkadeneme.sender;
import akka.actor.ActorSelection;
import akka.actor.UntypedActor;
import com.aliyesilkanat.akkadeneme.Messages;
public class Sender extends UntypedActor {
public Sender() {
}
@Override
public void onReceive(Object msg) throws Exception {
if (msg.equals(Messages.SEND)) {
System.out.println(getSender() + " sends");
ActorSelection receiverActor = getContext().actorSelection(
"akka.tcp://ReceiverSystem@127.0.0.1:8091/user/receiver"); // I am not sure about this one
receiverActor.tell(Messages.RECEIVE, getSelf());
}
}
}
SenderApplication.java
package com.aliyesilkanat.akkadeneme.receiver;
import akka.actor.ActorRef;
import akka.actor.ActorSystem;
import akka.actor.Props;
import com.typesafe.config.ConfigFactory;
public class ReceiverApplication {
public static void main(String[] args) {
startRecieverSystem();
}
private static void startRecieverSystem() {
final ActorSystem system = ActorSystem.create("ReceiverSystem",
ConfigFactory.load("receiver"));
ActorRef actorOf = system.actorOf(Props.create(Receiver.class),
"receiverActor");
System.out.println("created receiver actor: " + actorOf.toString());
}
}
package com.aliyesilkanat.akkadeneme.sender;
import com.typesafe.config.ConfigFactory;
import akka.actor.ActorRef;
import akka.actor.ActorSystem;
import akka.actor.Props;
public class SenderApplication {
private static ActorSystem system;
public static void main(String[] args) {
startSenderApp();
}
private static void startSenderApp() {
setSystem(ActorSystem.create("SenderSystem",
ConfigFactory.load("sender")));
ActorRef actorOf = getSystem().actorOf(Props.create(Sender.class),
"senderActor");
System.out.println("created sender actor: " + actorOf.toString());
}
public static ActorSystem getSystem() {
return system;
}
public static void setSystem(ActorSystem system) {
SenderApplication.system = system;
}
}
最后是主要方法
public static void main(String[] args) {
ReceiverApplication.main(null);
SenderApplication.main(null);
ActorSystem system = SenderApplication.getSystem();
ActorSelection ref = system.actorSelection("sender");
ref.tell(Messages.SEND, ActorRef.noSender());
}
整个控制台输出
[INFO] [08/15/2015 12:48:12.220] [main] [Remoting] Starting remoting
[INFO] [08/15/2015 12:48:12.451] [main] [Remoting] Remoting started; listening on addresses :[akka.tcp://ReceiverSystem@127.0.0.1:8091]
[INFO] [08/15/2015 12:48:12.451] [main] [Remoting] Remoting now listens on addresses: [akka.tcp://ReceiverSystem@127.0.0.1:8091]
created receiver actor: Actor[akka://ReceiverSystem/user/receiverActor#2084584126]
[INFO] [08/15/2015 12:48:12.481] [main] [Remoting] Starting remoting
[INFO] [08/15/2015 12:48:12.491] [main] [Remoting] Remoting started; listening on addresses :[akka.tcp://SenderSystem@127.0.0.1:8090]
[INFO] [08/15/2015 12:48:12.491] [main] [Remoting] Remoting now listens on addresses: [akka.tcp://SenderSystem@127.0.0.1:8090]
created sender actor: Actor[akka://SenderSystem/user/senderActor#-2012370784]
[INFO] [08/15/2015 12:48:12.491] [SenderSystem-akka.actor.default-dispatcher-3] [akka://SenderSystem/sender] Message [com.aliyesilkanat.akkadeneme.Messages$1] from Actor[akka://SenderSystem/deadLetters] to Actor[akka://SenderSystem/sender] 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'.
当
ActorSystem
是本地(相同的JVM)时,调用是akka://ActorSystem/user/ActorName
。你的主要方法是:
ActorSelection ref = system.actorSelection("sender");
尝试为
akka://SenderSystem/user/senderActor
发送方配置中有远程部署,因此可以从发送方参与者远程创建接收方参与者
ActorRef actor = system.actorOf(Props.create(Receiver.class), "receiver");
actor.tell(Messages.SEND, ActorRef.noSender());
谢谢!但我也弄错了演员的地址。应该是这样的。阿克卡。tcp://ReceiverSystem@127.0.0.1:8091/user/receiverActor
receiverActor
是远程的。