У меня возникла проблема с использованием Quarz для планирования заданий в приложении Java на основе Spring. Вот мой обычай Job:
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.package.UserService;
@Component
public class ConnectionIntervalJob implements Job {
@Autowired
private UserService userService;
public void execute(JobExecutionContext jExeCtx) throws JobExecutionException {
userService.calculateDelta();
}
}
Мой класс ConnectionScheduler:
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
public class ConnectionScheduler {
public ConnectionScheduler() throws Exception {
Scheduler scheduler = new StdSchedulerFactory().getScheduler();
JobDetail job = JobBuilder
.newJob(com.package.ConnectionIntervalJob.class)
.withIdentity("job1" + (int)Math.floor(Math.random()*10) + 3 , "group1" +(int)Math.floor(Math.random()*10) + 3).build();
Trigger trigger = TriggerBuilder
.newTrigger()
.withIdentity("trigger" +(int)Math.floor(Math.random()*10) + 3, "group1" +(int)Math.floor(Math.random()*10) + 3)
.withSchedule(
SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(20).withRepeatCount(5))
.build();
try {
scheduler.start();
scheduler.scheduleJob(job, trigger);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}
Когда я создаю свой проект с помощью Apache Tomcat 7. Консоль регистрирует некоторые ошибки:
ERROR org.quartz.core.JobRunShell - Job group163.job163 threw an unhandled Exception:
java.lang.NullPointerException
at com.package.jobs.ConnectionIntervalJob.execute(ConnectionIntervalJob.java:18)
at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573)
[DefaultQuartzScheduler_Worker-1] ERROR org.quartz.core.ErrorLogger - Job (group163.job163 threw an exception.
org.quartz.SchedulerException: Job threw an unhandled exception. [See nested exception: java.lang.NullPointerException]
at org.quartz.core.JobRunShell.run(JobRunShell.java:213)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573)
Caused by: java.lang.NullPointerException
at com.pakage.jobs.ConnectionIntervalJob.execute(ConnectionIntervalJob.java:18)
at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
... 1 more
Полагаю, я что-то испортил с именем задания и именем триггера. Из-за этого я решил создать случайную int vale и добавить ее к имени группы и имени триггера, но это не сработало. Я использовал следующую ссылку в качестве ссылки: quarz doc
ОБНОВИТЬ:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<!-- Database Configuration -->
<import resource="DataSource.xml" />
<import resource="hibernate.xml" />
<bean class="com.package7.config.WebSocketConfig" />
<!-- Auto scan the components -->
<context:annotation-config />
<context:component-scan base-package="com.package1.entities" />
<context:component-scan base-package="com.package2.ving.controllers" />
<context:component-scan base-package="com.package3.dao" />
<context:component-scan base-package="com.package4.daoimpl" />
<context:component-scan base-package="com.package5.serviceimpl" />
<context:component-scan base-package="com.package6.jobs" />
Любая помощь приветствуется! Спасибо!
Вы, скорее всего, получаете NPE, потому что кварцевая работа не создается весной, поэтому инъекция не будет работать.
Попробуйте поместить в качестве первой строки метод execute()
.
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
Это гарантирует, что зависимости будут введены в задание.
Изменить. Другой вариант, который у вас есть, - использовать интеграцию Spring-quartz вместо использования чистого кварца.