现代Akka DI与Guice

sme*_*eeb 10 java guice akka

这里有Java 8,Guice 4.0和Akka 2.3.9.我试图弄清楚如何使用JSR330样式的@Inject注释来注释我的actor类,然后通过Guice将它们连接起来.

但实际上,我读过的每一篇文章(下面的一些例子)都使用了Scala代码示例,一个犯罪版本的Guice,或者是一个犯罪旧版本的Akka:

因此,给出以下Guice模块:

public interface MyService {
    void doSomething();
}

public class MyServiceImpl implements MyService {
    @Override
    public void doSomething() {
        System.out.println("Something has been done!");
    }
}

public class MyActorSystemModule extends AbstractModule {
    @Override
    public void configure() {
        bind(MyService.class).to(MyServiceImpl.class);
    }
}
Run Code Online (Sandbox Code Playgroud)

并且考虑FizzActor到注入了MyService:

public class FizzActor extends UntypedActor {
    private final MyService myService;

    @Inject
    public FizzActor(MyService myService) {
        super();

        this.myService = myService;
    }

    @Override
    public void onReceive(Object message) {
        // .. Do fizz stuff inside here.
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我问:我如何装配MyActorSystemModule创建实例FizzActor用Java正确注入它们(而不是 Scala!)?

请注意:FizzActor不是演员系统中唯一的演员!

tar*_*sbl 7

使用CreatorActorRef在guice模块的提供者方法中创建s.要区分不同ActorRef类型的不同s,请在提供者方法和注入点上使用注释,就像使用任何guice系统一样.例如,

在你的guice模块中:

@Override
protected void configure() {
    bind(ActorSystem.class).toInstance(ActorSystem.apply());
    bind(FizzService.class).toInstance(new FizzServiceImpl());
}

@Provides @Singleton @Named("fizzActor")
ActorRef serviceActorRef(final ActorSystem system, final FizzService fizzService) {
    return system.actorOf(Props.create(new Creator<Actor>() {
        @Override
        public Actor create() throws Exception {
            return new FizzActor(fizzService);
        }
    }));
}
Run Code Online (Sandbox Code Playgroud)

然后使用actor服务,注入一个特定的ActorRef:

class ClientOfFizzActor {
    @Inject
    ClientOfFizzActor(@Named("fizzActor") ActorRef fizzActorRef) {..}
}
Run Code Online (Sandbox Code Playgroud)

如果Props.create(..)子句是actor类中的静态工厂方法,它看起来更干净.