Java 使用@Inject时的参与者数

Java 使用@Inject时的参与者数,java,playframework,akka,Java,Playframework,Akka,我正在构建一个Play框架中的应用程序,它必须进行一些密集的文件解析。此解析涉及解析多个文件,最好是并行解析。 用户上传一个未压缩的归档文件,文件存储在驱动器上。 在该归档文件中有一个文件(我们称之为main.csv)具有多个列。其中一列是归档文件中另一个文件的名称(如subPage1.csv)。此列可以为空,因此并非main.csv中的所有行都有子页面 现在,我启动一个Akka Actor来解析main.csv文件。在这个actor中,使用@Inject,我有另一个ActorRef publi

我正在构建一个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());
        }
    } 
}
子页面解析器道具:

public static Props getProps(JPAApi jpaApi) {
    return new RoundRobinPool(3).props(Props.create((Class<?>) SubPageParser.class, jpaApi));
}
在这种情况下,考虑到像以前一样使用Guice@Inject获得
子页面解析器
ActorRef,我会进行并行处理吗

如果我并行处理,我如何控制生成的参与者的数量?如果我有1000个子页面,我不想要1000个演员。此外,他们的寿命可能是一个问题

注意: 我有这样一个ActorModule,因此我可以使用@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);
    }
}
公共类ActorModule扩展AbstractModule实现AkkaGuiceSupport{
@凌驾
受保护的void configure(){
bindActor(MainParser.class,“MainParser”);
函数props=p->SubPageParser.getProps();
bindActor(SubPageParser.class,“SubPageParser”,props);
}
}

更新:我已修改为使用RoundRobinPool。然而,这并没有达到预期的效果。我指定了3作为实例数,但我在if中为每个解析请求获取一个新对象。

像您这样注入一个参与者将导致每个
MainParser
有一个
SubPageParser
。虽然您可能会向它发送1000封邮件(使用
告诉
),但它们将被逐个处理,而其他邮件则在邮箱中等待处理

关于您的设计,您需要知道,注入这样一个参与者将创建另一个顶级参与者,而不是将
子页面解析器
创建为子参与者,这将允许父参与者控制和监视它。playframework支持注入儿童角色,如其文档中所述:


虽然你可以让akka使用一定数量的儿童演员来分配负载,但我认为你应该质疑为什么首先要使用演员。大多数问题都可以通过简单的
Future
s解决。例如,您可以配置一个自定义线程池来运行您的
未来的
,并让它们按照您的意愿在并行化级别上完成工作:

像您这样注入一个参与者将导致每个
MainParser
有一个
子页面解析器。虽然您可能会向它发送1000封邮件(使用
告诉
),但它们将被逐个处理,而其他邮件则在邮箱中等待处理

关于您的设计,您需要知道,注入这样一个参与者将创建另一个顶级参与者,而不是将
子页面解析器
创建为子参与者,这将允许父参与者控制和监视它。playframework支持注入儿童角色,如其文档中所述:


虽然你可以让akka使用一定数量的儿童演员来分配负载,但我认为你应该质疑为什么首先要使用演员。大多数问题都可以通过简单的
Future
s解决。例如,您可以配置一个自定义线程池来运行未来的
s,并让它们按照您的意愿在并行化级别上完成工作:

也许他希望能够水平扩展处理并添加更多计算机来执行解析。我的理解是akka可以在多个节点上扩展。谢谢你的回复。我决定使用演员的一个原因是,正如科斯塔提到的,缩放。现在,事实上,一切都在一个单一的服务之下,然而,一旦我完成了基础,我计划让它水平扩展。尽管如此,您的回答还是非常有用,并帮助我更好地理解了事情是如何管理的。仍然有一个问题,但现在是另一个方向。也许他希望能够横向扩展处理,并添加更多的计算机来执行解析。我的理解是akka可以在多个节点上扩展。谢谢你的回复。我决定使用演员的一个原因是,正如科斯塔提到的,缩放。现在,事实上,一切都在一个单一的服务之下,然而,一旦我完成了基础,我计划让它水平扩展。尽管如此,您的回答还是非常有用,并帮助我更好地理解了事情是如何管理的。仍然有问题,但现在是另一个方向。
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);
    }
}