0
作業1在org.eko.BusinessJobs.Job1.doPerform(Job1.java:23) 在org.eko.jobs.BusinessJobA.executeInternal(BusinessJobA.java:34表演 ) at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:75) at org.quartz.core.JobRunShell.run(JobRunShell.java:202) at org.quartz.simpl.SimpleThreadPool $ WorkerThread .run(SimpleThreadPool.java:573) [Thu Jun 22 14:07:07 IST 2017]你好,來自Quartz!空石英作業無法使用Spring JpaRepository功能
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
\t xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
\t xmlns:context="http://www.springframework.org/schema/context"
\t xmlns:jdbc="http://www.springframework.org/schema/jdbc"
\t xmlns:tx="http://www.springframework.org/schema/tx"
\t xmlns:jpa="http://www.springframework.org/schema/data/jpa"
\t xmlns:util="http://www.springframework.org/schema/util"
\t xmlns:task="http://www.springframework.org/schema/task"
\t xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.3.xsd
\t \t http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.3.xsd
\t \t http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
\t \t http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
\t \t http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.8.xsd
\t \t http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
\t \t http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.3.xsd">
\t <context:component-scan base-package="org.eko">
\t \t <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
\t </context:component-scan>
\t
\t <jpa:repositories base-package="org.eko.repository" />
\t
\t <task:annotation-driven/>
\t <bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
\t \t id="entityManagerFactory">
\t \t <property name="packagesToScan" value="org.eko.entity" />
\t \t <property name="dataSource" ref="dataSource" />
\t \t <property name="jpaProperties">
\t \t \t <props>
\t \t \t \t <prop key="hibernate.show_sql">true</prop>
\t \t \t \t <prop key="hibernate.hbm2ddl.auto">update</prop>
\t \t \t </props>
\t \t </property>
\t \t <property name="persistenceProvider">
\t \t \t <bean class="org.hibernate.jpa.HibernatePersistenceProvider" />
\t \t </property>
\t </bean> \t
<!--
\t <bean id="dataSource" class = "org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name = "driverClassName" value = "com.mysql.jdbc.Driver"/>
<property name = "url" value = "jdbc:mysql://localhost:3306/Simpli_bank_Scheduler"/>
<property name = "username" value = "root"/>
<property name = "password" value = "1234"/>
</bean>
-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
\t <!-- Connection properties -->
\t <property name="driverClass" value="com.mysql.jdbc.Driver" />
\t <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/Simpli_bank_Scheduler" />
\t <property name="user" value="root" />
\t <property name="password" value="1234" />
\t
\t <!-- Pool properties -->
\t <property name="minPoolSize" value="5" />
\t <property name="maxPoolSize" value="200" />
\t <property name="acquireIncrement" value="1" />
\t <property name="maxStatements" value="500" />
\t <property name="idleConnectionTestPeriod" value="3000" />
\t <property name="loginTimeout" value="300" />
\t </bean>
\t <tx:annotation-driven transaction-manager="transactionManager" />
\t <bean class="org.springframework.orm.jpa.JpaTransactionManager" \t id="transactionManager">
\t \t <property name="dataSource" ref="dataSource" />
\t </bean>
<!-- \t
\t <bean id="Job1" class="org.eko.jobs.BusinessJobA">
\t <property name="sessionFactory" ref="sessionFactory"> </property>
\t </bean>
\t
\t <bean name="BusinessJobA" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass">
<bean factory-bean="Job1" factory-method="setJob1"></bean>
</property>
\t </bean>
\t
\t <bean id="BusinessJobA" class="org.eko.jobs.BusinessJobA" />
\t <bean id="quartzJobFactory" class="org.eko.configuration.AutowiringSpringBeanJobFactory">
\t <property name="ignoredUnknownProperties" value="applicationContext"/>
\t </bean>
\t <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
\t <property name="dataSource" ref="dataSource"/>
\t <property name="transactionManager" ref="transactionManager"/>
\t <property name="jobFactory" ref="quartzJobFactory"/>
\t \t <property name="overwriteExistingJobs" value="true"/>
\t <property name="autoStartup" value="true" />
\t <property name="schedulerName" value="quartzScheduler"/>
\t <property name="applicationContextSchedulerContextKey" value="applicationContext"/>
\t <property name="waitForJobsToCompleteOnShutdown" value="false"/>
\t <property name="configLocation" value="classpath:quartz.properties" />
\t <property name="quartzProperties">
<props>
<prop key="org.quartz.jobStore.misfireThreshold">60000</prop>
<prop key="org.quartz.threadPool.threadCount">50</prop>
<prop key="org.quartz.scheduler.instanceName">AUTO</prop>
<prop key="org.quartz.scheduler.instanceId">AUTO</prop>
<prop key="org.quartz.scheduler.skipUpdateCheck">true</prop>
<prop key="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.JobStoreTX</prop>
<prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>
</props>
</property>
</bean>
<bean id="BusinessObjectA" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass" value="org.eko.jobs.BusinessJobA"/>
</bean>
<bean id="BusinessObjectB" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass" value="org.eko.jobs.BusinessJobB"/>
</bean>
<bean id="BusinessObjectC" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass" value="org.eko.jobs.BusinessJobC"/>
</bean>
<bean id="BusinessObjectD" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass" value="org.eko.jobs.BusinessJobD"/>
</bean>
-->
<!--
<bean name="businessJobA" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass" value="org.eko.jobs.BusinessJobA"/>
<property name="group" value="Group1"/>
</bean>
<task:annotation-driven/>
<bean id="businessJobA" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass" value="org.eko.jobs.BusinessJobA"/>
<property name="jobDataAsMap">
<map>
<entry key="name" value="Job1"/>
</map>
</property>
<property name="durability" value="true"/>
</bean>
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="businessJobA" />
<property name="cronExpression" value="0/2 * * * * ?"/>
</bean>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="jobDetails">
<list>
<ref bean="businessJobA" />
</list>
</property>
<property name="triggers">
<list>
<ref bean="cronTrigger" />
</list>
</property>
</bean> -->
<bean id="job1" class="org.eko.BusinessJobs.Job1"/>
<bean id="job2" class="org.eko.BusinessJobs.Job2"/>
<bean id="job3" class="org.eko.BusinessJobs.Job3"/>
<bean id="job4" class="org.eko.BusinessJobs.Job4"/>
<bean id="job1job" class = "org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="job1"/>
<property name="targetMethod" value="doPerform"/>
</bean>
<bean id="job2job" class = "org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="job2"/>
<property name="targetMethod" value="doPerform"/>
</bean>
<bean id="job3job" class = "org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="job3"/>
<property name="targetMethod" value="doPerform"/>
</bean>
<bean id="job4job" class = "org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="job4"/>
<property name="targetMethod" value="doPerform"/>
</bean>
<bean id="simpleTrigger1" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
<property name="jobDetail" ref="job1job" />
<property name="repeatInterval" value="5000" />
<property name="startDelay" value="1000" />
<property name="repeatCount" value="5" />
</bean>
<bean id="simpleTrigger2" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
<property name="jobDetail" ref="job2job" />
<property name="repeatInterval" value="5000" />
<property name="startDelay" value="1000" />
<property name="repeatCount" value="5" />
</bean>
<bean id="simpleTrigger3" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
<property name="jobDetail" ref="job3job" />
<property name="repeatInterval" value="5000" />
<property name="startDelay" value="1000" />
<property name="repeatCount" value="5" />
</bean>
<bean id="simpleTrigger4" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
<property name="jobDetail" ref="job4job" />
<property name="repeatInterval" value="5000" />
<property name="startDelay" value="1000" />
<property name="repeatCount" value="5" />
</bean>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="jobDetails">
<list>
<ref bean="job1job" />
<ref bean="job2job" />
<ref bean="job3job" />
<ref bean="job4job" />
</list>
</property>
<property name="triggers">
<list>
<ref bean="simpleTrigger1" />
<ref bean="simpleTrigger2" />
<ref bean="simpleTrigger3" />
<ref bean="simpleTrigger4" />
</list>
</property>
</bean>
</beans>
package org.eko.jobs;
import java.util.Date;
import org.eko.BusinessJobs.Job1;
import org.quartz.DisallowConcurrentExecution;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
import org.springframework.stereotype.Component;
import org.springframework.web.context.support.SpringBeanAutowiringSupport;
@Component
@DisallowConcurrentExecution
public class BusinessJobA extends QuartzJobBean
{
\t public static int REPEATINTERVALINMILLISECONDS=2000;
\t public static int REPEATCOUNT=20;
\t
\t Job1 job1=new Job1();
\t @Override
\t protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException {
\t \t
\t \t SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
\t \t
\t \t String name = arg0.getMergedJobDataMap().getString("name");
System.out.println("[" + new Date() + "] Hello from Quartz! " + name);
\t \t
\t \t System.out.println("Executing Business Object A");
\t \t try
\t \t {
\t \t \t job1.doPerform();
\t \t }
\t \t catch (Exception e) {
\t \t \t e.printStackTrace();
\t \t }
\t }
}
package org.eko.BusinessJobs;
import java.util.List;
import org.eko.entity.SimpliJob;
import org.eko.repository.SimpliJobRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
@Service
public class Job1 {
\t @Autowired
\t private SimpliJobRepository simpliJobRepository;
\t
\t public void doPerform()
\t {
\t \t System.out.println("\nJob1 Performing");
\t \t
\t \t Sort sortID=new Sort(new Sort.Order(Sort.Direction.DESC,"id"));
\t \t
\t \t List<SimpliJob> jobsDescID=simpliJobRepository.findAll(sortID);
\t \t for (SimpliJob simpliJob : jobsDescID) {
\t \t \t System.out.println(simpliJob);
\t \t }
\t \t System.out.println("\nJob1 Done\n");
\t }
}
package org.eko.controller;
import java.util.Calendar;
import org.eko.entity.SimpliJob;
import org.eko.jobs.BusinessJobA;
import org.eko.jobs.BusinessJobB;
import org.eko.jobs.BusinessJobC;
import org.eko.jobs.BusinessJobD;
import org.eko.repository.SimpliJobRepository;
import org.eko.service.InitDbService;
import org.quartz.DateBuilder;
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;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
@Controller
public class QuartzSchedulerController {
\t
\t JobDetail jobDetail1;
\t JobDetail jobDetail2;
\t JobDetail jobDetail3;
\t JobDetail jobDetail4;
\t Trigger trigger1;
\t Trigger trigger2;
\t Trigger trigger3;
\t Trigger trigger4;
\t Scheduler scheduler;
\t
\t @Autowired
\t private SimpliJobRepository simpliJobRepository;
\t
\t public void scheduleJob(SimpliJob simpliJob) throws SchedulerException
\t {
\t \t scheduler=new StdSchedulerFactory().getScheduler();
\t \t if(simpliJob.getStatus()==1){
\t \t if(simpliJob.getId()==1)
\t \t {
\t \t \t jobDetail1=JobBuilder.newJob(BusinessJobA.class).withIdentity(simpliJob.getName(),simpliJob.getSimpliGroup()).build();
\t \t \t trigger1=(Trigger) TriggerBuilder.newTrigger().withIdentity("Trigger1",simpliJob.getSimpliGroup()).startAt(DateBuilder.dateOf(simpliJob.getStartTime().get(Calendar.HOUR_OF_DAY), simpliJob.getStartTime().get(Calendar.MINUTE), simpliJob.getStartTime().get(Calendar.SECOND), simpliJob.getStartTime().get(Calendar.DAY_OF_MONTH),simpliJob.getStartTime().get(Calendar.MONTH)+1,simpliJob.getStartTime().get(Calendar.YEAR))).withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInMilliseconds(BusinessJobA.REPEATINTERVALINMILLISECONDS).withRepeatCount(BusinessJobA.REPEATCOUNT)).forJob(jobDetail1).build();
\t \t \t scheduler.scheduleJob(jobDetail1,trigger1);
\t \t \t System.out.println("BusinessObjectA Scheduled!");
\t \t }
\t \t if(simpliJob.getId()==2)
\t \t {
\t \t \t jobDetail2=JobBuilder.newJob(BusinessJobB.class).withIdentity(simpliJob.getName(),simpliJob.getSimpliGroup()).build();
\t \t \t trigger2=(Trigger) TriggerBuilder.newTrigger().withIdentity("Trigger2",simpliJob.getSimpliGroup()).startAt(DateBuilder.dateOf(simpliJob.getStartTime().get(Calendar.HOUR_OF_DAY), simpliJob.getStartTime().get(Calendar.MINUTE), simpliJob.getStartTime().get(Calendar.SECOND), simpliJob.getStartTime().get(Calendar.DAY_OF_MONTH),simpliJob.getStartTime().get(Calendar.MONTH)+1,simpliJob.getStartTime().get(Calendar.YEAR))).withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInMilliseconds(BusinessJobB.REPEATINTERVALINMILLISECONDS).withRepeatCount(BusinessJobB.REPEATCOUNT)).forJob(jobDetail2).build();
\t \t \t scheduler.scheduleJob(jobDetail2,trigger2);
\t \t \t System.out.println("BusinessObjectB Scheduled!");
\t \t }
\t \t if(simpliJob.getId()==3)
\t \t {
\t \t \t jobDetail3=JobBuilder.newJob(BusinessJobC.class).withIdentity(simpliJob.getName(),simpliJob.getSimpliGroup()).build();
\t \t \t trigger3=(Trigger) TriggerBuilder.newTrigger().withIdentity("Trigger3",simpliJob.getSimpliGroup()).startAt(DateBuilder.dateOf(simpliJob.getStartTime().get(Calendar.HOUR_OF_DAY), simpliJob.getStartTime().get(Calendar.MINUTE), simpliJob.getStartTime().get(Calendar.SECOND), simpliJob.getStartTime().get(Calendar.DAY_OF_MONTH),simpliJob.getStartTime().get(Calendar.MONTH)+1,simpliJob.getStartTime().get(Calendar.YEAR))).withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInMilliseconds(BusinessJobC.REPEATINTERVALINMILLISECONDS).withRepeatCount(BusinessJobC.REPEATCOUNT)).forJob(jobDetail3).build();
\t \t \t scheduler.scheduleJob(jobDetail3,trigger3);
\t \t \t System.out.println("BusinessObjectC Scheduled!");
\t \t }
\t \t if(simpliJob.getId()==4)
\t \t {
\t \t \t jobDetail4=JobBuilder.newJob(BusinessJobD.class).withIdentity(simpliJob.getName(),simpliJob.getSimpliGroup()).build();
\t \t \t trigger4=(Trigger) TriggerBuilder.newTrigger().withIdentity("Trigger4",simpliJob.getSimpliGroup()).startAt(DateBuilder.dateOf(simpliJob.getStartTime().get(Calendar.HOUR_OF_DAY), simpliJob.getStartTime().get(Calendar.MINUTE), simpliJob.getStartTime().get(Calendar.SECOND), simpliJob.getStartTime().get(Calendar.DAY_OF_MONTH),simpliJob.getStartTime().get(Calendar.MONTH)+1,simpliJob.getStartTime().get(Calendar.YEAR))).withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInMilliseconds(BusinessJobD.REPEATINTERVALINMILLISECONDS).withRepeatCount(BusinessJobD.REPEATCOUNT)).forJob(jobDetail4).build();
\t \t \t scheduler.scheduleJob(jobDetail4,trigger4);
\t \t \t System.out.println("BusinessObjectD Scheduled!");
\t \t }
\t \t simpliJob.setStatus(2);
\t \t simpliJobRepository.save(simpliJob);
\t \t }
\t \t else
\t \t {
\t \t \t System.err.println("Job Already Scheduled!");
\t \t }
\t \t scheduler.start();
\t }
\t
\t public void unscheduleJob(SimpliJob simpliJob) throws SchedulerException
\t {
\t \t if(simpliJob.getStatus()==2){
\t \t if(simpliJob.getId()==1)
\t \t {
\t \t \t scheduler.unscheduleJob(trigger1.getKey());
\t \t \t System.out.println("BusinessObjectA descheduled!");
\t \t }
\t \t if(simpliJob.getId()==2)
\t \t {
\t \t \t scheduler.unscheduleJob(trigger2.getKey());
\t \t \t System.out.println("BusinessObjectB descheduled!");
\t \t }
\t \t if(simpliJob.getId()==3)
\t \t {
\t \t \t scheduler.unscheduleJob(trigger3.getKey());
\t \t \t System.out.println("BusinessObjectC descheduled!");
\t \t }
\t \t if(simpliJob.getId()==4)
\t \t {
\t \t \t scheduler.unscheduleJob(trigger4.getKey());
\t \t \t System.out.println("BusinessObjectD descheduled!");
\t \t }
\t \t simpliJob.setStatus(1);
\t \t simpliJobRepository.save(simpliJob);
\t \t }
\t \t else
\t \t {
\t \t \t System.err.println("Job Not Scheduled!");
\t \t }
\t }
}
我已經試過了,但效果都一樣 –