2011-07-07 4 views
1

Я пытаюсь использовать Quartz 1.8.5 (и я также попытался Quartz2.0 - та же проблема) с Spring 3.0.0. Однако я не хочу использовать оболочки утилиты Spring для планировщиков, триггеров, заданий Quartz ... Я хотел бы создать все эти объекты программно из моего приложения, как в автономном Java-приложении без контейнера - для многих причин, но главным образом потому, что у меня есть требования к динамических триггеров и JobDetails ...не может инициализировать Quartz Scheduler весной

Итак, у меня есть quartz.properties на пути к классам, где я определяю JobStoreTX:

org.quartz.scheduler.instanceName: NotificationsScheduler 
org.quartz.scheduler.instanceId: AUTO 
org.quartz.scheduler.skipUpdateCheck: true 

org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool 
org.quartz.threadPool.threadCount: 3 
org.quartz.threadPool.threadPriority: 5 

org.quartz.jobStore.misfireThreshold: 60000 

org.quartz.jobStore.class: org.quartz.impl.jdbcjobstore.JobStoreTX 
org.quartz.jobStore.driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate 
org.quartz.jobStore.useProperties: false 
org.quartz.jobStore.dataSource: qzDS 
org.quartz.jobStore.tablePrefix: QRTZ_ 
org.quartz.jobStore.isClustered: false 

org.quartz.dataSource.qzDS.driver: com.mysql.jdbc.Driver 
org.quartz.dataSource.qzDS.URL: jdbc:mysql://localhost:3306/myschema 
org.quartz.dataSource.qzDS.user: myuser 
org.quartz.dataSource.qzDS.password: mypwd 
org.quartz.dataSource.qzDS.maxConnections: 5 

Тогда у меня есть простой класс инициализатора, взятый почти так же, как из примера 1 распределения кварца, которая использует не-модифицированный HelloJob из того же примера:

public class NotificationInitializer { 

public void init(){ 
try { 
    SchedulerFactory schdFact = new StdSchedulerFactory("quartz.properties"); 
    Scheduler schd = schdFact.getScheduler(); 
    schd.start(); 

    JobDetail jd = new JobDetail("hellojob", Scheduler.DEFAULT_GROUP, HelloJob.class); 
    Trigger t = TriggerUtils.makeImmediateTrigger(2, 1000); 
    t.setStartTime(new Date()); 

    schd.scheduleJob(jd, t); 
    // wait long enough so that the scheduler as an opportunity to run 
    .......... 

    schd.shutdown(true); 
    } catch (SchedulerException e) { 
    ..... 
    } 
} 
} 

И у меня есть простой тест блока, который вызывает этот класс:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = "classpath:spring/applicationContext.xml") 
public class NotificationInitializerTest { 
    private final static Logger logger = LoggerFactory 
     .getLogger(NotificationInitializerTest.class); 

    @BeforeClass 
    public static void setupClass() { 
     PropertyConfigurator.configure(Loader 
     .getResource("spring/log4j.properties")); 
     PropertyConfigurator.configure(Loader 
      .getResource("spring/quartz.properties")); 
    } 


    @Test 
    public void testInit() { 
     NotificationInitializer ni = new NotificationInitializer(); 
     ni.init(); 
     logger.info("NotificationInitializer.init() finished OK"); 
    } 

} 

И когда я запускаю этот тест единичного я получать следующие ошибки - смотрите полную трассировку стека:

Вызванный: org.springframework.beans.factory.BeanCreationException: Ошибка создания боб с именем «org.springframework.jdbc.datasource.init.DataSour ceInitializer # 0 ': Ошибка вызова метода init; вложенное исключение com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Запрос был пустой

Любая идея, что пошло не так?

Кроме того, я настраиваю JobStoreTX на данный момент - просто чтобы убедиться, что я могу заставить его работать, , но в конечном итоге я хотел бы использовать функцию JobStoreCMT toplug для управления транзакциями. Я не мог найти хорошую документацию/примеры того, как это сделать, особенно если я не хочу использовать Обертки Spring для планировщиков и hardcode все определения триггеров ...

Спасибо! Марина

java.lang.IllegalStateException: Failed to load ApplicationContext 
    at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:308) 
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDeendencies (DependencyInjectionTestExecutionListener.java:109) 
    at org.springframework.test.context.support.Dependenc yInjectionTestExecutionListener.prepareTestInstanc e(DependencyInjectionTestExecutionListener.java:75) 
    at org.springframework.test.context.TestContextManage r.prepareTestInstance(TestContextManager.java:333) 
    at org.springframework.test.context.junit4.SpringJUni t4ClassRunner.createTest(SpringJUnit4ClassRunner.j ava:220) 
    at 
    ..... 

