gpt4 book ai didi

java - Spring 启动: Use @Autowired within a Quartz Job

转载 作者:行者123 更新时间:2023-12-01 18:04:37 24 4
gpt4 key购买 nike

我成功地在 Spring Boot(版本 4.2.5)中使用 JobStoreTX 持久存储来配置和调度 Quartz 作业。这是我安排工作的方式。第一:

public class MyJob implements Job{
@Autowired
IService service;

@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
service.doSomething();
}
}

@Autowired 似乎在 Quartz 作业实现中不起作用,因为它不会被 Spring 实例化。因此,我面临着著名的 JavaNullPointerException。

其次,为了在 Quartz 作业中获取 Spring 管理的 bean,我使用 org.springframework.scheduling.quartz.SchedulerFactoryBean 来管理 Quartz 生命周期:

public class MyJob implements Job{

@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
try {
ApplicationContext applicationContext = (ApplicationContext) context.getScheduler().getContext().get("applicationContext");
IService service= applicationContext.getBean(IService.class);
service.getManualMaxConfig();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}

然后:

<bean id="scheduler"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="applicationContextSchedulerContextKey" value="applicationContext" />

</bean>

不幸的消息是我也面临着JavaNPE。我也尝试了这些建议,但徒劳..

LINK

我做的事情有什么问题吗?

更新 1:在尝试注入(inject)服务之前,我尝试按照 @ritesh.garg 的建议传递一些参数。

public class MyJob implements Job{

private String someParam;
private int someParam2;

public void setSomeParam(String someParam) {
this.someParam = someParam;
}


public void setSomeParam2(int someParam2) {
this.someParam2 = someParam2;
}

@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("My job is running with "+someParam+' '+someParam2);
}
}

我的 jobBean.xml 看起来像:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

<bean id="scheduler"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="applicationContextSchedulerContextKey" value="applicationContext" />

</bean>


<bean id="myJob" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass" value="com.quartz.service.MyJob"/>
<property name="jobDataAsMap">
<map>
<entry key="someParam" value="some value"/>
<entry key="someParam2" value="1"/>
</map>
</property>
</bean>

</beans>

我不知道为什么,但参数没有传递并且打印:

我的作业正在以 null 0 运行

Ps:我将 jobBean.xml 导入到 Application.java 中。所以我不知道我错过了什么?

更新 2:这是我的详细代码:

@Component
public class JobScheduler{
Timer timer = new Timer();
@PostConstruct
public void distributeAutomaticConf(){
try {
timer.schedule(new ServiceImpl(), 10000);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

服务实现:

@Transactional
@Component
public class ServiceImpl extends TimerTask implements IService{

@Override
public void run() {
final SchedulerFactory factory = new StdSchedulerFactory();
Scheduler scheduler = null;

try {
scheduler = factory.getScheduler();


final JobDetailImpl jobDetail = new JobDetailImpl();
jobDetail.setName("My job executed only once.. ");
jobDetail.setJobClass(MyJob.class);

SimpleTrigger trigger = (SimpleTrigger) newTrigger()
.withIdentity("trigger_", "group_")
.build();
scheduler.start();
scheduler.scheduleJob(jobDetail, trigger);

System.in.read();
if (scheduler != null) {
scheduler.shutdown();
}
} catch (final SchedulerException e) {
e.printStackTrace();
} catch (final IOException e) {
e.printStackTrace();
}
}
}

我的工作:

public class MyJob extends QuartzJobBean{

@Autowired
IService service;
@Override
protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException { SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
service.doSomething();
}
}

jobBean.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

<bean id="scheduler"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="applicationContextSchedulerContextKey" value="applicationContext" />

</bean>


<bean id="myJob" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass" value="com.quartz.service.MyJob"/>
<property name="jobDataAsMap">
<map>
<entry key="someParam" value="some value"/>
<entry key="someParam2" value="1"/>
</map>
</property>
</bean>

</beans>

quartz 属性:

org.quartz.scheduler.instanceName = DefaultQuartzScheduler
org.quartz.scheduler.rmi.export = false
org.quartz.scheduler.rmi.proxy = false
org.quartz.scheduler.wrapJobExecutionInUserTransaction = false
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 10
org.quartz.threadPool.threadPriority = 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true

org.quartz.jobStore.misfireThreshold = 60000

org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
#org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.dataSource = myDS
org.quartz.jobStore.tablePrefix = QRTZ_

org.quartz.dataSource.myDS.driver = org.postgresql.Driver
org.quartz.dataSource.myDS.URL = jdbc:postgresql://localhost:5432/myDB
org.quartz.dataSource.myDS.user = admin
org.quartz.dataSource.myDS.password = admin
org.quartz.dataSource.myDS.maxConnections = 10

org.quartz.scheduler.skipUpdateCheck=true

控制台:

java.lang.NullPointerException: null
at com.quartz.service.MyJob.executeInternal(MyJob.java:27) ~[classes/:na]
at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:113) ~[spring-context-support-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at org.quartz.core.JobRunShell.run(JobRunShell.java:202) ~[quartz-2.2.1.jar:na]
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) [quartz-2.2.1.jar:na]

2016-06-05 11:35:16.839 ERROR 25452 --- [eduler_Worker-1] org.quartz.core.ErrorLogger : Job (DEFAULT.My job executed only once.. threw an exception.

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.quartz.service.MyJob.executeInternal(MyJob.java:27) ~[classes/:na]
at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:113) ~[spring-context-support-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at org.quartz.core.JobRunShell.run(JobRunShell.java:202) ~[quartz-2.2.1.jar:na]
... 1 common frames omitted

最佳答案

我过去也遇到过同样的问题。我对这个问题的理解是,在 spring 上下文中实例化的 beans 不能简单地通过使用 @Autowired 注解注入(inject)到quartz 上下文中。

我设法通过使用基于setter的依赖注入(inject)来解决这个问题。但您在原始帖子中添加的“链接”中也提到了同样的内容。

粘贴链接中的相关信息:

更新:implements Job替换为extends QuartzJobBean

public class MyJob extends QuartzJobBean {
private String someParam;
private int someParam2;

public void setSomeParam(String someParam) {
this.someParam = someParam;
}

public void setSomeParam2(String someParam2) {
this.someParam2 = someParam2;
}

@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("My job is running with "+someParam+' '+someParam2);
}
}

这里,someParam 和 someParam2 是通过 setter 依赖注入(inject)注入(inject)的。现在完成此操作的另一部分是在 jobDataAsMap

中传递 someParam 和 someParam2
<bean id="myJob" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass" value="com.my.MyJob"/>
<property name="jobDataAsMap">
<map>
<entry key="someParam" value="some value"/>
<entry key="someParam2" value="1"/>
</map>
</property>
</bean>

在您的情况下,它将是 value-ref="IserviceBeanId",而不是条目中的“值”。如果这对你不起作用,我会感到惊讶和好奇。

关于java - Spring 启动: Use @Autowired within a Quartz Job,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37623430/

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