java - akka Actor 没有按预期工作

标签 java akka

akka新手来了。目前正在构建一个系统来调用一些 Web 服务并更新数据库...但是 akka actor 没有完全按预期工作...我的代码示例...

应用程序运行器

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

MasterActor

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

ChildActor

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无法将消息发送给其发件人,master...正在获取此错误堆栈...

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

在 child Actor 有机会发送回复之前。请记住,akka 中的所有内容或多或少都是异步的。

添加,例如,

Thread.sleep(someTime);

关机之前查看发送和接收的消息。

关于java - akka Actor 没有按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29308591/

相关文章:

scala - 在 Akka Stream - Scala 中抛出异常的最佳实践是什么?

akka - 如何在 Web 套接字连接中将 react 流中的消息从订阅者发送到发布者

java - 在 Akka 中,从 UntypedActor 中访问配置参数的推荐方法是什么

scala - akka 流 throttle 如何工作?

java - UserTransaction 如何传播?

java - Spring 3MVC : How to store € symbol from form?

Java STM : Questions on Multiverse STM

java - 如何修复 SSLProtocolException : handshake alert: unrecognized_name without disabling SNI

java - Mybatis:将部分SQL映射到POJO内部的HashMap

java - Kotlin 与 Java 嵌套泛型