Воспроизведение фреймворка вызова WS внутри запланированных асинхронных задач

Я начинаю использовать игровую среду, я хочу написать задание, которое делает определенное количество вызовов ws.

Я написал 2 класса следующим образом:

@Singleton
public class AutoGateJob {

@Inject
private ActorSystem actorSystem;
@Inject
private ExecutionContext executionContext;
@Inject
private RgsDataServiceServices rgsDataServiceServices;

@Inject
public AutoGateJob(ApplicationLifecycle lifecycle, ActorSystem system, ExecutionContext
    context) {
    Logger.info("### create autojob");
    this.actorSystem = system;
    this.executionContext = context;

    this.initialize();

    lifecycle.addStopHook(() -> {
        Logger.info("### c'est l'heure de rentrer!!!");
        this.actorSystem.shutdown();
        return CompletableFuture.completedFuture(null);
    });
}

private void initialize() {
    this.actorSystem.scheduler().schedule(
        Duration.create(0, TimeUnit.SECONDS), // initialDelay
        Duration.create(5, TimeUnit.SECONDS), // interval
        () -> this.runAutoGateJobTasks(),
        this.executionContext
    );
}

private void runAutoGateJobTasks() {
    Logger.info("## Run job every 5 seconds");
    rgsDataServiceServices = new RgsDataServiceServices();

    rgsDataServiceServices.findAllPaymentToSendHandler()
    .handle((wsResponse, throwable) -> {
        Logger.info("## find all payment to send response: ", wsResponse.asJson());
        List<String> paymentsList = new ArrayList<>();
        paymentsList.forEach(s -> {
            Logger.info("## Processing payment: ", s);
        });
        return CompletableFuture.completedFuture(null);
    });
}

}

а также

public class AutoGateJobInitializer extends AbstractModule {

@Override
protected void configure() {
    Logger.info("## Setup job on app startup!");
    bind(AutoGateJob.class).asEagerSingleton();
}

}

проблема в том, что у Mys rgsDataServiceServices есть работающая инъекция WSClient, которая хорошо работает при использовании с контроллерами, но при вызове в AutoGateJob у меня есть исключение нулевого указателя ( [error] a.d.TaskInvocation - null java.lang.NullPointerException: null ). Я действительно не понимаю, что происходит, но мне нужно, чтобы моя работа вел себя таким образом.

Спасибо за помощь!


person atacraft    schedule 28.09.2017    source источник


Ответы (1)


Вы должны внедрить все свои зависимости в конструктор. То, что вы делаете, это только ввод некоторых в конструктор, затем вы сразу же планируете задачу, которая попытается использовать все зависимости, но есть вероятность, что эта задача будет запущена до того, как Guice внедрит все ваши зависимости. Если вы хотите убедиться, что все ваши зависимости доступны, используйте только внедрение конструктора, то есть:

private final ActorSystem actorSystem;
private final ExecutionContext executionContext;
private final RgsDataServiceServices rgsDataServiceServices;

@Inject
public AutoGateJob(ActorSystem system, ExecutionContext context, RgsDataServiceServices rgsDataServiceServices) {
  Logger.info("### create autojob");
  this.actorSystem = system;
  this.executionContext = context;
  this.rgsDataServiceServices = rgsDataServiceServices

  this.initialize();
}

Кроме того, вам не следует добавлять хук жизненного цикла для отключения системы акторов, Play уже регистрирует хук жизненного цикла для этого. Если вы хотите, вы можете зарегистрировать хук жизненного цикла для отмены запланированной задачи, но я не думаю, что это действительно необходимо, потому что она будет автоматически отменена при завершении работы системы акторов.

person James Roper    schedule 29.09.2017