Bir akka uzak aktörüne mesaj gönderilemiyor

0

Soru

Akka remoting'de yeniyim ve uzaktaki bir aktöre mesaj göndermeye ve karşılığında bir yanıt almaya çalışıyorum. Localhost'ta 2 aktör sistemim var-farklı bağlantı noktaları: MasterSystem ve WorkerSystem. Workersystem'de bir aktör oluşturdum ve uzak adresine bir mesaj göndermeyi denedim. Ama sürekli 'ölü mektuplarla karşılaştım' mesajı alıyorum! Herhangi bir yardım bekleriz. Teşekkürler!

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

Ana işçi.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");
    }
}

İşçi.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());
    }
}

usta.conf

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

işçi.conf

akka {
  actor {
    provider = "cluster"
    deployment {
        /workerActor {
          remote = "akka.tcp://WorkerSystem@localhost:2552"
        }
  }
}

Çıktı

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

En iyi cevabı

1

Gönderdiğiniz kodla ilgili birden çok sorun vardır. Minimal bir çalışma kodu gönderiyorum.

İlk olarak, kullanımdan kaldırılmış bir sürümünü kullanıyorsunuz akka.actor.UntypedActor. Bu kullanımdan kaldırıldı 2.4.0. Eğer kullanıyorsanız maven bağımlılıkları buna göre değiştirin. Kod derlendi ve çalıştırıldı java 11.

inşa etmek.sbt

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

İçin provider Ben kullandım remote yerine cluster. Kullanabilirsiniz cluster ancak gerekli bağımlılıkları eklediğinizden emin olun. Yapılandırma, tekrarları kaldırarak daha da basitleştirilebilir, ancak bunu keşfettikçe yapabilirsiniz.

usta.conf

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

işçi.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();
    }
}

İşçi.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();
    }
}

Ana işçi.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");
    }
}

Ana.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

Teşekkürler cevap için. Yine de bir soru; WorkerSystem ne zaman oluşturulur? Hiçbir yerde bir MainWorker nesnesinin oluşturulduğunu görmüyorum.
Deepika Vemuri

Uzak sistemler olmak, düşünmelisiniz MainWorker ve Main ayrı uygulamalar olarak ve bu şekilde çalışır. Bu özel durumda, çalıştırın MainWorker ilk takip ederek Main yani bu bir örnek Worker başlatıldı ve arama için kullanılabilir Main.
Johny T Koshy

Ne yazık ki, hala 'karşılaşılan ölü mektuplar' mesajını alıyorum. Workeractor'ı oluşturmaya çalıştım Main.java ve ActorSelection remoteActor = system1.actorSelection("akka://WorkerSystem/user/workerActor"); işler. Ama, ActorSelection remoteActor = system.actorSelection("akka://[email protected]:2551/user/workerActor"); değil.
Deepika Vemuri

Eğer MainWorker başlattığınızda zaten çalışmıyor Main mesajı alacaksın. Durumun böyle olup olmadığını kontrol et.
Johny T Koshy

Ayrıca, bu ActorRef actor = system1.actorOf(Props.create(Worker.class), "workerActor"); System.out.println(actor.path().address().host()); hiçbirini döndürmez.
Deepika Vemuri

Güncelleştirilmiş dosya yapısını ve dosyaları github'da gösterebilir misiniz?
Johny T Koshy

Deepika Vemuri

worker.conf ve master.conf altına yerleştirilir resources/configs. Onlar için erişilir ActorSystem kullanarak oluşturma ActorSystem.create("MasterSystem", ConfigFactory.load("master.conf"));. Koy... conf içindeki dosyalar resources klasör, çalışması gerekir
Johny T Koshy

Diğer dillerde

Bu sayfa diğer dillerde

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