2016-12-10 4 views
0

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?

Antwort

1

Die bindActor Methode kommentiert Ihre ActorRef mit einem Namen - der Name des actorRef selbst.

Können Sie versuchen, die @Named Annotation zu verwenden?

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

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

+1

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. –

+0

Hmmm. . . so scheint es, dass Schauspieler nur durch ihren Namen und nicht durch ihre Klasse identifizierbar sind. – dotslash

Verwandte Themen