2016-04-21 17 views
0

私はアプリケーションでSQLiteでquartzを使用しようとしています。私が文書hereを読むと、利用できるデータベースの中でSQLiteは言及されなかったことに気付きました。彼らは言う:QuartzでSQLiteを使用するにはどうすればいいですか?

JDBCJobStoreは、ほぼすべてのデータベースで動作し、それが広く オラクル、PostgreSQLのは、MySQL、MS SQLServerの、HSQLDB、およびDB2で使用されてきました。 JDBCJobStoreを使用するには、最初に Quartz用の一連のデータベーステーブルを作成する必要があります。テーブル作成SQLスクリプトは、Quartzディストリビューションの "docs/dbTables"ディレクトリにあります。

したがって、この質問から:Which setup script to use for setting up quartz sqlite table?私はsqliteスクリプトとして適用されるderbyスクリプトを使用します。

問題は、以前に挿入したジョブでトリガーをスケジュールしようとしたときです。これは私のコードの一部です:

// and start it off 
scheduler.start(); 

Map<String, String> map = new HashMap<>(); 
map.put("key", "value"); 

JobDataMap jdm = new JobDataMap(map); 

JobKey key = new JobKey("job1", "key1"); 

if(!scheduler.checkExists(key)){ 
    JobDetail job = newJob(HelloJob.class).withIdentity(key).storeDurably().usingJobData(jdm).build(); 
    addJob(scheduler, job); 

    // Trigger the job to run now, and then repeat every 40 seconds 
    Trigger trigger = newTrigger() 
     .withIdentity("trigger1", "group1") 
     .startNow() 
      .forJob(job) 
       .withSchedule(simpleSchedule() 
       .withIntervalInSeconds(40) 
       .repeatForever())    
     .build(); 

    // Tell quartz to schedule the job using our trigger 
    scheduler.scheduleJob(trigger); // here is where I get an error 
} 

Thread.sleep(60000); 

scheduler.shutdown(); 

私quartz.propertiesはこれです:

org.quartz.scheduler.instanceName = MyScheduler 
org.quartz.threadPool.threadCount = 5 
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX 
org.quartz.jobStore.tablePrefix = QRTZ_ 
org.quartz.dataSource.SQLiteDB.driver = org.sqlite.JDBC 
org.quartz.dataSource.SQLiteDB.URL = jdbc:sqlite:bota.db 
org.quartz.dataSource.SQLiteDB.maxConnections = 30 
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate 
org.quartz.jobStore.dataSource = SQLiteDB 

私はsqliteのV-3.8.11.2および石英V-2.2.2を使用しています。これは私がログに得るものです:

org.quartz.JobPersistenceException: Couldn't store trigger 'group1.trigger1' for 'key1.job1' job:Couldn't retrieve job: not implemented by SQLite JDBC driver [See nested exception: org.quartz.JobPersistenceException: Couldn't retrieve job: not implemented by SQLite JDBC driver [See nested exception: java.sql.SQLException: not implemented by SQLite JDBC driver]] 
    at org.quartz.impl.jdbcjobstore.JobStoreSupport.storeTrigger(JobStoreSupport.java:1223) 
    at org.quartz.impl.jdbcjobstore.JobStoreSupport$4.executeVoid(JobStoreSupport.java:1159) 
    at org.quartz.impl.jdbcjobstore.JobStoreSupport$VoidTransactionCallback.execute(JobStoreSupport.java:3715) 
    at org.quartz.impl.jdbcjobstore.JobStoreSupport$VoidTransactionCallback.execute(JobStoreSupport.java:3713) 
    at org.quartz.impl.jdbcjobstore.JobStoreSupport.executeInNonManagedTXLock(JobStoreSupport.java:3799) 
    at org.quartz.impl.jdbcjobstore.JobStoreTX.executeInLock(JobStoreTX.java:93) 
    at org.quartz.impl.jdbcjobstore.JobStoreSupport.storeTrigger(JobStoreSupport.java:1155) 
    at org.quartz.core.QuartzScheduler.scheduleJob(QuartzScheduler.java:932) 
    at org.quartz.impl.StdScheduler.scheduleJob(StdScheduler.java:258) 
    at javaapplication2.JavaApplication2.main(JavaApplication2.java:174) 
Caused by: org.quartz.JobPersistenceException: Couldn't retrieve job: not implemented by SQLite JDBC driver [See nested exception: java.sql.SQLException: not implemented by SQLite JDBC driver] 
    at org.quartz.impl.jdbcjobstore.JobStoreSupport.retrieveJob(JobStoreSupport.java:1396) 
    at org.quartz.impl.jdbcjobstore.JobStoreSupport.storeTrigger(JobStoreSupport.java:1205) 
    ... 9 more 
Caused by: java.sql.SQLException: not implemented by SQLite JDBC driver 
    at org.sqlite.jdbc4.JDBC4ResultSet.unused(JDBC4ResultSet.java:320) 
    at org.sqlite.jdbc4.JDBC4ResultSet.getBlob(JDBC4ResultSet.java:345) 
    at com.mchange.v2.c3p0.impl.NewProxyResultSet.getBlob(NewProxyResultSet.java:285) 
    at org.quartz.impl.jdbcjobstore.StdJDBCDelegate.getObjectFromBlob(StdJDBCDelegate.java:3190) 
    at org.quartz.impl.jdbcjobstore.StdJDBCDelegate.selectJobDetail(StdJDBCDelegate.java:860) 
    at org.quartz.impl.jdbcjobstore.JobStoreSupport.retrieveJob(JobStoreSupport.java:1385) 
    ... 10 more 
BUILD STOPPED (total time: 11 seconds) 

答えて

1

問題はSQLiteのJDBCドライバdoes not support the method ResultSet.getBlob()ことのようです。

しかし、quartzはこのメソッドを使用して、ジョブに割り当てられたJobDataMapを取得します。

まだ石英でsqliteを使用したい場合は、StdJDBCDelegateを拡張し、提案のin this answerのようなブロブを取得/設定することができます。私が天気を後でわからないので、あなたが唯一の方法

  1. StdJDBCDelegate.getObjectFromBlob()と
  2. StdJDBCDelegate.getJobDataFromBlob()

をオーバーライドする必要がありますように思わ一見

(例えば、sqlite jdbcdriverにはさらに多くのものがあります)unsupported ResultSet methods私はむしろ、すぐに使えるデータベースを使用することをお勧めします。

+0

ありがとう@ mam10eks、私はちょうど埋め込まれたデータベースを使用したいので、強制的にSQLiteを使用するわけではありません。実際にその問題の後、私は他のデータベースを組み込み、H2に切り替えることを決め始めました。 – leobelizquierdo

関連する問題