gpt4 book ai didi

spring - 如何在 quartz 中 Autowiring ?

转载 作者:行者123 更新时间:2023-12-05 03:07:01 28 4
gpt4 key购买 nike

之前我已经将它设置为在 quartz 作业中 Autowiring 。
备注here .

但是,作业内部类的 Autowiring 会失败。

我的工作代码示例在这里。

public class MyJob extends QuartzJobBean {

@Autowired
private Hello hello; //<--- this is suceess!

@Override
public void executeInternal(JobExecutionContext context) {
//...

Do do = new Do();
do.doSomething();

//...
}
}

Do.java

public class Do {
@Autowired
priavte Do2 do2; // <---- ***this is null !***

//...
}

为什么会这样?
怎么解决,应该多了解哪些概念?

最佳答案

Quartz 作业不在与 spring 相同的上下文中运行,因此 Autowiring 的对象在同一类中变为 null。您必须让 Quartz Spring 知道。

首先添加sprint-context-support

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>

然后创建一个应用上下文感知的应用上下文持有者

@Component
public final class ApplicationContextHolder extends SpringBeanJobFactory implements ApplicationContextAware {

private static ApplicationContext context;

private transient AutowireCapableBeanFactory beanFactory;

@Override
public void setApplicationContext(ApplicationContext ctx) throws BeansException {
beanFactory = ctx.getAutowireCapableBeanFactory();
context = ctx;
}

@Override
protected Object createJobInstance(final TriggerFiredBundle bundle) throws Exception {
final Object job = super.createJobInstance(bundle);
beanFactory.autowireBean(job);
return job;
}

public static ApplicationContext getContext() {
return context;
}
}

然后你可以创建你的 Quartz Scheduler 配置类

@Configuration
public class QuartzSchedulerConfiguration {

@Autowired
private ApplicationContext applicationContext;

/**
* Create the job factory bean
* @return Job factory bean
*/
@Bean
public JobFactory jobFactory() {
ApplicationContextHolder jobFactory = new ApplicationContextHolder();
jobFactory.setApplicationContext(applicationContext);
return jobFactory;
}

/**
* Create the Scheduler Factory bean
* @return scheduler factory object
*/
@Bean
public SchedulerFactoryBean schedulerFactory() {
SchedulerFactoryBean factory = new SchedulerFactoryBean();
factory.setAutoStartup(true);
factory.setSchedulerName("My Scheduler");
factory.setOverwriteExistingJobs(true);
factory.setJobFactory(jobFactory());
return factory;
}
}

现在这会将您的 quartz 调度程序置于与 Spring 相同的上下文中,因此您现在可以创建一个 SchedulerService 类。

@Service
public class SchedulerService {

@Autowired
private SchedulerFactoryBean schedulerFactory;

private Scheduler scheduler;

/**
* Initialize the scheduler service
*/
@PostConstruct
private void init() {
scheduler = schedulerFactory.getScheduler();
}
}

现在您可以使用 scheduler 对象创建您的日程表的方法填充此类,当任务被触发时,扩展 Job 的类将通过 spring 感知上下文, Autowiring 的对象将不再为空

要解决后续问题,请实现 ApplicationContextHolder 组件,然后将其 Autowiring 到您的 SchedulerConfig 类中

@Autowire
ApplicationContextHolder holder

@Bean
// injecting SpringLiquibase to ensure liquibase is already initialized and created the quartz tables:
public JobFactory jobFactory(SpringLiquibase springLiquibase) {
AutowiringSpringBeanJobFactory jobFactory = new AutowiringSpringBeanJobFactory();
jobFactory.setApplicationContext(holder);
return jobFactory;
}

关于spring - 如何在 quartz 中 Autowiring ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48577810/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com