Guice -Как внедрить зависимость внутри класса, который расширяет Абстрактный модуль - Java - PullRequest
0 голосов
/ 28 июня 2019

Мне нужно вызвать WitcherDriver.startPoller () из EnvironmentModule , поскольку EnvironmentModule выходит из Abstractmodule. Я не уверен, как Внедрить зависимость внутри EnvironmentModule возможно ли это? Если нет, то как мне вызвать WitcherDriver.startPoller () из EnvironmentModule

@Log4j2
@AllArgsConstructor(onConstructor = @__(@Inject))
public class WitcherDriver {

    private ClientTrafficCalculator clientTrafficCalculator;
    private TaskAllocator taskAllocator;


    @SneakyThrows
    public void startPoller() {

        new Thread(ProxyFleetManager::collectProxyIps).start();
        new Thread(clientTrafficCalculator::prepareRateLimiterForAllClients).start();
        new Thread(taskAllocator::processPendingRecordsInDDB).start();
        log.info("All threads are started");

    }

}

Модуль среды

    @Log4j2
    @AllArgsConstructor(onConstructor = @__(@Inject))
    public class EnvironmentModule extends AbstractModule {

        private WitcherDriver witcherDriver;


        @SneakyThrows
        public EnvironmentModule(final String[] args) {

            marketplace = System.getProperty("realm", "USTest");
            final String realm = getPropOrDefault("realm", "USTest");
            final String root = getPropOrDefault("root", ".");
            AppConfig.initialize(SERVICE_NAME, null, appConfigArgs);

            witcherDriver.startPoller(); 

        }

    @Override
    public void configure() {
        install(new TomcatContainerModule(new ServiceModule(Test)));
    }
}

Ожидается:

witcherDriver.startPoller(); // это отлично работает

Текущий результат

witcherDriver.startPoller(); // возникает исключение нулевого указателя, поскольку он не вводится, а witcherDriver равно нулю

1 Ответ

0 голосов
/ 01 июля 2019

Я думаю, что нашел ответ, мы можем сделать что-то, как показано ниже

@Log4j2
public class WitcherDriver extends AbstractModule {


    @Override
    public void configure() {
        requestInjection(this);
    }

    @Inject
    public void startPoller(ClientTrafficCalculator clientTrafficCalculator,
        TaskAllocator taskAllocator, ProxyFleetManager proxyFleetManager) {

        new Thread(proxyFleetManager::collectProxyIps).start();
        new Thread(clientTrafficCalculator::prepareRateLimiterForAllClients).start();
        new Thread(taskAllocator::processPendingRecordsInDDB).start();
        log.info("All threads are started");

        //ProxyFleetManager::collectProxyIps
    }


}

И мы должны установить это, установка вызовет этот метод

install(new WitcherDriver()); //trigger pollers for proxy and task allocation

Спасибо Jk

...