在Tomcat7下的Java Web应用程序项目中将Akka与Spring集成

时间:2014-12-03 12:36:00

标签: java spring akka

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

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

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

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

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

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

    从类加载器WebappClassLoader加载配置   上下文:/ MY-APP   委托:假   库:     的 / WEB-INF /类/ ----------&GT;父类加载器: org.apache.catalina.loader.StandardClassLoader@992f73  但是没有名为application.conf的资源 异常加载application.conf:java.io.IOException:在classpath上找不到资源:application.conf 从类加载器WebappClassLoader加载配置   上下文:/ MY-APP   委托:假   库:     的 / WEB-INF /类/ ----------&GT;父类加载器: org.apache.catalina.loader.StandardClassLoader@992f73  但是没有名为application.json的资源 异常加载application.json:java.io.IOException:在类路径上找不到资源:application.json 从类加载器WebappClassLoader加载配置   上下文:/ MY-APP   委托:假   库:     的 / WEB-INF /类/ ----------&GT;父类加载器: org.apache.catalina.loader.StandardClassLoader@992f73  但是没有名为application.properties的资源 异常加载application.properties:java.io.IOException:在类路径上找不到资源:application.properties 没有找到任何扩展名的“应用程序”(.conf,.json,.properties);但是'申请'被允许丢失。应在上面记录加载尝试的例外情况。 从URL jar加载配置:文件:/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 /类/ ----------&GT;父类加载器: org.apache.catalina.loader.StandardClassLoader@992f73

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

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

  • simillar问题的许多答案都指向了这篇文章:http://blog.nemccarthy.me/?p=272但是这个页面处于脱机状态,有人知道那里写的是什么吗?

1 个答案:

答案 0 :(得分:0)

Q1

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

-Dconfig.resource=/dev.conf

Q2

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

您需要记住,扩展需要使用ctx

进行初始化
SpringExtProvider.get(system).initialize(applicationContext);

然后你可以根据需要包装它,处理简单的actor创建:

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");

Q3

Bounty ;)