Caused by: org.springframework.beans.factory.BeanCreationExce ption: Error creating bean with name 'org.springframework.jdbc.datasource.init.DataSour ceInitializer#0': Invocation of init method failed; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorEx ception: Query was empty 
    at org.springframework.beans.factory.support.Abstract AutowireCapableBeanFactory.initializeBean(Abstract AutowireCapableBeanFactory.java:1401) 
    at org.springframework.beans.factory.support.Abstract AutowireCapableBeanFactory.doCreateBean(AbstractAu towireCapableBeanFactory.java:512) 
    at org.springframework.beans.factory.support.Abstract AutowireCapableBeanFactory.createBean(AbstractAuto wireCapableBeanFactory.java:450) 
    at org.springframework.beans.factory.support.Abstract BeanFactory$1.getObject(AbstractBeanFactory.java:2 90) 
    at org.springframework.beans.factory.support.DefaultS ingletonBeanRegistry.getSingleton(DefaultSingleton BeanRegistry.java:222) 
    at org.springframework.beans.factory.support.Abstract BeanFactory.doGetBean(AbstractBeanFactory.java:287) 
    at org.springframework.beans.factory.support.Abstract BeanFactory.getBean(AbstractBeanFactory.java:189) 
    at org.springframework.beans.factory.support.DefaultL istableBeanFactory.preInstantiateSingletons(Defaul tListableBeanFactory.java:557) 
    at org.springframework.context.support.AbstractApplic ationContext.finishBeanFactoryInitialization(Abstr actApplicationContext.java:842) 
    at org.springframework.context.support.AbstractApplic ationContext.refresh(AbstractApplicationContext.ja va:416) 
    at org.springframework.test.context.support.AbstractG enericContextLoader.loadContext(AbstractGenericCon textLoader.java:84) 
    at org.springframework.test.context.support.AbstractG enericContextLoader.loadContext(AbstractGenericCon textLoader.java:1) 
    at org.springframework.test.context.TestContext.loadA pplicationContext(TestContext.java:280) 
    at org.springframework.test.context.TestContext.getAp plicationContext(TestContext.java:304) 
    ... 25 more 

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorEx ception: Query was empty 
    at sun.reflect.NativeConstructorAccessorImpl.newInsta nce0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInsta nce(Unknown Source) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newI nstance(Unknown Source) 
    at java.lang.reflect.Constructor.newInstance(Unknown Source) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:40 6) 
    at com.mysql.jdbc.Util.getInstance(Util.java:381) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLErro r.java:1030) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLErro r.java:956) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.ja va:3491) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.ja va:3423) 
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:19 36) 
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java :2060) 
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionIm pl.java:2536) 
    at com.mysql.jdbc.StatementImpl.executeUpdate(Stateme ntImpl.java:1564) 
    at com.mysql.jdbc.StatementImpl.executeUpdate(Stateme ntImpl.java:1485) 
    at org.apache.commons.dbcp.DelegatingStatement.execut eUpdate(DelegatingStatement.java:228) 
    at org.springframework.jdbc.datasource.init.ResourceD atabasePopulator.executeSqlScript(ResourceDatabase Populator.java:157) 
    at org.springframework.jdbc.datasource.init.ResourceD atabasePopulator.populate(ResourceDatabasePopulato r.java:110) 
    at org.springframework.jdbc.datasource.init.DataSourc eInitializer.afterPropertiesSet(DataSourceInitiali zer.java:69) 
    at org.springframework.beans.factory.support.Abstract AutowireCapableBeanFactory.invokeInitMethods(Abstr actAutowireCapableBeanFactory.java:1460) 
    at org.springframework.beans.factory.support.Abstract AutowireCapableBeanFactory.initializeBean(Abstract AutowireCapableBeanFactory.java:1398) 
    ... 
+0

Можете ли вы опубликовать конфигурацию вашей весенней фасоли? Вы инициализируете базу данных кварца, используя скрипт при загрузке контекста весеннего приложения? – blob

+0

да, это была причина! см. мой более подробный ответ ниже ... спасибо! – Marina

ответ

0

только догадка: Проверьте, если вам нужно указать запрос проверки соединения. Что-то вроде validationQuery="select 1"

+0

Спасибо, Ральф, я попробовал - и получил ту же ошибку ... – Marina

2

@blob: вы были правы на цель. Проведя часы, пытаясь понять, почему NotificationInitializer не был инициализирован (как было предложено сообщение об ошибке), я, наконец, попытался удалить скрипт инициализации Quartz DB из моей конфигурации Spring - и все работало как шарм!

<jdbc:initialize-database data-source="dataSource" 
    enabled="${database.initschema}"> 
    <jdbc:script location="${database.schemaLoc}" /> 
    <jdbc:script location="${database.seedLoc}" /> 
    <!-- <jdbc:script location="classpath:db/tables_mysql_innodb_1.8.5.sql" /> --> 
</jdbc:initialize-database> 

Я просто хочу, чтобы сообщения об ошибках Spring были немного более конкретными ... :)

Теперь, я до сих пор не понимаю, почему я не могу создать таблицы БД для Quartz этого пути - одни и те же сценарии отлично работает при запуске непосредственно на БД. Может быть, какая-то странная последовательность стартовых действий весной?

спасибо, Марина

1

Недавно я наткнулся на этот вопрос тоже (я использовал Java7 под Mac OS X), следующие работал для меня:

первую очередь, проверить, если метод java.net.InetAddress.getLocalHost() работает, если он бросает исключение, как:

Caused by: java.net.UnknownHostException: leo-mbp: nodename nor servname provided, or not known 
    at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method) 
    at java.net.InetAddress$1.lookupAllHostAddr(InetAddress.java:901) 
    at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1293) 
    at java.net.InetAddress.getLocalHost(InetAddress.java:1469) 

Выполните следующие действия для временного решения:

scutil --set HostName "localhost" 

Надеюсь, что это полезно для вас.

0

С изменением «org.quartz.scheduler.instanceId» от AUTO до 10 в файле quartz.properties работал для меня.

Смежные вопросы