我已经在jHipster服务器中配置了石英作业,它在System.out.println语句中正常工作,但是当我尝试使用与持久性相关的工作时,它给了我一个例外。我已经有了@Autowire JdbcTemplate jdbcTemplate;但是它仍然是空的,原因是当jHipster服务器运行时,它告诉我们:
Scheduler meta-data: Quartz Scheduler (v2.2.1) 'schedulerFactoryBean' with instanceId **'NON_CLUSTERED'**
Scheduler class: 'org.quartz.core.QuartzScheduler' - **running locally**.
NOT STARTED.
Currently in standby mode.
Number of jobs executed: 0
Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads.
Using job-store 'org.quartz.simpl.RAMJobStore' - **which does not support persistence. and is not clustered**.
2017-09-26 10:56:10.523 INFO 10188 --- [ restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler **'schedulerFactoryBean' initialized from an externally provided properties** instance.
2017-09-26 10:56:10.523 INFO 10188 --- [ restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.2.1
2017-09-26 10:56:10.523 INFO 10188 --- [ restartedMain] org.quartz.core.QuartzScheduler : JobFactory set to: org.springframework.scheduling.quartz这些日志是jhipster打印的,请告诉我如何在jdbcTemplet中使用持久性,我不希望打开单独的JDBC连接。如果可能的话,我想使用现有的服务类,但这也会导致错误。
这是我的配置文件和作业文件
@Configuration
@ComponentScan("com.jobs")
public class QuartzJobSchedulerConf {
//http://www.concretepage.com/spring-4/spring-4-quartz-2-scheduler integration-annotation-example-using-javaconfig
//todo make common function for simple jobs to set attributes
//todo make common function for complex jobs to set attributes
@Bean //this is simple job1
public MethodInvokingJobDetailFactoryBean methodInvokingJobDetailFactoryBean() {
MethodInvokingJobDetailFactoryBean obj = new MethodInvokingJobDetailFactoryBean();
obj.setTargetBeanName("jobone");
obj.setTargetMethod("myTask");
return obj;
}
@Bean
public SimpleTriggerFactoryBean simpleTriggerFactoryBean(){
//This trigger will schedule the job after 3 seconds and repeat after every 30 seconds for 3+1 times.
SimpleTriggerFactoryBean stFactory = new SimpleTriggerFactoryBean();
stFactory.setJobDetail(methodInvokingJobDetailFactoryBean().getObject());
stFactory.setStartDelay(3000);
stFactory.setRepeatInterval(30000);
stFactory.setRepeatCount(3);//todo repeat counter remove or use
return stFactory;
}
@Bean //this is simple job2
public MethodInvokingJobDetailFactoryBean methodInvokingJobDetailFactoryBean2() {
MethodInvokingJobDetailFactoryBean obj = new MethodInvokingJobDetailFactoryBean();
obj.setTargetBeanName("jobtwo");
obj.setTargetMethod("myTask");
return obj;
}
@Bean
public SimpleTriggerFactoryBean simpleTriggerFactoryBean2(){
SimpleTriggerFactoryBean stFactory = new SimpleTriggerFactoryBean();
stFactory.setJobDetail(methodInvokingJobDetailFactoryBean2().getObject());
stFactory.setStartDelay(3000);
stFactory.setRepeatInterval(30000);
stFactory.setRepeatCount(3);//todo repeat counter remove or use
return stFactory;
}
@Bean//this is complex job1
public JobDetailFactoryBean jobDetailFactoryBean(){
/*To pass the parameter to job by JavaConfig, we can have setter method and
the property should be configured with setJobDataAsMap() in JobDetailFactoryBean
configuration in JavaConfig*/
JobDetailFactoryBean factory = new JobDetailFactoryBean();
factory.setJobClass(SampleComplexJob.class);
Map<String,Object> map = new HashMap<String,Object>();
map.put("name", "RAM");
map.put(SampleComplexJob.COUNT, 1);
factory.setJobDataAsMap(map);
factory.setGroup("mygroup");
factory.setName("myjob");
return factory;
}
@Bean
public CronTriggerFactoryBean cronTriggerFactoryBean(){
CronTriggerFactoryBean stFactory = new CronTriggerFactoryBean();
stFactory.setJobDetail(jobDetailFactoryBean().getObject());
stFactory.setStartDelay(3000);
stFactory.setName("mytrigger");
stFactory.setGroup("mygroup");
stFactory.setCronExpression("0 0/1 * 1/1 * ? *");
return stFactory;
}
@Bean
public SchedulerFactoryBean schedulerFactoryBean() {
SchedulerFactoryBean scheduler = new SchedulerFactoryBean();
scheduler.setTriggers(simpleTriggerFactoryBean().getObject(),
simpleTriggerFactoryBean2().getObject(),
cronTriggerFactoryBean().getObject());
return scheduler;
}
}有作业类代码
/*If we want to persist the changes in JobDataMap, we will annotate our class by @PersistJobDataAfterExecution */
@PersistJobDataAfterExecution
/*if there is more than one trigger which are scheduling same job then to avoid race condition, we have to annotate our job with @DisallowConcurrentExecution.*/
@DisallowConcurrentExecution
public class SampleComplexJob extends QuartzJobBean {
@Autowired
JdbcTemplate jdbcTemplate;
public static final String COUNT = "count";
private String name;
protected void executeInternal(JobExecutionContext ctx) throws JobExecutionException {
for(String role:findRoleByPrivilegeSQLExample("PRIV_USER_SETTING")){
System.out.println(role);
}
JobDataMap dataMap = ctx.getJobDetail().getJobDataMap();
int cnt = dataMap.getInt(COUNT);
JobKey jobKey = ctx.getJobDetail().getKey();
System.out.println(jobKey+": "+name+": "+ cnt);
cnt++;
dataMap.put(COUNT, cnt);
}
public void setName(String name) {
this.name = name;
}
public List<String> findRoleByPrivilegeSQLExample(String privilege){
///this is SQL example
List<String> rolePrivilegesList = new ArrayList<String>();
if(!privilege.isEmpty()){
StringBuilder sql=new StringBuilder()
.append("SELECT ID_ROLE FROM ROLE_PRIVILEGES WHERE ")
.append("UPPER(ID_PRIVILEGE) = '")
.append(privilege.toUpperCase()).append("'");
rolePrivilegesList = jdbcTemplate.queryForList(sql.toString(),String.class);
}
return rolePrivilegesList;
}
}如果在jHipster中有其他配置Quartz作业的方法,请告诉我。或者,如果jHipster为Scheduler工作提供了开箱即用的功能,那就太棒了。
石英作业依赖性
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>发布于 2017-09-27 07:06:00
1)我的bean没有被自动配置是因为它没有正确地配置。
更新的类QuartzJobSchedulerConf.java
@Configuration
@ComponentScan("com.jobs")
public class QuartzJobSchedulerConf {
@Bean//this is complex job1
public JobDetailFactoryBean jobDetailFactoryBean(ComplexJobService complexJobService){
JobDetailFactoryBean factory = new JobDetailFactoryBean();
factory.setJobClass(ComplexScheduledJob.class);
Map<String,Object> map = new HashMap<String,Object>();
map.put("complexJobService", complexJobService);
factory.setJobDataAsMap(map);
factory.setDurability(true);
return factory;
}
@Bean
public CronTriggerFactoryBean cronTriggerFactoryBean(ComplexJobService complexJobService){
CronTriggerFactoryBean stFactory = new CronTriggerFactoryBean();
stFactory.setJobDetail(jobDetailFactoryBean(complexJobService).getObject());
stFactory.setCronExpression("0 0/1 * 1/1 * ? *");
stFactory.setStartDelay(3000);
return stFactory;
}
@Bean
public SchedulerFactoryBean schedulerFactoryBean(ComplexJobService complexJobService) {
SchedulerFactoryBean scheduler = new SchedulerFactoryBean();
scheduler.setConfigLocation(new ClassPathResource("properties/quartz.properties"));
scheduler.setTriggers(
cronTriggerFactoryBean(complexJobService).getObject());
return scheduler;
}
}添加类ComplexJobService.java
@Component("complexJobService")
public class ComplexJobService {
@Autowired
JdbcTemplate jdbcTemplate;
@Autowired
UtilityService utilityService;
protected void execute() {
// utilityService.fetchCountriesDTO();
}
}ComplexScheduledJob.java
@PersistJobDataAfterExecution
@DisallowConcurrentExecution
@Component
public class ComplexScheduledJob extends QuartzJobBean{
@Autowired
private ComplexJobService complexJobService;
private static int count;
@Override
protected void executeInternal(JobExecutionContext jobContext)
throws JobExecutionException {
complexJobService.execute();
count++;
System.out.println("Job count " + count);
}
public void setComplexJobService(ComplexJobService complexJobService) {
this.complexJobService = complexJobService;
}
}这种java配置取代了Quartz Scheduler的XML配置。
<bean name="complexJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass" value="com.jobs.ComplexScheduledJo" />
<property name="jobDataMap">
<map>
<entry key="complexJobService" value-ref="complexJobService" />
</map>
</property>
<property name="durability" value="true" />
</bean>https://stackoverflow.com/questions/46419678
复制相似问题