[英]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.