简体   繁体   English

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

[英]No implementation for akka.actor.ActorRef was bound

I'm trying to create an actor in Java Play Framework (2.5.10) for running periodic tasks. 我正在尝试在Java Play Framework(2.5.10)中创建一个actor以运行定期任务。 When my application runs, however, I get the error No implementation for akka.actor.ActorRef was bound (detailed error messages provided later in this post). 但是,当我的应用程序运行时,我收到错误No implementation for akka.actor.ActorRef was bound (本文稍后提供的详细错误消息)。 I'm sure the mistake is pretty basic, but I'm new to the whole actors thing and am having trouble figuring it out. 我敢肯定这个错误是很基本的,但是我对整个演员都是陌生的,很难弄清楚。

Here's the class (root-level Module.java ) that binds the scheduler class and the actor: 这是绑定调度程序类和Module.java的类(根级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);
    }
}

The scheduler class: 调度程序类:

@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
            );
    }
}

And finally, the actor class: 最后,演员课:

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

When the application runs, here's the error that I see (the full error is too long - I think the first few lines will suffice): 当应用程序运行时,这是我看到的错误(完整错误太长-我认为前几行就足够了):

! @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)

Any idea what I'm missing? 知道我缺少什么吗?

The bindActor method annotates your ActorRef with a name - the name of the actorRef itself. bindActor方法诠释你的ActorRef一个名字- actorRef本身的名称。

Could you try using the @Named annotation? 您可以尝试使用@Named注释吗?

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM