簡體   English   中英

Akka演員沒有按預期工作

[英]akka actors are not working as expected

Akka新手在這里。 目前正在建立一個系統來調用某些Web服務並更新數據庫...但是Akka演員卻無法正常工作...我的代碼示例...

應用亞軍

public class Application
{
  public static void main(String[] args) throws InterruptedException
  {
    ActorSystem system = ActorSystem.create("system");
    ActorRef master = system.actorOf(Props.create(MasterActor.class));
    String url = "http://some-web-service-url";
    master.tell(url, ActorRef.noSender());
    system.shutdown();
  }
}

演員

public class MasterActor extends UntypedActor
{
  private final LoggingAdapter log = Logging.getLogger(getContext().system(), getSelf());
  private final ActorRef childActor = getContext().actorOf(Props.create(ChildActor.class));    

  @Override
  public void onReceive(Object message) throws Exception
  {
    if(message instanceof String)
    {
      childActor.tell(message, getSelf());
    }else if(message instanceof Boolean){
      log.info("all done");
    }else {
      unhandled(message);
    }
  }
}

兒童演員

public class ChildActor extends UntypedActor
{
  private final LoggingAdapter log = Logging.getLogger(getContext().system(), getSelf());

  @Override
  public void onReceive(Object message) throws Exception
  {
    if (message instanceof String) {
      String url = (String) message;
      Integer result = getWebServiceResult(url);
      log.info("result: {}", result);
      getSender().tell(true, getSelf());
    }else {
      unhandled(message);
    }
  }

  private Integer getWebServiceResult(final String url) throws Exception
  {
    ExecutionContextExecutor executor = getContext().dispatcher();
    Future<Integer> future = Futures.future(new Callable<Integer>()
    {
      @Override
      public Integer call() throws Exception
      {
        return new HttpClient().fetchData(url); //some web service call
      }
    }, executor);
    return (Integer) Await.result(future, Duration.create(7000, TimeUnit.SECONDS));
  }
}

但是子actor無法將消息發送給其發件人,主人...正在獲取此錯誤堆棧...

[INFO] [03/28/2015 01:02:45.521] [system-akka.actor.default-dispatcher-3] [akka://system/user/$a/$a] result: TheWebservice Result
[INFO] [03/28/2015 01:02:45.528] [system-akka.actor.default-dispatcher-4] [akka://system/user/$a] Message [java.lang.Boolean] from Actor[akka://system/user/$a/$a#1601481298] to Actor[akka://system/user/$a#1257171720] 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'.

我無法找到問題所在(花了3天的時間)...就我而言,這段代碼應該可以正常工作...您能告訴我我在做什么錯嗎。

提前致謝...

您有比賽條件。 您正在關閉ActorSystem

system.shutdown();

在兒童演員有機會發送答復之前。 請記住,akka或多或少的一切都是異步的。

添加例如

Thread.sleep(someTime);

shutdown之前先查看發送和接收的消息。

只是為了處理出口部分:您可以注冊一個如下所示的關閉鈎子,然后在其中關閉akka系統

   Runtime.getRuntime().addShutdownHook(new Thread() {
            @Override
            public void run() {
                system.shutdown();
            }
        });

然后進入一個永無止境的循環,如下所示,同時等待處理完成,以便在處理完成后,按終端上的Ctrl + C或在代碼內引發System.exit(0)。

while(false == shutdownFlag){
  Thread.sleep(sometime);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM