java अभिनेता के साथ चालक इंजेक्शन का प्रयोग करके शून्य सूचक फेंकता है




dependency-injection guice (3)

मैं एक सर्वर के क्षेत्र इंजेक्शन पर रिक्त सूचक अपवाद प्राप्त कर रहा हूं जो एक अक्का अभिनेता के रूप में शुरू किया गया है।

अनुसूचित भाग:

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

}

अवतरण वर्ग भाग:

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()) {
    ....
    ....
    ....
    }

}

मैं डेटासेवा के लिए रिक्त हो रहा हूं कृपया मुझे इस पर सलाह दें

धन्यवाद।


आप NullPointerException प्राप्त कर रहे हैं क्योंकि Akka अपने Retriever अभिनेता का प्रस्ताव है और Guice नहीं है आपको अपने उदाहरण का निर्माण करने के लिए मार्गदर्शक को प्राप्त करना होगा और फिर अक्का को देना होगा, 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);
    }
}

ध्यान दें कि produce() को प्रत्येक बार इसे लागू करने के लिए एक नया Actor उदाहरण बनाना होगा , वह उसी उदाहरण को वापस नहीं लौटा सकता है।

फिर आप अपने अभिनेता को रिट्रीवर निर्भरता इंजेक्टर के माध्यम से प्राप्त करने के लिए अक्का प्राप्त कर सकते हैं, उदाहरण के लिए:

ActorRef myActor = Akka.system().actorOf(
    Props.create(RetrieverDependencyInjector.class, injector)
);

अद्यतन करें

मैंने सोचा था कि आप आगे टिप्पणी करते हैं, तो हो सकता है कि आप GenericDependencyInjector को एक GenericDependencyInjector में एक Actor के वर्ग को प्रदान करके एक कंस्ट्रक्टर पैरामीटर प्रदान कर सकें, जो शायद आपको कुछ करने की अनुमति देगा:

Props.create(GenericDependencyInjector.class, injector, Retriever.class)

मैंने यह कोशिश नहीं की है, लेकिन यह आपको एक प्रारंभिक बिंदु दे सकता है


जिनके लिए यह आवश्यक है:

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

}

तथा

Akka.system().actorOf(Props.create(GuiceInjectedActor.class, INJECTOR,Retreiver.class))

बस...!!!


अन्य तरीकों से हो सकता है, उदाहरण के लिए, आप बूट या कुछ इंजेक्टर-होल्डर-श्रेणी में एक स्थिर इंजेक्टर हैंडल डाल सकते हैं, और जब आप एंट्री बनाते हैं, तो इनहेरिट की गई विधि कॉल करके: प्रीस्टार्ट ()

public class Retreiver extends UntypedActor {

    private Logger.ALogger log = Logger.of(Retreiver .class);

    @Override
    public void preStart () {
        super.preStart ();
        Boot.injector.injectMembers (this);
        //Some-Injector-holder.injectMembers (this);
    }

    @Inject
    private myDataService dataService;

    @Override
    public void onReceive(Object arg0) throws Exception {

        if (0 != dataService.getDataCount()) {
        ....
        ....
        ....
        }
    }

और यह भी, आप अभिनेता में अन्तःप्रतिकृत चिकित्सक के दायरे में इंजेक्टर द्वारा अभिनेता को प्रारंभ करने के लिए अभिनेता प्रदाता में इंजेक्टर को इंजेक्ट कर सकते हैं:

public class InjectingActorProvider implements Provider<ActorRef> {
    @Inject
    private Injector injector;

    @SuppressWarnings("serial")
    @Override
    public final ActorRef get() {
            Props props = new Props(new UntypedActorFactory() {
                @Override
                public Actor create() {
                    return injector.getInstance(actorClass);
                }
            });

            props = props.withRouter(...);
            props = props.withDispatcher(...);
            actor = system.actorOf(props, actorName);
            return actor;
    }
}






actor