ไม่สามารถจะส่งข้อความต้องการ akka ทางไกลนักแสดง

0

คำถาม

ฉันยังใหม่กั akka remoting และฉันกำลังพยายามแค่ส่งข้อความไปยังเป็นทางไกลนักแสดงและให้การตอบสนองตอบแทน ฉันต้อง 2 นักแสดงระบบบน localhost-ต่างออกท่าเรือ: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");
    }
}

Worker.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());
    }
}

อาจารย์conf

akka {
  actor {
    provider = "cluster"
  }
  remote {
  transport = ["akka.remote.netty.tcp"]
    netty.tcp {
      hostname = "localhost"
      port = 2551
    }
  }
  
  clustering {
    cluster.name = "MasterSystem"
    role = "master"
  }
 }

งานน่ะครับ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]
akka akka-remoting java
2021-11-22 10:59:44
1

คำตอบที่ดีที่สุด

1

มีหลายปัญหากับรหัสนั่นคุณด้วย ฉันเป็นคนโพสน้อยทำงานเป็นรหัสมอส

ก่อนอื่นคุณกำลังใช้ deprecated เวอร์ชั่น akka.actor.UntypedActor. นี่เป็น deprecated ใน 2.4.0. ถ้าคุณกำลังใช้ maven เปลี่ยน dependencies กว่านี้ละกัน รหัสถูกคอมไพล์แล้วก็วิ่งอยู่ java 11.

สร้างขึ้นsbt

libraryDependencies ++=
  Seq(
    "com.typesafe.akka" %% "akka-actor" % "2.6.17",
    "com.typesafe.akka" %% "akka-remote" % "2.6.17",
  )

สำหรับ provider ผมเคยใช้ remote แทนที่จะเป็น cluster. คุณสามารถใช้ clusterแต่ทำให้แน่ใจว่าคุณเพิ่มจำเป็นต้อง dependencies. การปรับแต่งค่าจะถูกประยุกต์@item text character set โดยการเอาออก repetitions แต่คุณสามารถทำอย่างนั้นอย่างที่คุณสำรวจกันเลย

อาจารย์conf

akka {
  actor {
    provider = "remote"
  }
  remote {
    artery {
      enabled = on
      transport = tcp
      canonical {
        hostname = "127.0.0.1"
        port = 2552
      }
    }
  }
}

งานน่ะครับconf

akka {
  actor {
    provider = "remote"
  }
  remote {
    artery {
      enabled = on
      transport = tcp
      canonical {
        hostname = "127.0.0.1"
        port = 2551
      }
    }
  }
}

MainMaster.java

import akka.actor.AbstractActor;

public class MainMaster extends AbstractActor {
    @Override
    public Receive createReceive() {
        return receiveBuilder()
            .match(
                    String.class,
                    System.out::println)
            .matchAny(o -> System.out.println("received unknown message"))
            .build();
    }
}

Worker.java

public class Worker extends AbstractActor {

    @Override
    public Receive createReceive() {
        return receiveBuilder()
            .match(
                    String.class,
                    msg -> {
                        System.out.println(msg);
                        getSender().tell("Request processed", getSelf());
                    })
            .matchAny(o -> System.out.println("received unknown message"))
            .build();
    }
}

MainWorker.java

public class MainWorker {

    public static void main(String[] args) {
        ActorSystem system = ActorSystem.create("WorkerSystem", ConfigFactory.load("worker.conf"));
        ActorRef actor = system.actorOf(Props.create(Worker.class), "workerActor");
        System.out.println("worker started");
    }
}

Main.java

public class Main {
    public static void main(String[] args) {
        System.out.println("In main");
        ActorSystem system = ActorSystem.create("MasterSystem", ConfigFactory.load("master.conf"));
        ActorRef master = system.actorOf(Props.create(MainMaster.class), "master");

        ActorSelection remoteActor = system.actorSelection("akka://[email protected]:2551/user/workerActor");
        remoteActor.tell("Hello Worker", master);
    }
}
2021-11-22 17:59:51

ขอบคุณสำหรับตอบกลับ. หนึ่งคำถามถึงแม้ว่า;เมื่อคื WorkerSystem กสร้างขึ้น? ผมมองไม่เห็น MainWorker วัตถุถูกสร้างขึ้นที่ไหนทั้งนั้น
Deepika Vemuri

การระบบทางไกล,นายควรพิจารณาเรื่องการ MainWorker แล้ว Main ที่แยกออกโปรแกรมและวิ่งหนีตกลงตามนั้น อยู่ในนี้เฉพาะคดีหนีไป MainWorker คนแรกตามด้วย Main ดังนั้นนั่นเป็นตัวอย่างของ Worker เป็นสามารถใช้ถอกันคืนพร้อมใช้งานสำหรับค้นหาจาก Main.
Johny T Koshy

โชคไม่ดีฉันยังคงกำลังตายแล้วเจอจดหมาย'ข้อความไว้ ฉันพยายามสร้างค workerActor ใน Main.java แล้ว ActorSelection remoteActor = system1.actorSelection("akka://WorkerSystem/user/workerActor"); ทำงานได้ แต่ ActorSelection remoteActor = system.actorSelection("akka://[email protected]:2551/user/workerActor"); ไม่.
Deepika Vemuri

ถ้า MainWorker ไม่ใช่แล้ววิ่งหนีตอนที่คุณเริ่มต้น Mainคุณจะได้ข้อความนั้น โปรดตรวจสอบว่าเป็นอย่างนั้น.
Johny T Koshy

แล้วก็นี่ ActorRef actor = system1.actorOf(Props.create(Worker.class), "workerActor"); System.out.println(actor.path().address().host()); จะได้ไม่เลย
Deepika Vemuri

คุณสามารถแสดงปรับปรุงแฟ้มโครงสร้างและแฟ้มใน github?
Johny T Koshy


worker.conf แล้ว master.conf คือภายใต้ resources/configs. พวกเขาเข้าไปหา ActorSystem การสร้างโดยใช้ ActorSystem.create("MasterSystem", ConfigFactory.load("master.conf"));. วาง conf แฟ้มอยู่ resources โฟลเดอร์,มันควรจะทำงาน
Johny T Koshy

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................