【问题标题】:How to pass behavior to Akka actor如何将行为传递给 Akka 演员
【发布时间】: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/…

标签: scala akka


【解决方案1】:

我不确定您所说的“所以我不能通过演员的构造函数参数传递转换器”是什么意思。使用 spring 你可以使用constructor-arg 元素来提供constructor arguments

如果问题是您必须使用ActorSystem#actorOf 方法创建Actor,一种解决方案是定义您自己的Factory Bean,将ActorSystem 和一些Props 作为构造函数参数并构造您的Actor。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-16
    • 2021-10-27
    • 1970-01-01
    • 2016-05-15
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多