Ich versuche, einen Actor in Java Play Framework (2.5.10) zum Ausführen periodischer Aufgaben zu erstellen. Wenn meine Anwendung jedoch ausgeführt wird, erhalte ich den Fehler No implementation for akka.actor.ActorRef was bound
(ausführliche Fehlermeldungen, die später in diesem Post bereitgestellt werden). Ich bin mir sicher, dass der Fehler ziemlich einfach ist, aber ich bin neu in der Sache mit den Schauspielern und habe Probleme, es herauszufinden.Keine Implementierung für akka.actor.ActorRef wurde gebunden
Hier ist die Klasse (root-Ebene Module.java
), die den Scheduler-Klasse und der Schauspieler bindet:
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);
}
}
Der Planer Klasse:
@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
);
}
}
Und schließlich die Schauspieler Klasse:
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!");
}
}
Wenn die Anwendung ausgeführt wird, ist hier der Fehler, den ich sehe (der vollständige Fehler ist zu lang - Ich denke, die ersten Zeilen werden ausreichen):
! @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)
Irgendeine Idee, was ich vermisse?
Ich verstehe immer noch nicht, warum der Name zählt und was '@ Named' tut, aber vielen Dank! Es löste für jetzt große Kopfschmerzen. :-) – dotslash
Im Grunde injizierst du nicht den 'Actor' selbst, sondern du injizierst den Actor-Instanz-Handle - also den' ActorRef'. In jeder nicht-trivialen Anwendung werden Sie mehrere Schauspieler haben, die herumfliegen, und sie werden alle 'SchauspielerRef's sein. Die einzige Möglichkeit, das gewünschte 'ActorRef' zu injizieren, ist der Name - Guice bietet eine Möglichkeit, dies mit der' @ Named' Annotation zu tun. Alle 'ActorRef's haben sowieso einen Namen, also ist es eine vernünftige Wahl, sie auch für ihren Guice Namen zu verwenden. –
Hmmm. . . so scheint es, dass Schauspieler nur durch ihren Namen und nicht durch ihre Klasse identifizierbar sind. – dotslash