没有绑定akka.actor.ActorRef的实现

时间:2016-12-10 13:59:46

标签: java playframework akka

我试图在Java Play Framework(2.5.10)中创建一个用于运行定期任务的actor。但是,当我的应用程序运行时,我收到错误No implementation for akka.actor.ActorRef was bound(本文稍后提供的详细错误消息)。我确定这个错误是非常基本的,但我对整个演员来说都很陌生,而且我很难搞清楚。

这里是绑定调度程序类和actor的类(根级Module.java):

public class Module extends AbstractModule implements AkkaGuiceSupport {

    @Override
    public void configure() {
        // Use the system clock as the default implementation of Clock
        bind(Clock.class).toInstance(Clock.systemDefaultZone());
        // Ask Guice to create an instance of ApplicationTimer when the
        // application starts.
        bind(ApplicationTimer.class).asEagerSingleton();
        // Set AtomicCounter as the implementation for Counter.
        bind(Counter.class).to(AtomicCounter.class);

        // bind the ECWID data importer
        bind(ImportScheduler.class).asEagerSingleton();
        bindActor(UserImportActor.class, UserImportActor.ACTOR_NAME);
    }
}

调度程序类:

@Singleton
public class ImportScheduler {

    @Inject
    public ImportScheduler(final ActorSystem actorSystem, final ActorRef UserImportActor) {
        actorSystem.scheduler().schedule(
                Duration.create(1, TimeUnit.SECONDS),
                Duration.create(1, TimeUnit.SECONDS),
                UserImportActor,
              0,
                actorSystem.dispatcher(),
                UserImportActor
            );
    }
}

最后,演员类:

public class UserImportActor extends UntypedActor  {
    public static final String ACTOR_NAME = "user_import_actor";

    @Override
    public void onReceive(Object message){
        Logger.info("The user import actor was called!");
    }
}

当应用程序运行时,我看到的错误(完整错误太长了 - 我认为前几行就足够了):

! @72bagdfd4 - Internal server error, for (GET) [/] ->

play.api.UnexpectedException: Unexpected exception[CreationException: Unable to create injector, see the following errors:

1) No implementation for akka.actor.ActorRef was bound.
  while locating akka.actor.ActorRef
    for parameter 1 at services.ecwid.db.ImportScheduler.<init>(ImportScheduler.java:12)
  at Module.configure(Module.java:34) (via modules: com.google.inject.util.Modules$OverrideModule -> Module)

知道我错过了什么吗?

1 个答案:

答案 0 :(得分:2)

bindActor方法使用名称注释您的ActorRef - actorRef本身的名称。

您可以尝试使用@Named注释吗?

    @Inject
    public ImportScheduler(final ActorSystem actorSystem, @Named("user_import_actor") ActorRef UserImportActor) {
        ...
    }