- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试实现 "Up and Running" example 的 Java 版本摘自曼宁的《Akka in Action》一书。它是一个基于 Actor 模型的简单 Http 服务器,用于保存(仅在内存中)和检索一些事件。我保存事件没有问题。但在查询我的 Actor 系统中的事件(所有事件)时,我确实遇到了问题。
这是 BoxOffice
的相关代码(我用三个点代替了我认为与我的问题无关的代码) - 所有 TicketSeller
的父角色>s(稍后负责管理每个事件的状态)。
public class BoxOffice extends AbstractActor {
...
private Timeout timeout;
final static String NAME = "boxOffice";
//create child actors
private ActorRef createTicketSeller(String name) {
return getContext().actorOf(TicketSeller.props(name));
}
public BoxOffice(Timeout timeout) {
this.timeout = timeout;
}
//the only method of an actor
@Override
public Receive createReceive() {
return receiveBuilder()
...
...
.match(GetEvent.class, this::receiveMsgGetEvent)
.match(GetEvents.class, this::receiveMsgGetEvents)
...
.build();
}
...
private void receiveMsgGetEvent(GetEvent getEvent) {
Optional<ActorRef> maybeChild = getChildByName(getEvent.getName());
log.info(String.format("Asking for event %s. Child is present: %s", getEvent.getName(), maybeChild.isPresent()));
OptionalConsumer.of(maybeChild)
.ifPresent(child -> child.forward(new TicketSeller.GetEvent(), getContext()))
.ifNotPresent(() -> getSender().tell(Optional.empty(), getSelf()));
}
private void receiveMsgGetEvents(GetEvents getEvents) {
//ask self() for each of the passed-in event
List<CompletableFuture<Optional<Event>>> listFutureMaybeEvent =
allChildrenStream()
.map(child ->
ask(getSelf(), new GetEvent(child.path().name()), timeout)
.thenApply(obj -> (Optional<Event>) obj)
.toCompletableFuture())
.collect(toList());
CompletableFuture<Events> eventsFuture = toFutureEvents(listFutureMaybeEvent);
pipe(eventsFuture, getContext().dispatcher()).to(sender());
}
private Stream<ActorRef> allChildrenStream() {
return StreamSupport.stream(getContext().getChildren().spliterator(), false);
}
...
private CompletableFuture<Events> toFutureEvents(List<CompletableFuture<Optional<Event>>> futurePossibleEvents) {
List<Event> events = futurePossibleEvents.stream()
.map(CompletableFuture::join)
.filter(Optional::isPresent)
.map(Optional::get)
.collect(toList());
return CompletableFuture.supplyAsync(() -> new Events(events));
}
...
private Optional<ActorRef> getChildByName(String name) {
return getContext().findChild(name);
}
static Props props(Timeout timeout) {
return Props.create(BoxOffice.class, () -> new BoxOffice(timeout));
}
基本上发生的情况是,在 receiveMsgGetEvents
中,我向 self
发送一条包含子名称 child.path.name
的消息。但是,当我收到该消息(分别在 receiveMsgGetEvent
中)时,无法按该名称找到子 actor:
INFO [BoxOffice]: Asking for event $a. Child is present: false
此外,值得注意的是,GetEvent
的发送和由同一个 actor 接收之间需要很长的时间(比如几秒,但我的感觉不到 20)。
问题可能是由于我的 CompletableFutures
操作造成的,但我尝试重现 Scala 等效代码。
上面的信息日志以及此消息:
INFO [DeadLetterActorRef]: Message [java.util.Optional] from Actor[akka://mycompanyAkkaDemo/user/boxOffice#1554115585] to Actor[akka://mycompanyAkkaDemo/deadLetters] was not delivered. [1] dead letters encountered. This logging...
在堆栈跟踪之后打印,堆栈跟踪在配置的超时(20 秒)后打印:
ERROR [ActorSystemImpl]: Error during processing of request: 'Ask timed out on [Actor[akka://mycompanyAkkaDemo/user/boxOffice#1554115585]] after [20000 ms]. Sender[null] sent message of type "com.mycompany.demo.messages.boxoffice.GetEvents".'. Completing with 500 Internal Server Error response. To change default exception handling behavior, provide a custom ExceptionHandler.
akka.pattern.AskTimeoutException: Ask timed out on [Actor[akka://mycompanyAkkaDemo/user/boxOffice#1554115585]] after [20000 ms]. Sender[null] sent message of type "com.mycompany.demo.messages.boxoffice.GetEvents".
at akka.pattern.PromiseActorRef$.$anonfun$defaultOnTimeout$1(AskSupport.scala:595)
at akka.pattern.PromiseActorRef$.$anonfun$apply$1(AskSupport.scala:605)
at akka.actor.Scheduler$$anon$4.run(Scheduler.scala:140)
...
at java.lang.Thread.run(Thread.java:748)
ERROR [OneForOneStrategy]: akka.pattern.AskTimeoutException: Ask timed out on [Actor[akka://mycompanyAkkaDemo/user/boxOffice#1554115585]] after [20000 ms]. Sender[null] sent message of type "com.mycompany.demo.messages.boxoffice.GetEvent".
java.util.concurrent.CompletionException: akka.pattern.AskTimeoutException: Ask timed out on [Actor[akka://mycompanyAkkaDemo/user/boxOffice#1554115585]] after [20000 ms]. Sender[null] sent message of type "com.mycompany.demo.messages.boxoffice.GetEvent".
at java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:292)
at java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:308)
at java.util.concurrent.CompletableFuture.uniApply(CompletableFuture.java:593)
...
Caused by: akka.pattern.AskTimeoutException: Ask timed out on [Actor[akka://mycompanyAkkaDemo/user/boxOffice#1554115585]] after [20000 ms]. Sender[null] sent message of type "com.mycompany.demo.messages.boxoffice.GetEvent".
at akka.pattern.PromiseActorRef$.$anonfun$defaultOnTimeout$1(AskSupport.scala:595)
... 11 common frames omitted
最佳答案
这里的问题是调度程序发生阻塞。
在 JVM 上,线程由操作系统线程支持,这在内存和进程调度程序开销方面都很昂贵。 Akka 的优点之一是它允许您在较少数量的线程上运行多个 Actor,从而更有效地使用线程。
这很棒,但确实意味着您永远不应该在 actor 内执行阻塞调用。此处的 CompletableFuture::join
调用处于阻塞状态,这可能是导致您出现问题的原因。
通过避免阻塞调用并使用异步 API(例如 CompletableFuture.allOf
),您的问题应该会消失。
关于java - Akka:询问时丢失了 `child.path.name` 的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54976829/
我有一个名为 Driver 的表。日期数据类型中有一个名为birthDate 的列。输入为“1995-05-18”YEAR-MONTH-DATE 我需要查询列出 1950 年、1960 年、1970
我只是想知道是否所有浏览器都支持 DELETE 语句,例如: delete myObj; 我只想 100% 确定是否所有浏览器都支持这个?还有没有浏览器或移动电话不支持? 最佳答案 Mozilla's
我想这样做,但到目前为止,我所拥有的只是: print("Will you go out with me?") 我希望代码能够正常工作,以便人们可以回答“是/否”,如果回答是"is",则将返回一条消息
检查 SPARQL 资源是否存在的好方法是什么? 我正在寻找相当于向例如发射 HTTP GET 请求的方法http://dbpedia.org/resource/Game_of_Thrones并检查
this is my code and in the last part,msgrecv does not accept the messages from the queue accourding
我正在使用 TinyMCE 5。我定义了一个 image_list,我需要在页面其他地方操作图像时动态更改它。为此,我先调用 tinymce.remove(),然后调用 tinyme.init(),使
我想在我的 C 程序中使用以下脚本。用户将能够输入IP。之后我想确定输入是否正确并询问用户 char eingabe; printf("Is that the right input? y/n: ")
我有一个 Java 源代码,我需要它来查询和应用安全策略 [例如申请CWE] 我有几个想法,首先是使用 AST,然后遍历树。其他包括使用正则表达式。除了 AST 或正则表达式之外,还有其他选项可供我用
有没有办法以编程方式询问 c3p0 有多少连接正在使用,或者在池耗尽时记录。 最佳答案 如上面 Austin 评论引用的 URL 所示,您可以使用 JMX 来检查和修改正在运行的 c3p0 Poole
我的 SQL 表遇到了另一个问题,但这次我有更多的表链接在一起。我意识到了什么以及我陷入困境的地方: 我有关于工作、工资、员工的表格。 我已经按照以下条件进行了查询: 我公司工资最高的员工: sele
这个问题不太可能对任何 future 的访客有帮助;它只与一个较小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于全世界的互联网受众。如需帮助使此问题更广泛适用,visit the
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 8 年前。 Improve this qu
询问 MethodInfo 是否接受参数的最有效方法是什么?如果接受,有多少? 我目前的解决方案是:methodInfo.GetParameters().Any() 和 methodInfo.GetP
我为我的应用程序添加了一个文本到语音搜索器,这样我就可以用语音过滤列表,一切正常,唯一的问题是我必须从应用程序的权限选项选项卡中手动接受权限。 我正在使用 speech_recognition为它打包
我有一个使用 FFMPEG 的 sh 脚本从 RTSP 流中拍摄一张照片。 如果连接时间过长,有一个 timeout -stimeout 来终止连接。 (-timeout 是不可能的)。大多数 IP
基本上我想要的是不必每次在 git 中提交时都输入密码。 在寻找解决方案时,我发现了 this . 所以它告诉我在配置文件中设置 default-cache-ttl 和 max-cache-ttl 。
如果 id="e2"被 id="e1"填充,如何填充 id="e3"? 在这里检查实时代码,http://jsfiddle.net/eHEtV/ jQuery(document).ready(func
我有以下代码,它是 PHP 中将用户添加到数据库的函数的一部分。它将用户添加到数据库中。 if($user != '' && $pass != ''){ $new_name_q
我如何实现这段代码: $("ID5").click(function{ $("#Id1,#Id2" + this).hide(); }); 最佳答案 我认为你需要.add() ,它将元素添加到匹
这个问题在这里已经有了答案: Java8 - how to know if daylight savings is on now (1 个回答) 关闭 6 年前。 如何询问 java.time.Zo
我是一名优秀的程序员,十分优秀!