2017-04-10 5 views
0

Tomcatのcontext.xmlにBeanとして注入されたDataSourceでスケジューリングするためにSpringBoot 1.4.5とquartzを使用していますOracle 10g DBに接続するためのJndiDataSource経由。ここでQuartzとTomcatのデータソースを持つSpringBoot:ドライバのBlob表現はサポートされない型です:oracle.sql.BLOB

Oracleドライバを含む関連の依存関係は、ある、私はSpringBootが提供する依存関係の管理を使用しています:

 <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-tomcat</artifactId> 
      <scope>compile</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-context-support</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.quartz-scheduler</groupId> 
      <artifactId>quartz</artifactId> 
      <version>2.2.1</version> 
     </dependency> 
     <dependency> 
      <groupId>org.quartz-scheduler</groupId> 
      <artifactId>quartz-jobs</artifactId> 
      <version>2.2.1</version> 
     </dependency> 
      <dependency> 
      <groupId>com.oracle</groupId> 
      <artifactId>oracle-ojdbc7</artifactId> 
      <version>12.1.0-2</version> 
     </dependency> 

これはcontext.xmlに中にTomcatで構成されたデータソースです(プレースホルダのプロパティが定義されていますcatalina.properties):

<Resource name="${tomcat.dbpool.ups.quartz.resourcename}" auth="Container" 
       type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver" 
       url="${tomcat.dbpool.ups.quartz.connectionurl}" 
       username="${tomcat.dbpool.ups.quartz.username}" 
       password="${tomcat.dbpool.ups.quartz.password}" 
       maxTotal="${tomcat.dbpool.ups.quartz.maxTotal}" 
       maxIdle="${tomcat.dbpool.ups.quartz.maxIdle}" 
       minIdle="${tomcat.dbpool.ups.quartz.minIdle}" 
       maxWaitMillis="${tomcat.dbpool.ups.quartz.maxWaitMillis}" 
       validationQueryTimeout="${tomcat.dbpool.ups.quartz.validationQueryTimeout}" 
       testWhileIdle="true" 
       removeAbandonedOnMaintenance="true" 
       timeBetweenEvictionRunsMillis="${tomcat.dbpool.ups.quartz.timeBetweenEvictionRunsMillis}" 
       minEvictableIdleTimeMillis="${tomcat.dbpool.ups.quartz.minEvictableIdleTimeMillis}" 
       /> 

データソース豆構成と石英必要豆:

@Bean 
    public JobFactory jobFactory(final ApplicationContext applicationContext) { 
     final AutowiringSpringBeanJobFactory jobFactory = new AutowiringSpringBeanJobFactory(); 
     jobFactory.setApplicationContext(applicationContext); 
     return jobFactory; 
    } 

    @Bean 
    public SchedulerFactoryBean schedulerFactoryBean(@Qualifier("quartzDataSource") final DataSource quartzDS, 
                final JobFactory jobFactory, 
                @Qualifier("loansAppTrigger") final Trigger jobTrigger) throws IOException { 
     final SchedulerFactoryBean factory = new SchedulerFactoryBean(); 
     // this allows to update triggers in DB when updating settings in config file: 
     factory.setOverwriteExistingJobs(true); 
     factory.setDataSource(quartzDS); 
     factory.setJobFactory(jobFactory); 

     factory.setQuartzProperties(quartzProperties()); 
     factory.setTriggers(jobTrigger); 

     return factory; 
    } 

    @Bean(name = "quartzDataSource") 
    @Profile("!local") 
    public DataSource jndiDataSource() { 
     JndiDataSourceLookup dataSourceLookup = new JndiDataSourceLookup(); 
     DataSource dataSource = dataSourceLookup.getDataSource("java:comp/env/jdbc/QUARTZ"); 
     return dataSource; 
    } 

    @Bean 
    public Properties quartzProperties() throws IOException { 
     final PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean(); 
     propertiesFactoryBean.setLocation(new ClassPathResource("/quartz.properties")); 
     propertiesFactoryBean.afterPropertiesSet(); 
     return propertiesFactoryBean.getObject(); 
    } 

    @Bean 
    public JobDetailFactoryBean checkUnconfirmedApplicationsJobDetail() { 
     return createJobDetail(CheckUnconfirmedApplicationsJob.class); 
    } 

    @Bean(name = "loansAppTrigger") 
    public SimpleTriggerFactoryBean unconfirmedLoansApplicationsTrigger(
      @Qualifier("checkUnconfirmedApplicationsJobDetail") final JobDetail jobDetail, 
      @Value("${ups.loan.check.pending.apps.frequency}") final long frequency) { 
     return createTrigger(jobDetail, frequency); 
    } 

    private static JobDetailFactoryBean createJobDetail(final Class jobClass) { 
     final JobDetailFactoryBean factoryBean = new JobDetailFactoryBean(); 
     factoryBean.setJobClass(jobClass); 
     // job has to be durable to be stored in DB: 
     factoryBean.setDurability(true); 
     return factoryBean; 
    } 

    private static SimpleTriggerFactoryBean createTrigger(final JobDetail jobDetail, final long pollFrequencyMs) { 
     final SimpleTriggerFactoryBean factoryBean = new SimpleTriggerFactoryBean(); 
     factoryBean.setJobDetail(jobDetail); 
     factoryBean.setStartDelay(0L); 
     factoryBean.setRepeatInterval(pollFrequencyMs); 
     factoryBean.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY); 
     // in case of misfire, ignore all missed triggers and continue : 
     factoryBean.setMisfireInstruction(SimpleTrigger.MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT); 

     return factoryBean; 
    } 

そしてquartz.propertiesファイルの次のプロパティ:

org.quartz.JobPersistenceException::ジョブを保存できませんでした:

org.quartz.scheduler.instanceName=scheduler 
org.quartz.scheduler.instanceId=AUTO 
org.quartz.threadPool.threadCount=5 
org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX 
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.oracle.OracleDelegate 
org.quartz.jobStore.tablePrefix=QRTZ_ 
org.quartz.jobStore.useProperties=true 
org.quartz.jobStore.misfireThreshold=60000 

org.quartz.jobStore.isClustered=true 
org.quartz.jobStore.clusterCheckinInterval=20000 

私はTomcatを8でこれを展開し、私は次のエラーを取得するドライバーズBLOB表現は、サポートされているタイプです。oracle.sql.BLOB

Tomcatのlibフォルダには、oracle-ojdbc7-12.1.0-2.jarドライバがあります。

答えて

1

重複するoracle-ojdbc JARファイルが存在するかどうか確認してください。 JARは、WEB-INF/libまたはtomcat/libのいずれかの場所にのみ存在する必要があります。

+0

指定した両方の場所にoracle-ojdbcがあります。 Tomcatのlibフォルダから削除され、うまくいきました。どうもありがとう ! –

関連する問題