jac*_*ack 5 spring quartz-scheduler
我使用DAO服务实现Quartz作业,如下所示:
public class InitialFetchFrequenceScheduleJob implements Job
{
@Autowired
private FetchFrequencyService fetchFrequencyService;
@Override
public void execute(JobExecutionContext context) throws JobExecutionException
{
try
{
List<FetchFrequency> frequencies = this.fetchFrequencyService.findAll(FetchFrequency.class);
Run Code Online (Sandbox Code Playgroud)
问题是,当调用execute()方法时,this.fetchFrequencyService.findAll(FetchFrequency.class);将抛出NPE,因为fetchFrequenceService为null.我这里做错了什么?任何回复都非常感谢.谢谢!
P/s我使用的是Quartz 2.1.7
更新:这是FetchFrequencyServiceImpl:
@Service("fetchFrequencyService")
public class FetchFrequencyServiceImpl extends GenericDaoImpl implements FetchFrequencyService
{
}
Run Code Online (Sandbox Code Playgroud)
更新:代码实现作业:
JobDetail job = JobBuilder.newJob(InitialFetchFrequenceScheduleJob.class).build();
Calendar cal = Calendar.getInstance();
cal.add(Calendar.MINUTE, 1);
Trigger trigger = TriggerBuilder.newTrigger().forJob(job).startAt(cal.getTime()).build();
Scheduler scheduler = new StdSchedulerFactory("quartz.properties").getScheduler();
scheduler.start();
scheduler.scheduleJob(job, trigger);
Run Code Online (Sandbox Code Playgroud)
@Autowired将不会在Quartz作业实现中工作,因为它不会被Spring实例化.为了在Quartz作业中掌握Spring管理的bean,您首先应该使用它org.springframework.scheduling.quartz.SchedulerFactoryBean来管理Quartz生命周期.使用此FactoryBean,您可以指定该applicationContextSchedulerContextKey属性以在调度程序上下文中引用提供给Quartz作业的ApplicationContext,例如:
<bean id="scheduler"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="applicationContextSchedulerContextKey" value="applicationContext" />
<!-- additional properties here -->
</bean>
Run Code Online (Sandbox Code Playgroud)
您现在可以ApplicationContext在作业中检索引用,然后从以下位置显式获取bean引用ApplicationContext:
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
ApplicationContext applicationContext = (ApplicationContext) executionContext
.getScheduler().getContext().get("applicationContext");
FetchFrequencyService service = applicationContext.getBean(FetchFrequencyService.class);
// Start using your service.
}
Run Code Online (Sandbox Code Playgroud)
pap*_*tty -1
您必须使用以下注释之一来注释您的类
对于DAO
@存储库
服务
@服务
控制者
@控制器
所以你的服务类应该有下面的注释。
@Service("fetchFrequencyService")
public Class FetchFrequencyService {
}
Run Code Online (Sandbox Code Playgroud)
我认为您需要将应用程序上下文注入 SchedulerFactoryBean
<bean id="scheduler"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean"
lazy-init="false">
<property name="jobFactory">
<bean class="org.springframework.scheduling.quartz.SpringBeanJobFactory" />
</property>
<property name="applicationContextSchedulerContextKey">
<value>applicationContext</value>
</property>
</bean>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8906 次 |
| 最近记录: |