gpt4 book ai didi

java - Akka Remote - 消息未传递(Java)

转载 作者:行者123 更新时间:2023-12-02 06:21:03 25 4
gpt4 key购买 nike

尝试使用 Akka 进行并行计算,但在与 Actor 通信时遇到问题。我有两个不同的参与者(其名称是发送者和接收者),它们在两个不同的系统上工作,在同一 IP 地址的不同端口上工作(其名称是发送者系统和接收者系统)。我想要做的是将消息从发送者 Actor 发送到接收者 Actor 。但在控制台上我看到这样的消息

[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

akka {
loglevel = "INFO"
actor {
provider = "akka.remote.RemoteActorRefProvider"
}
remote {
untrusted-mode = off
enabled-transports = ["akka.remote.netty.tcp"]
netty.tcp {
hostname = "127.0.0.1"
}

}
}

发件人.conf

include "application"
akka {
actor {
deployment {
/receiver {
remote = "akka://ReceiverSystem@127.0.0.1:8091"
}
}
}
remote.netty.tcp.port = 8090
}

接收器.conf

include "application"
akka {
remote.netty.tcp.port = 8091
}

接收器.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());
}
}

发送者.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.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'.

最佳答案

您在发送方配置文件中进行了远程部署,因此您可以从发送方角色远程创建接收方角色

ActorRef actor = system.actorOf(Props.create(Receiver.class), "receiver");
actor.tell(Messages.SEND, ActorRef.noSender());

关于java - Akka Remote - 消息未传递(Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32023537/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com