From 906321dcdd0939824cfc9b31fb769defc150756e Mon Sep 17 00:00:00 2001 From: Sam Brannen Date: Sun, 30 Mar 2014 17:56:19 +0200 Subject: [PATCH] Fix broken tests in QuartzSupportTests This commit ensures that QuartzSupportTests and its related configuration are compatible with Quartz 2.1.7. - Test jobs are now durable where required. - Deleted legacy tests that attempted to use a Runnable instead of a Job as a jobClass for a JobDetail. - Replaced quartz-hsql.sql with current version for Quartz 2.1.7. Issue: SPR-11630 --- .../scheduling/quartz/QuartzSupportTests.java | 135 +++++------------- .../scheduling/quartz/databasePersistence.xml | 15 +- .../scheduling/quartz/quartz-hsql.sql | 120 +++++++++------- 3 files changed, 110 insertions(+), 160 deletions(-) diff --git a/spring-context-support/src/test/java/org/springframework/scheduling/quartz/QuartzSupportTests.java b/spring-context-support/src/test/java/org/springframework/scheduling/quartz/QuartzSupportTests.java index 97d8c3b4032b..cc017e14df0a 100644 --- a/spring-context-support/src/test/java/org/springframework/scheduling/quartz/QuartzSupportTests.java +++ b/spring-context-support/src/test/java/org/springframework/scheduling/quartz/QuartzSupportTests.java @@ -18,9 +18,11 @@ import java.util.HashMap; import java.util.Map; + import javax.sql.DataSource; import org.junit.Test; + import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; @@ -56,7 +58,7 @@ public class QuartzSupportTests { @Test - public void testSchedulerFactoryBeanWithApplicationContext() throws Exception { + public void schedulerFactoryBeanWithApplicationContext() throws Exception { TestBean tb = new TestBean("tb", 99); StaticApplicationContext ac = new StaticApplicationContext(); @@ -92,13 +94,14 @@ protected Scheduler createScheduler(SchedulerFactory schedulerFactory, String sc } @Test - public void testSchedulerWithTaskExecutor() throws Exception { + public void schedulerWithTaskExecutor() throws Exception { Assume.group(TestGroup.PERFORMANCE); CountingTaskExecutor taskExecutor = new CountingTaskExecutor(); DummyJob.count = 0; JobDetailImpl jobDetail = new JobDetailImpl(); + jobDetail.setDurability(true); jobDetail.setJobClass(DummyJob.class); jobDetail.setName("myJob"); @@ -124,44 +127,22 @@ public void testSchedulerWithTaskExecutor() throws Exception { bean.destroy(); } - @Test - public void testSchedulerWithRunnable() throws Exception { - Assume.group(TestGroup.PERFORMANCE); - - DummyRunnable.count = 0; - + @Test(expected = IllegalArgumentException.class) + @SuppressWarnings({ "unchecked", "rawtypes" }) + public void jobDetailWithRunnableInsteadOfJob() { JobDetailImpl jobDetail = new JobDetailImpl(); jobDetail.setJobClass((Class) DummyRunnable.class); - jobDetail.setName("myJob"); - - SimpleTriggerFactoryBean trigger = new SimpleTriggerFactoryBean(); - trigger.setName("myTrigger"); - trigger.setJobDetail(jobDetail); - trigger.setStartDelay(1); - trigger.setRepeatInterval(500); - trigger.setRepeatCount(1); - trigger.afterPropertiesSet(); - - SchedulerFactoryBean bean = new SchedulerFactoryBean(); - bean.setTriggers(trigger.getObject()); - bean.setJobDetails(jobDetail); - bean.afterPropertiesSet(); - bean.start(); - - Thread.sleep(500); - assertTrue(DummyRunnable.count > 0); - - bean.destroy(); } @Test - public void testSchedulerWithQuartzJobBean() throws Exception { + public void schedulerWithQuartzJobBean() throws Exception { Assume.group(TestGroup.PERFORMANCE); DummyJob.param = 0; DummyJob.count = 0; JobDetailImpl jobDetail = new JobDetailImpl(); + jobDetail.setDurability(true); jobDetail.setJobClass(DummyJobBean.class); jobDetail.setName("myJob"); jobDetail.getJobDataMap().put("param", "10"); @@ -188,13 +169,14 @@ public void testSchedulerWithQuartzJobBean() throws Exception { } @Test - public void testSchedulerWithSpringBeanJobFactory() throws Exception { + public void schedulerWithSpringBeanJobFactory() throws Exception { Assume.group(TestGroup.PERFORMANCE); DummyJob.param = 0; DummyJob.count = 0; JobDetailImpl jobDetail = new JobDetailImpl(); + jobDetail.setDurability(true); jobDetail.setJobClass(DummyJob.class); jobDetail.setName("myJob"); jobDetail.getJobDataMap().put("param", "10"); @@ -223,13 +205,14 @@ public void testSchedulerWithSpringBeanJobFactory() throws Exception { } @Test - public void testSchedulerWithSpringBeanJobFactoryAndParamMismatchNotIgnored() throws Exception { + public void schedulerWithSpringBeanJobFactoryAndParamMismatchNotIgnored() throws Exception { Assume.group(TestGroup.PERFORMANCE); DummyJob.param = 0; DummyJob.count = 0; JobDetailImpl jobDetail = new JobDetailImpl(); + jobDetail.setDurability(true); jobDetail.setJobClass(DummyJob.class); jobDetail.setName("myJob"); jobDetail.getJobDataMap().put("para", "10"); @@ -259,46 +242,13 @@ public void testSchedulerWithSpringBeanJobFactoryAndParamMismatchNotIgnored() th } @Test - public void testSchedulerWithSpringBeanJobFactoryAndRunnable() throws Exception { - Assume.group(TestGroup.PERFORMANCE); - - DummyRunnable.param = 0; - DummyRunnable.count = 0; - - JobDetailImpl jobDetail = new JobDetailImpl(); - jobDetail.setJobClass((Class) DummyRunnable.class); - jobDetail.setName("myJob"); - jobDetail.getJobDataMap().put("param", "10"); - - SimpleTriggerFactoryBean trigger = new SimpleTriggerFactoryBean(); - trigger.setName("myTrigger"); - trigger.setJobDetail(jobDetail); - trigger.setStartDelay(1); - trigger.setRepeatInterval(500); - trigger.setRepeatCount(1); - trigger.afterPropertiesSet(); - - SchedulerFactoryBean bean = new SchedulerFactoryBean(); - bean.setJobFactory(new SpringBeanJobFactory()); - bean.setTriggers(trigger.getObject()); - bean.setJobDetails(jobDetail); - bean.afterPropertiesSet(); - bean.start(); - - Thread.sleep(500); - assertEquals(10, DummyRunnable.param); - assertTrue(DummyRunnable.count > 0); - - bean.destroy(); - } - - @Test - public void testSchedulerWithSpringBeanJobFactoryAndQuartzJobBean() throws Exception { + public void schedulerWithSpringBeanJobFactoryAndQuartzJobBean() throws Exception { Assume.group(TestGroup.PERFORMANCE); DummyJobBean.param = 0; DummyJobBean.count = 0; JobDetailImpl jobDetail = new JobDetailImpl(); + jobDetail.setDurability(true); jobDetail.setJobClass(DummyJobBean.class); jobDetail.setName("myJob"); jobDetail.getJobDataMap().put("param", "10"); @@ -326,7 +276,7 @@ public void testSchedulerWithSpringBeanJobFactoryAndQuartzJobBean() throws Excep } @Test - public void testSchedulerWithSpringBeanJobFactoryAndJobSchedulingData() throws Exception { + public void schedulerWithSpringBeanJobFactoryAndJobSchedulingData() throws Exception { Assume.group(TestGroup.PERFORMANCE); DummyJob.param = 0; DummyJob.count = 0; @@ -348,9 +298,8 @@ public void testSchedulerWithSpringBeanJobFactoryAndJobSchedulingData() throws E * Tests the creation of multiple schedulers (SPR-772) */ @Test - public void testMultipleSchedulers() throws Exception { - ClassPathXmlApplicationContext ctx = - new ClassPathXmlApplicationContext("/org/springframework/scheduling/quartz/multipleSchedulers.xml"); + public void multipleSchedulers() throws Exception { + ClassPathXmlApplicationContext ctx = context("multipleSchedulers.xml"); try { Scheduler scheduler1 = (Scheduler) ctx.getBean("scheduler1"); Scheduler scheduler2 = (Scheduler) ctx.getBean("scheduler2"); @@ -364,10 +313,9 @@ public void testMultipleSchedulers() throws Exception { } @Test - public void testWithTwoAnonymousMethodInvokingJobDetailFactoryBeans() throws InterruptedException { + public void twoAnonymousMethodInvokingJobDetailFactoryBeans() throws Exception { Assume.group(TestGroup.PERFORMANCE); - ClassPathXmlApplicationContext ctx = - new ClassPathXmlApplicationContext("/org/springframework/scheduling/quartz/multipleAnonymousMethodInvokingJobDetailFB.xml"); + ClassPathXmlApplicationContext ctx = context("multipleAnonymousMethodInvokingJobDetailFB.xml"); Thread.sleep(3000); try { QuartzTestBean exportService = (QuartzTestBean) ctx.getBean("exportService"); @@ -384,10 +332,9 @@ public void testWithTwoAnonymousMethodInvokingJobDetailFactoryBeans() throws Int } @Test - public void testSchedulerAccessorBean() throws InterruptedException { + public void schedulerAccessorBean() throws Exception { Assume.group(TestGroup.PERFORMANCE); - ClassPathXmlApplicationContext ctx = - new ClassPathXmlApplicationContext("/org/springframework/scheduling/quartz/schedulerAccessorBean.xml"); + ClassPathXmlApplicationContext ctx = context("schedulerAccessorBean.xml"); Thread.sleep(3000); try { QuartzTestBean exportService = (QuartzTestBean) ctx.getBean("exportService"); @@ -405,7 +352,7 @@ public void testSchedulerAccessorBean() throws InterruptedException { @Test @SuppressWarnings("resource") - public void testSchedulerAutoStartsOnContextRefreshedEventByDefault() throws Exception { + public void schedulerAutoStartsOnContextRefreshedEventByDefault() throws Exception { StaticApplicationContext context = new StaticApplicationContext(); context.registerBeanDefinition("scheduler", new RootBeanDefinition(SchedulerFactoryBean.class)); Scheduler bean = context.getBean("scheduler", Scheduler.class); @@ -416,7 +363,7 @@ public void testSchedulerAutoStartsOnContextRefreshedEventByDefault() throws Exc @Test @SuppressWarnings("resource") - public void testSchedulerAutoStartupFalse() throws Exception { + public void schedulerAutoStartupFalse() throws Exception { StaticApplicationContext context = new StaticApplicationContext(); BeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition( SchedulerFactoryBean.class).addPropertyValue("autoStartup", false).getBeanDefinition(); @@ -428,28 +375,27 @@ public void testSchedulerAutoStartupFalse() throws Exception { } @Test - public void testSchedulerRepositoryExposure() throws InterruptedException { - ClassPathXmlApplicationContext ctx = - new ClassPathXmlApplicationContext("/org/springframework/scheduling/quartz/schedulerRepositoryExposure.xml"); + public void schedulerRepositoryExposure() throws Exception { + ClassPathXmlApplicationContext ctx = context("schedulerRepositoryExposure.xml"); assertSame(SchedulerRepository.getInstance().lookup("myScheduler"), ctx.getBean("scheduler")); ctx.close(); } - // SPR-6038: detect HSQL and stop illegal locks being taken + /** + * SPR-6038: detect HSQL and stop illegal locks being taken. + */ @Test - public void testSchedulerWithHsqlDataSource() throws Exception { + public void schedulerWithHsqlDataSource() throws Exception { Assume.group(TestGroup.PERFORMANCE); DummyJob.param = 0; DummyJob.count = 0; - ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext( - "/org/springframework/scheduling/quartz/databasePersistence.xml"); + ClassPathXmlApplicationContext ctx = context("databasePersistence.xml"); JdbcTemplate jdbcTemplate = new JdbcTemplate(ctx.getBean(DataSource.class)); assertTrue("No triggers were persisted", jdbcTemplate.queryForList("SELECT * FROM qrtz_triggers").size()>0); Thread.sleep(3000); try { - // assertEquals(10, DummyJob.param); assertTrue(DummyJob.count > 0); } finally { @@ -457,6 +403,10 @@ public void testSchedulerWithHsqlDataSource() throws Exception { } } + private ClassPathXmlApplicationContext context(String path) { + return new ClassPathXmlApplicationContext(path, getClass()); + } + public static class CountingTaskExecutor implements TaskExecutor { @@ -512,20 +462,9 @@ protected synchronized void executeInternal(JobExecutionContext jobExecutionCont public static class DummyRunnable implements Runnable { - private static int param; - - private static int count; - - public void setParam(int value) { - if (param > 0) { - throw new IllegalStateException("Param already set"); - } - param = value; - } - @Override public void run() { - count++; + /* no-op */ } } diff --git a/spring-context-support/src/test/resources/org/springframework/scheduling/quartz/databasePersistence.xml b/spring-context-support/src/test/resources/org/springframework/scheduling/quartz/databasePersistence.xml index 2048482bf8b9..8d72191ad624 100644 --- a/spring-context-support/src/test/resources/org/springframework/scheduling/quartz/databasePersistence.xml +++ b/spring-context-support/src/test/resources/org/springframework/scheduling/quartz/databasePersistence.xml @@ -1,13 +1,12 @@ - - + - + @@ -20,8 +19,8 @@ - + + diff --git a/spring-context-support/src/test/resources/org/springframework/scheduling/quartz/quartz-hsql.sql b/spring-context-support/src/test/resources/org/springframework/scheduling/quartz/quartz-hsql.sql index c2356955bc71..9f8b9d4788fb 100644 --- a/spring-context-support/src/test/resources/org/springframework/scheduling/quartz/quartz-hsql.sql +++ b/spring-context-support/src/test/resources/org/springframework/scheduling/quartz/quartz-hsql.sql @@ -1,47 +1,46 @@ +-- +-- In your Quartz properties file, you'll need to set +-- org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.HSQLDBDelegate +-- +-- Column lenghts are only suggestions. For names, groups, use at least 40 chars. +-- for blobs (VARBINARY) use a size that is sure to meet the needs of the amount of data +-- you place in job data maps, etc.. +-- + DROP TABLE qrtz_locks IF EXISTS; DROP TABLE qrtz_scheduler_state IF EXISTS; DROP TABLE qrtz_fired_triggers IF EXISTS; DROP TABLE qrtz_paused_trigger_grps IF EXISTS; DROP TABLE qrtz_calendars IF EXISTS; -DROP TABLE qrtz_trigger_listeners IF EXISTS; DROP TABLE qrtz_blob_triggers IF EXISTS; DROP TABLE qrtz_cron_triggers IF EXISTS; DROP TABLE qrtz_simple_triggers IF EXISTS; +DROP TABLE qrtz_simprop_triggers IF EXISTS; DROP TABLE qrtz_triggers IF EXISTS; -DROP TABLE qrtz_job_listeners IF EXISTS; DROP TABLE qrtz_job_details IF EXISTS; CREATE TABLE qrtz_job_details ( +SCHED_NAME VARCHAR(120) NOT NULL, JOB_NAME VARCHAR(200) NOT NULL, JOB_GROUP VARCHAR(200) NOT NULL, DESCRIPTION VARCHAR(250) NULL, JOB_CLASS_NAME VARCHAR(250) NOT NULL, IS_DURABLE BOOLEAN NOT NULL, -IS_VOLATILE BOOLEAN NOT NULL, -IS_STATEFUL BOOLEAN NOT NULL, +IS_NONCONCURRENT BOOLEAN NOT NULL, +IS_UPDATE_DATA BOOLEAN NOT NULL, REQUESTS_RECOVERY BOOLEAN NOT NULL, -JOB_DATA BLOB NULL, -PRIMARY KEY (JOB_NAME,JOB_GROUP) -); - -CREATE TABLE qrtz_job_listeners -( -JOB_NAME VARCHAR(200) NOT NULL, -JOB_GROUP VARCHAR(200) NOT NULL, -JOB_LISTENER VARCHAR(200) NOT NULL, -PRIMARY KEY (JOB_NAME,JOB_GROUP,JOB_LISTENER), -FOREIGN KEY (JOB_NAME,JOB_GROUP) -REFERENCES QRTZ_JOB_DETAILS(JOB_NAME,JOB_GROUP) +JOB_DATA VARBINARY(16000) NULL, +PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP) ); CREATE TABLE qrtz_triggers ( +SCHED_NAME VARCHAR(120) NOT NULL, TRIGGER_NAME VARCHAR(200) NOT NULL, TRIGGER_GROUP VARCHAR(200) NOT NULL, JOB_NAME VARCHAR(200) NOT NULL, JOB_GROUP VARCHAR(200) NOT NULL, -IS_VOLATILE BOOLEAN NOT NULL, DESCRIPTION VARCHAR(250) NULL, NEXT_FIRE_TIME NUMERIC(13) NULL, PREV_FIRE_TIME NUMERIC(13) NULL, @@ -52,101 +51,114 @@ START_TIME NUMERIC(13) NOT NULL, END_TIME NUMERIC(13) NULL, CALENDAR_NAME VARCHAR(200) NULL, MISFIRE_INSTR NUMERIC(2) NULL, -JOB_DATA BLOB NULL, -PRIMARY KEY (TRIGGER_NAME,TRIGGER_GROUP), -FOREIGN KEY (JOB_NAME,JOB_GROUP) -REFERENCES QRTZ_JOB_DETAILS(JOB_NAME,JOB_GROUP) +JOB_DATA VARBINARY(16000) NULL, +PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), +FOREIGN KEY (SCHED_NAME,JOB_NAME,JOB_GROUP) +REFERENCES QRTZ_JOB_DETAILS(SCHED_NAME,JOB_NAME,JOB_GROUP) ); CREATE TABLE qrtz_simple_triggers ( +SCHED_NAME VARCHAR(120) NOT NULL, TRIGGER_NAME VARCHAR(200) NOT NULL, TRIGGER_GROUP VARCHAR(200) NOT NULL, REPEAT_COUNT NUMERIC(7) NOT NULL, REPEAT_INTERVAL NUMERIC(12) NOT NULL, -TIMES_TRIGGERED NUMERIC(7) NOT NULL, -PRIMARY KEY (TRIGGER_NAME,TRIGGER_GROUP), -FOREIGN KEY (TRIGGER_NAME,TRIGGER_GROUP) -REFERENCES QRTZ_TRIGGERS(TRIGGER_NAME,TRIGGER_GROUP) +TIMES_TRIGGERED NUMERIC(10) NOT NULL, +PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), +FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) +REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) ); CREATE TABLE qrtz_cron_triggers ( +SCHED_NAME VARCHAR(120) NOT NULL, TRIGGER_NAME VARCHAR(200) NOT NULL, TRIGGER_GROUP VARCHAR(200) NOT NULL, CRON_EXPRESSION VARCHAR(120) NOT NULL, TIME_ZONE_ID VARCHAR(80), -PRIMARY KEY (TRIGGER_NAME,TRIGGER_GROUP), -FOREIGN KEY (TRIGGER_NAME,TRIGGER_GROUP) -REFERENCES QRTZ_TRIGGERS(TRIGGER_NAME,TRIGGER_GROUP) +PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), +FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) +REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) ); -CREATE TABLE qrtz_blob_triggers -( -TRIGGER_NAME VARCHAR(200) NOT NULL, -TRIGGER_GROUP VARCHAR(200) NOT NULL, -BLOB_DATA BLOB NULL, -PRIMARY KEY (TRIGGER_NAME,TRIGGER_GROUP), -FOREIGN KEY (TRIGGER_NAME,TRIGGER_GROUP) -REFERENCES QRTZ_TRIGGERS(TRIGGER_NAME,TRIGGER_GROUP) +CREATE TABLE qrtz_simprop_triggers + ( + SCHED_NAME VARCHAR(120) NOT NULL, + TRIGGER_NAME VARCHAR(200) NOT NULL, + TRIGGER_GROUP VARCHAR(200) NOT NULL, + STR_PROP_1 VARCHAR(512) NULL, + STR_PROP_2 VARCHAR(512) NULL, + STR_PROP_3 VARCHAR(512) NULL, + INT_PROP_1 NUMERIC(9) NULL, + INT_PROP_2 NUMERIC(9) NULL, + LONG_PROP_1 NUMERIC(13) NULL, + LONG_PROP_2 NUMERIC(13) NULL, + DEC_PROP_1 NUMERIC(13,4) NULL, + DEC_PROP_2 NUMERIC(13,4) NULL, + BOOL_PROP_1 BOOLEAN NULL, + BOOL_PROP_2 BOOLEAN NULL, + PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), + FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) + REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) ); -CREATE TABLE qrtz_trigger_listeners +CREATE TABLE qrtz_blob_triggers ( +SCHED_NAME VARCHAR(120) NOT NULL, TRIGGER_NAME VARCHAR(200) NOT NULL, TRIGGER_GROUP VARCHAR(200) NOT NULL, -TRIGGER_LISTENER VARCHAR(200) NOT NULL, -PRIMARY KEY (TRIGGER_NAME,TRIGGER_GROUP,TRIGGER_LISTENER), -FOREIGN KEY (TRIGGER_NAME,TRIGGER_GROUP) -REFERENCES QRTZ_TRIGGERS(TRIGGER_NAME,TRIGGER_GROUP) +BLOB_DATA VARBINARY(16000) NULL, +PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), +FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) +REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) ); CREATE TABLE qrtz_calendars ( +SCHED_NAME VARCHAR(120) NOT NULL, CALENDAR_NAME VARCHAR(200) NOT NULL, -CALENDAR BLOB NOT NULL, -PRIMARY KEY (CALENDAR_NAME) +CALENDAR VARBINARY(16000) NOT NULL, +PRIMARY KEY (SCHED_NAME,CALENDAR_NAME) ); CREATE TABLE qrtz_paused_trigger_grps ( +SCHED_NAME VARCHAR(120) NOT NULL, TRIGGER_GROUP VARCHAR(200) NOT NULL, -PRIMARY KEY (TRIGGER_GROUP) +PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP) ); CREATE TABLE qrtz_fired_triggers ( +SCHED_NAME VARCHAR(120) NOT NULL, ENTRY_ID VARCHAR(95) NOT NULL, TRIGGER_NAME VARCHAR(200) NOT NULL, TRIGGER_GROUP VARCHAR(200) NOT NULL, -IS_VOLATILE BOOLEAN NOT NULL, INSTANCE_NAME VARCHAR(200) NOT NULL, FIRED_TIME NUMERIC(13) NOT NULL, PRIORITY INTEGER NOT NULL, STATE VARCHAR(16) NOT NULL, JOB_NAME VARCHAR(200) NULL, JOB_GROUP VARCHAR(200) NULL, -IS_STATEFUL BOOLEAN NULL, +IS_NONCONCURRENT BOOLEAN NULL, REQUESTS_RECOVERY BOOLEAN NULL, -PRIMARY KEY (ENTRY_ID) +PRIMARY KEY (SCHED_NAME,ENTRY_ID) ); CREATE TABLE qrtz_scheduler_state ( +SCHED_NAME VARCHAR(120) NOT NULL, INSTANCE_NAME VARCHAR(200) NOT NULL, LAST_CHECKIN_TIME NUMERIC(13) NOT NULL, CHECKIN_INTERVAL NUMERIC(13) NOT NULL, -PRIMARY KEY (INSTANCE_NAME) +PRIMARY KEY (SCHED_NAME,INSTANCE_NAME) ); CREATE TABLE qrtz_locks ( +SCHED_NAME VARCHAR(120) NOT NULL, LOCK_NAME VARCHAR(40) NOT NULL, -PRIMARY KEY (LOCK_NAME) +PRIMARY KEY (SCHED_NAME,LOCK_NAME) ); -INSERT INTO qrtz_locks values('TRIGGER_ACCESS'); -INSERT INTO qrtz_locks values('JOB_ACCESS'); -INSERT INTO qrtz_locks values('CALENDAR_ACCESS'); -INSERT INTO qrtz_locks values('STATE_ACCESS'); -INSERT INTO qrtz_locks values('MISFIRE_ACCESS');