【问题标题】:Integrate Akka with Spring in Java web application project under Tomcat7Tomcat7下Java web应用项目中Akka与Spring的集成
【发布时间】:2015-02-01 00:41:06
【问题描述】:

我对将 Actors 注入 bean 很感兴趣,而 Actors 将由 spring 创建。另外,我正在寻找自定义Akka配置文件路径的方法。

我的项目使用Java 7和spring 3.2.5,akka版本是2.3.7。

我阅读了一些文档和指南,指示在我的 spring beans 配置文件中创建 bean 定义,如下所示:

<bean id="system-actor" class="akka.actor.ActorSystem" factory-method="create" destroy-method="shutdown" scope="singleton">
    <constructor-arg value="MyApp" />
</bean>

spring根据默认配置成功创建的系统actor。 问题:

  • 我想根据/WEB-INF/application.conf文件初始化系统actor,我添加了-Dconfig.trace=loads系统属性来调试配置加载,这是输出:

    从类加载器 WebappClassLoader 加载配置 上下文:/MY-APP 委托人:假 存储库: /WEB-INF/classes/ ----------> 父类加载器: org.apache.catalina.loader.StandardClassLoader@992f73 但是没有名为 application.conf 的资源 异常加载application.conf:java.io.IOException:在类路径上找不到资源:application.conf 从类加载器 WebappClassLoader 加载配置 上下文:/MY-APP 委托人:假 存储库: /WEB-INF/classes/ ----------> 父类加载器: org.apache.catalina.loader.StandardClassLoader@992f73 但是没有名为 application.json 的资源 异常加载application.json:java.io.IOException:在类路径上找不到资源:application.json 从类加载器 WebappClassLoader 加载配置 上下文:/MY-APP 委托人:假 存储库: /WEB-INF/classes/ ----------> 父类加载器: org.apache.catalina.loader.StandardClassLoader@992f73 但是没有名为 application.properties 的资源 异常加载application.properties:java.io.IOException:在类路径上找不到资源:application.properties 没有找到带有任何扩展名的“应用程序”(.conf、.json、.properties);但允许缺少“应用程序”。加载尝试的异常应该已经在上面记录了。 从 URL jar:file:/var/work/MY-APP/jakarta-tomcat/webapps/MY-APP/WEB-INF/lib/akka-actor_2.10-2.3.7.jar!/reference.conf 加载配置类加载器 WebappClassLoader 上下文:/MY-APP 委托人:假 存储库: /WEB-INF/classes/ ----------> 父类加载器: org.apache.catalina.loader.StandardClassLoader@992f73

  • 有没有办法将此路径传递给系统参与者 bean?

  • 有没有办法在spring中创建actor bean而不是注入系统actor并使用system.actorOf(Props.create(MyActor.class), "name");?详细的例子会很有帮助。

  • 很多类似问题的答案都指向这篇文章:http://blog.nemccarthy.me/?p=272 但是这个页面离线了,有人知道那里写了什么吗?

【问题讨论】:

    标签: java spring akka


    【解决方案1】:

    第一季度

    您明确定义 conf 文件的存储位置,默认扫描根类路径目录,WEB-INF/classes

    -Dconfig.resource=/dev.conf
    

    第二季度

    按照activator-akka-java-spring 中提出的模式,您可以完全使用该存储库中的代码或使用您自己的自定义逻辑对其进行自定义。 (迟早你会明白为什么需要自定义它)

    您需要记住,扩展需要使用ctx进行初始化

    SpringExtProvider.get(system).initialize(applicationContext);
    

    然后你可以随意包装它,处理简单的演员创建​​:

    ActorRef counter = system.actorOf(
          SpringExtProvider.get(system).props("quartz"), "quartz");
    

    甚至更复杂的单例情况:

    ActorRef quartzCoordinator = getContext().actorOf(ClusterSingletonManager.defaultProps(SpringExtProviderget(getContext().system()).props("quartz"), "quartz",
                    PoisonPill.getInstance(), "core"), "coordinator");
    

    第三季度

    Bounty ;)

    【讨论】:

    • 我添加了配置加载日志,只扫描了WEB-INF/classes。
    • 你是对的,默认只扫描root classpath dir,你可以使用resource props或者extended classpath config
    猜你喜欢
    • 2013-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-23
    • 1970-01-01
    • 2015-01-11
    • 2018-05-17
    • 2011-07-25
    相关资源
    最近更新 更多