我正在构建一个应用程序在Play框架,必须做一些紧张的文件解析。这种解析包括解析多个文件,最好是并行的。用户上传一个解压的归档文件,文件存储在驱动器上。在该存档中,有一个文件(我们称之为main.csv
),它有多个列。其中一列是归档文件中另一个文件的名称(如subpage1.csv
)。此列可以为空,这样main.csv
中的所有行都没有子页。
现在,我启动一个Akka Actor来解析main.csv文件。在这个actor中,使用@inject
,我有另一个ActorRef
public MainParser extends ActorRef {
@Inject
@Named("subPageParser")
private AcgtorRef subPageParser;
public Receive createReceive() {
...
if (column[3] != null) {
subPageParser.tell(column[3], getSelf());
}
}
}
SubPageParser道具:
public static Props getProps(JPAApi jpaApi) {
return new RoundRobinPool(3).props(Props.create((Class<?>) SubPageParser.class, jpaApi));
}
List<String> names = dao.getNames();
for (String name: names) {
subPageParser.tell(name, null);
}
在本例中,考虑到subpageParser
ActorRef是像以前一样使用Guice@inject获得的,我会进行并行处理吗?
如果我在并行处理,我如何控制正在产生的参与者的数量?如果我有1000个子页,我不想要1000个演员。此外,他们的寿命可能是一个问题。
注意:我有一个像这样的ActorsModule,这样我就可以使用@inject而不是props:
public class ActorsModule extends AbstractModule implements AkkaGuiceSupport {
@Override
protected void configure() {
bindActor(MainParser.class, "mainparser");
Function<Props, Props> props = p -> SubPageParser.getProps();
bindActor(SubPageParser.class, "subPageParser", props);
}
}
更新:我已经修改为使用RoundRobinPool。然而,这并不像预期的那样有效。我指定了3作为实例数,但我为IF中的每个解析请求获取一个新对象。
像您所做的那样注入actor将导致每个mainparser
有一个subpageParser
。虽然您可以向它发送1000封邮件(使用tell
),但这些邮件将被逐个处理,而其他邮件则在邮箱中等待处理。
关于您的设计,您需要知道,像这样注入一个参与者将创建另一个顶级参与者,而不是创建subpageParser
作为子参与者,这将允许父参与者控制和监视它。playframework支持注入子角色,如其文档所述:https://www.playframework.com/documentation/2.6.x/javaakka#dependency-injecting-child-actors
虽然你可以让akka使用一定数量的子演员来分配负载,但我认为你应该质疑为什么你一开始就使用演员。大多数问题都可以用简单的future
来解决。例如,您可以配置一个自定义线程池来运行您的未来
线程池,并让它们在您希望的并行化级别上完成工作:https://www.playframework.com/documentation/2.6.x/threadpools#using-other-thread-pools
例如,我有两个演员——一个家长演员和一个孩子演员。当父级收到消息时,它会产生消息中指定的尽可能多的子角色。如何测试此功能?有没有一种方法可以模拟上下文,或者其他一些方法来检查参与者的创建是否正确和数量是否正确? 更新:基于@Tim answer的解决方案 更改类别: 测试:
我正在尝试在Scala上实现AKKA http和一些Actor。我用Akka创建了一个web应用程序。但我在一个或两个不同的路由上有这个错误/16。(显然是随机的): 服务器无法及时响应您的请求。请稍后再试! 你能给我解释一下为什么和怎么修吗?我对Akka真的是新手。 主类:
参与者可以使用API或命令行添加到参与者库中。 在你开始之前 在你执行这些步骤之前,你在业务网络定义中必须建模一个参与者,并将其部署为业务网络。 下面的过程显示了一个使用以下数字财产范例业务网络定义的参与者模型的示例:digitalproperty-network 请注意:如果你使用composer participant add命令添加参与者,请确保参与者的JSON陈述包裹在单引号中。 name
我开始探索akka-stream API,并希望对其进行测试。我有一个特定的用例,我似乎找不到合适的流式API来使用。 这个想法与以下内容相似,但有一点扭曲: 资料来源(1至10)。mapAsync(num)= 在这种情况下,ask将在未来返回一条消息。我想为发送给参与者的每个请求返回多条消息。例如: ActorRef被发送请求(2) ActorRef从流中发送N条消息。 ActorRef被发送请