【发布时间】:2015-10-01 23:36:46
【问题描述】:
我正在构建 Akka 应用程序,它将从多个站点检索 RSS 提要 (XML)。对于每个站点,我将创建一些类,它将 XML 转换为一些通用对象(Scala 案例类),其中包含来自所有 RSS 提要的公共字段:
case class RssFeed(title: String, ...)
trait RssTransformer {
def getRssFeed(): Seq[RssFeed]
}
class FooTransformer(...) extends RssTransformer {
override def getRssFeed(): : Seq[RssFeed] = {...}
}
class BarTransformer(...) extends RssTransformer {
override def getRssFeed(): : Seq[RssFeed] = {...}
}
我想创建 Akka 演员并向他们每个人传递一些转换器的实现(例如,一个演员将使用 BarTransformer,另一个演员将使用 FooTransformer 等)。
问题是我使用 DI 框架 (Spring) 来启动 Actor,所以我无法通过 Actor 的构造函数参数传递转换器。唯一的方法是使用一些消息传递它,但消息中的传递行为在 Akka 中是反模式的。
您能否建议我如何解决此问题,或者如果您可以就如何改进应用架构以避免此问题提供一些建议,甚至更好?
谢谢
【问题讨论】:
-
在决定使用哪个变压器时会用到什么样的逻辑?逻辑是基于消息类型还是负载?
-
@nattyddubbs,不,它不会在运行时确定,而是在编译时确定。 IE。我只需要同时从不同站点检索数据(例如,每天一次)。因此,我将在编译时手动创建 5-6 个参与者,并为每个参与者提供一些转换器的实现。我只想概括演员的代码,并将封装的行为传递给它以检索和转换数据。 IE。
BarTransformer将向某个站点发出 HTTP 请求,检索 XML,将其转换为Seq[RssFeed]并返回。所以我的演员将与RssTransformer合作,无论实施如何 -
我想我不太清楚你为什么说
using DI framework ... so I can't pass transformers through an actor's constructor parameters.看起来这正是你希望 DI 框架做的事情。见这里:java-allandsundry.com/2015/05/…