pop*_*der 6 java dependency-injection guice actor akka
我在服务器的字段注入上获得空指针异常,该服务器作为akka actor启动.
计划部分:
private ActorRef myActor = Akka.system().actorOf(
new Props(Retreiver.class));
@Override
public void onStart(Application app) {
log.info("Starting schedular.....!");
Akka.system()
.scheduler()
.schedule(Duration.create(0, TimeUnit.MILLISECONDS),
Duration.create(30, TimeUnit.MINUTES), myActor, "tick",
Akka.system().dispatcher());
}
Run Code Online (Sandbox Code Playgroud)
Retreiver类部分:
public class Retreiver extends UntypedActor {
private Logger.ALogger log = Logger.of(Retreiver .class);
@Inject
private myDataService dataService;
@Override
public void onReceive(Object arg0) throws Exception {
if (0 != dataService.getDataCount()) {
....
....
....
}
Run Code Online (Sandbox Code Playgroud)
}
我为dataService获取null.请就此向我提出建议.
谢谢.
对于任何需要这个的人:
public class GuiceInjectedActor implements IndirectActorProducer {
final Injector injector;
final Class<? extends Actor> actorClass;
public GuiceInjectedActor(Injector injector, Class<? extends Actor> actorClass) {
this.injector = injector;
this.actorClass = actorClass;
}
@Override
public Class<? extends Actor> actorClass() {
return actorClass;
}
@Override
public Actor produce() {
return injector.getInstance(actorClass);
}
Run Code Online (Sandbox Code Playgroud)
}
和
Akka.system().actorOf(Props.create(GuiceInjectedActor.class, INJECTOR,Retreiver.class))
Run Code Online (Sandbox Code Playgroud)
而已...!!!
你得到的是NullPointerException因为Akka正在实例化你的Retriever演员,而不是Guice.您需要让Guice构建您的实例,然后将其传递给Akka,IndirectActorProducer可以帮助您实现此目的,例如:
class RetrieverDependencyInjector implements IndirectActorProducer {
final Injector injector;
public RetrieverDependencyInjector(Injector injector) {
this.injector = injector;
}
@Override
public Class<? extends Actor> actorClass() {
return Retriever.class;
}
@Override
public Retriever produce() {
return injector.getInstance(Retriever.class);
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,每次调用时都produce() 必须创建一个新Actor实例,它不能返回相同的实例.
然后,您可以通过以下方式让Akka检索您的演员RetrieverDependencyInjector:
ActorRef myActor = Akka.system().actorOf(
Props.create(RetrieverDependencyInjector.class, injector)
);
Run Code Online (Sandbox Code Playgroud)
UPDATE
我想你进一步评论,你可以通过提供你想要的类作为构造函数参数来RetrieverDependencyInjector变成一个,这可能会允许你做类似的事情:GenericDependencyInjectorActor
Props.create(GenericDependencyInjector.class, injector, Retriever.class)
Run Code Online (Sandbox Code Playgroud)
我没试过这个,但它可能会给你一个起点.
| 归档时间: |
|
| 查看次数: |
3039 次 |
| 最近记录: |