Кварц выдает необработанное исключение нулевого указателя - PullRequest
0 голосов
/ 14 мая 2018

Итак, у меня установлено 2 планировщика для разных профилей Spring.Когда я запускаю планировщик Spring, все работает нормально, но они хотят, чтобы я реализовал Quartz.

Вот класс задания:

@Profile("quartz")
@Component
public class SampleJob implements Job {

@Autowired
private GetDataServiceQuartz getDataServiceQuartz;

public SampleJob() {
}

public SampleJob(GetDataServiceQuartz getDataServiceQuartz) {
    this.getDataServiceQuartz = getDataServiceQuartz;
}

@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {

    this.getDataServiceQuartz.storeData();
}
}

Выдается ошибка:

org.quartz.SchedulerException: Job threw an unhandled exception.
at org.quartz.core.JobRunShell.run(JobRunShell.java:213) ~[quartz-2.2.1.jar:na]
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) [quartz-2.2.1.jar:na]
Caused by: java.lang.NullPointerException: null
at com.example.blockchaininfo.services.Quartz.SampleJob.execute(SampleJob.java:27) ~[classes/:na]
at org.quartz.core.JobRunShell.run(JobRunShell.java:202) ~[quartz-2.2.1.jar:na]
... 1 common frames omitted

A nullPointerException выдается в этой конкретной строке:

this.getDataServiceQuartz.storeData();

Как только я попытался напечатать this.getDataServiceQuartz, он печатает null.

Класс, который делаетвсе позади работы:

@Slf4j
@Service
@Profile("quartz")
public class GetDataServiceQuartz{

constructorHere();

public void storeData(){

        try {
            String hashrateFromApi = this.getNetworkHashrateFromApi("http://public.turtlenode.io:11898/getinfo");
            OffsetDateTime date = OffsetDateTime.now();

            this.saveNetworkHashrateNewEntity(hashrateFromApi, date);
            this.storePoolDataToDB(this.getPoolsListFromJson(), retrieveNetworkIdForPoolDefinition(date));

        } catch (HttpServerErrorException e){
            log.info("Network Server error e1: " + e);
        } catch (ResourceAccessException e2){
            log.info("Network resource access exception: " + e2);
        } catch (IOException e3) {
            log.info("" + e3);
        } catch (InterruptedException e4){
            log.info("" + e4);
        }
}

...all other methods to acquire stuff.

И Кварцевая конфигурация.

@Override
public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent){

    this.startQuartzScheduling();
}

public void startQuartzScheduling () {

    JobDetail job = JobBuilder.newJob(SampleJob.class)
            .withIdentity("dummyJobName", "group1").build();

    Trigger trigger = TriggerBuilder
            .newTrigger()
            .withIdentity("dummyTriggerName", "group1")
            .withSchedule(
                    SimpleScheduleBuilder.simpleSchedule()
                            .withIntervalInSeconds(5).repeatForever())
            .build();

    try {
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
        scheduler.start();
        scheduler.scheduleJob(job, trigger);
    } catch (SchedulerException e){
        log.info("" + e);
    }
}

Чего мне не хватает?Как правильно внедрить класс, для которого должны быть запланированы его методы?

1 Ответ

0 голосов
/ 14 мая 2018

Я считаю, что это происходит потому, что кварц JobBuilder создает новый экземпляр вашего SampleJob вместо того, чтобы использовать созданный экземпляр с автоматически связанными полями. И так как он использует конструктор по умолчанию, в результате у вас есть nullpointer.

Один из способов исправить это - поместить ваш GetDataServiceQuartz в контекст планировщика.

Описано здесь

Итак, чтобы поставить свои данные, нужно позвонить:

scheduler.getContext().put("getDataServiceQuartz", getDataServiceQuartz);

А при выполнении вашей задачи:

SchedulerContext schedulerContext = jobExecutionContext.getScheduler().getContext();
schedulerContext.get("getDataServiceQuartz");

Другой, на мой взгляд, более удобный способ - установить его на JobDataMap, который будет доступен с вашего SampleJob:

job.getJobDataMap().put("getDataServiceQuartz", getDataServiceQuartz);

При выполнении задания:

context.getJobDetail().getJobDataMap().get("getDataServiceQuartz")

Полный пример можно найти здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...