Akka Remote-未传递消息(Java)

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:

试图使用Akka进行并行计算,但在与参与者交流时遇到问题。我有两个不同的参与者(名字是sender和receiver),他们在两个不同的系统上工作,在同一ip地址的不同端口上工作(名字是SenderSystem和receiver System)。我要做的是将消息从发送方参与者发送到接收方参与者。但在控制台上,我看到这样的消息

[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
是远程的。