scala - 在 scalaguice 中急切地初始化单例 Actor

标签 scala akka guice

我想急切地初始化一个单例 actor。我目前执行以下操作,稍后在我的应用启动时获取 Actor 的实例。

`bind[Actor].annotatedWith(Names.named(LockCoordinator.name)).to[LockCoordinator].in[Singleton]`

我试过了 绑定(bind)[Actor].annotatedWith(Names.named(LockCoordinator.name)).to[LockCoordinator].asEagerSingleton()

但在运行时失败

1) Error injecting constructor,   akka.actor.ActorInitializationException:   You cannot create an instance of [LockCoordinator] explicitly using the constructor (new). You have to use one of the 'actorOf' factory methods to create a new actor. See the documentation.

我确实已经为系统创建了一个 eagerSingleton,但不知道如何将它应用于 Actor(不是 ActorRef)

class ActorSystemProvider @Inject() (val config: Config, val injector: Injector) extends Provider[ActorSystem] {
override def get() = {

  val system = ActorSystem(config.getString("mysystem"), config)
  GuiceAkkaExtension(system).initialize(injector)
  system
}
}

是否有一种无样板的方式来实现这一点?因为我想将其应用于 3-4 个其他 Actor

最佳答案

这有帮助吗?

https://gist.github.com/fancellu/e4e8acdc3d7fd3b9d749352f9d6c68e3

import actors.ActorBrowserActor
import com.google.inject.AbstractModule
import play.api.libs.concurrent.AkkaGuiceSupport

class Module extends AbstractModule with AkkaGuiceSupport{
  def configure(): Unit = {
    bindActor[ActorBrowserActor](ActorBrowserActor.NAME, _=>ActorBrowserActor.props)
  }
}

这里我们通过名字注入(inject) Actor

class SampleController @Inject()(implicit system: ActorSystem, val messagesApi: MessagesApi, @Named("actor-browser-actor") actorBrowserActor: ActorRef)
  extends Controller  with I18nSupport{
}

关于scala - 在 scalaguice 中急切地初始化单例 Actor ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29542546/

相关文章:

scala - 为什么 `private val` 和 `private final val` 不同?

scala - 如何从分组数据中获取 Spark 数据帧

java - 在 Java Controller 中检索 play.api.mvc.Request

scala - 如何在 akka actor 中测试公共(public)方法?

java - 如何在 Java 应用程序中使用 TypedActor?

java - 使用 Akka 实现 MapReduce

playframework - @Transactional 如何在 Play! Controller 之外工作?框架?

scala - 使用 Scala Guice 将特征绑定(bind)到对象

scala - 使用喷雾对分块响应使用 Ack

java - 即使获取 204 作为 HTTP 状态代码,实体也不会保存在数据库中