2016-12-10 20 views
0

定期的なタスクを実行するためにJava Play Framework(2.5.10)でアクタを作成しようとしています。しかし、アプリケーションが実行されると、エラーNo implementation for akka.actor.ActorRef was bound(詳細なエラーメッセージはこの記事の後半で提供されます)が表示されます。間違いはかなり基本的なものだと確信していますが、私は俳優のすべてのことを初めて知り、それを理解することに問題があります。akka.actor.ActorRefの実装がバインドされていません

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

そして最後に、俳優のクラス:

ここ

は、スケジューラクラスと俳優を結合したクラス(ルートレベル Module.java)です
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

bindActorメソッドは、ActorRefに名前(actorRef自体の名前)を注釈します。

@Named注釈を使用してみることはできますか?

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

名前がなぜ重要か、@ @名前付きの名前はどういうことかまだ分かりませんが、ありがとうございます!これは大きな頭痛を今解決しました。 :-) – dotslash

+1

基本的に、あなたは 'Actor'自体を注入していません、あなたはアクターインスタンスハンドルを注入しています - つまり、' ActorRef'です。重要ではないアプリケーションでは、複数のアクターを飛行させ、それらはすべてActorRefです。 Guiceは '@ Named'アノテーションを使ってこれを行う方法を提供しています。とにかくすべてのActorRefは名前を持ちますので、Guice名にもそれを使用するのは合理的な選択です。 –

+0

Hmmm。 。 。したがって、俳優は、そのクラスによってではなく、その名前によってのみ識別可能であるようです。 – dotslash

関連する問題