Showing posts with label lucene. Show all posts
Showing posts with label lucene. Show all posts

Friday, October 14, 2011

Grails with custom Lucene configuration for each environment

Sometimes it is needed to deal with non-grails configuration in Grails project, and usually there is problem if you need to use different configuration for different environment.
For example, recently I had to configure Lucene with compass.cfg.xml. And in production it is using MySQL dialect, and in test environment H2.
So in this case you can hook into Grails and adjust configuration for specific environment via events in scripts/_Events.groovy. For example, in my case I was just deleting custom configuration and using RAM store in test environment, like:

eventPackagingEnd = { msg -> 
  def file = new File("${grailsSettings.resourcesDir}/compass.cfg.xml")
  file.delete()
}

Of course, in different situations you can use different approach and for example, replace it with another file and so on.

Wednesday, October 12, 2011

Quartz error: Parameter index out of range

Recently, I had to configure Quartz in cluster. Most common approach to do it is to use database, there is a lot of tutorials and examples, but whatever I was using I bumped into this exception:
2011-10-12 10:44:44,861 [main] ERROR context.GrailsContextLoader  - Error executing bootstraps: org.quartz.JobPersistenceException: Couldn't store trigger 'mySimpleTrigger' for 'TestUpdaterJob' job:Parameter index out of range (2 > number of parameters, which is 1). [See nested exception: java.sql.SQLException: Parameter index out of range (2 > number of parameters, which is 1).]
org.codehaus.groovy.runtime.InvokerInvocationException: org.quartz.JobPersistenceException: Couldn't store trigger 'mySimpleTrigger' for 'TestUpdaterJob' job:Parameter index out of range (2 > number of parameters, which is 1). [See nested exception: java.sql.SQLException: Parameter index out of range (2 > number of parameters, which is 1).]
    at org.grails.tomcat.TomcatServer.start(TomcatServer.groovy:212)
    at grails.web.container.EmbeddableServer$start.call(Unknown Source)
    at _GrailsRun_groovy$_run_closure5_closure12.doCall(_GrailsRun_groovy:158)
    at _GrailsRun_groovy$_run_closure5_closure12.doCall(_GrailsRun_groovy)
    at _GrailsSettings_groovy$_run_closure10.doCall(_GrailsSettings_groovy:280)
    at _GrailsSettings_groovy$_run_closure10.call(_GrailsSettings_groovy)
    at _GrailsRun_groovy$_run_closure5.doCall(_GrailsRun_groovy:149)
    at _GrailsRun_groovy$_run_closure5.call(_GrailsRun_groovy)
    at _GrailsRun_groovy.runInline(_GrailsRun_groovy:116)
    at _GrailsRun_groovy.this$4$runInline(_GrailsRun_groovy)
    at _GrailsRun_groovy$_run_closure1.doCall(_GrailsRun_groovy:59)
    at RunApp$_run_closure1.doCall(RunApp.groovy:33)
    at gant.Gant$_dispatch_closure5.doCall(Gant.groovy:381)
    at gant.Gant$_dispatch_closure7.doCall(Gant.groovy:415)
    at gant.Gant$_dispatch_closure7.doCall(Gant.groovy)
    at gant.Gant.withBuildListeners(Gant.groovy:427)
    at gant.Gant.this$2$withBuildListeners(Gant.groovy)
    at gant.Gant$this$2$withBuildListeners.callCurrent(Unknown Source)
    at gant.Gant.dispatch(Gant.groovy:415)
    at gant.Gant.this$2$dispatch(Gant.groovy)
    at gant.Gant.invokeMethod(Gant.groovy)
    at gant.Gant.executeTargets(Gant.groovy:590)
    at gant.Gant.executeTargets(Gant.groovy:589)
Caused by: org.quartz.JobPersistenceException: Couldn't store trigger 'mySimpleTrigger' for 'TestUpdaterJob' job:Parameter index out of range (2 > number of parameters, which is 1). [See nested exception: java.sql.SQLException: Parameter index out of range (2 > number of parameters, which is 1).]
    at org.quartz.impl.jdbcjobstore.JobStoreSupport.storeTrigger(JobStoreSupport.java:1245)
    at org.quartz.impl.jdbcjobstore.JobStoreSupport$5.execute(JobStoreSupport.java:1151)
    at org.quartz.impl.jdbcjobstore.JobStoreSupport$40.execute(JobStoreSupport.java:3691)
    at org.quartz.impl.jdbcjobstore.JobStoreCMT.executeInLock(JobStoreCMT.java:242)
    at org.quartz.impl.jdbcjobstore.JobStoreSupport.executeInLock(JobStoreSupport.java:3687)
    at org.quartz.impl.jdbcjobstore.JobStoreSupport.storeTrigger(JobStoreSupport.java:1147)
    at org.quartz.core.QuartzScheduler.scheduleJob(QuartzScheduler.java:849)
    at org.quartz.impl.StdScheduler.scheduleJob(StdScheduler.java:254)
    at org.quartz.Scheduler$scheduleJob.call(Unknown Source)
    at QuartzGrailsPlugin$_closure5_closure24.doCall(QuartzGrailsPlugin.groovy:229)
    at QuartzGrailsPlugin$_closure5.doCall(QuartzGrailsPlugin.groovy:224)
    at QuartzGrailsPlugin.invokeMethod(QuartzGrailsPlugin.groovy)
    at QuartzGrailsPlugin$_closure3_closure21.doCall(QuartzGrailsPlugin.groovy:175)
    at QuartzGrailsPlugin$_closure3.doCall(QuartzGrailsPlugin.groovy:173)
    ... 23 more
Caused by: java.sql.SQLException: Parameter index out of range (2 > number of parameters, which is 1).
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927)
    at com.mysql.jdbc.PreparedStatement.checkBounds(PreparedStatement.java:3729)
    at com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:3713)
    at com.mysql.jdbc.PreparedStatement.setString(PreparedStatement.java:4553)
    at com.mysql.jdbc.BlobFromLocator.length(BlobFromLocator.java:333)
    at org.quartz.impl.jdbcjobstore.StdJDBCDelegate.getObjectFromBlob(StdJDBCDelegate.java:3463)
    at org.quartz.impl.jdbcjobstore.StdJDBCDelegate.selectJobDetail(StdJDBCDelegate.java:904)
    at org.quartz.impl.jdbcjobstore.JobStoreSupport.storeTrigger(JobStoreSupport.java:1201)
    ... 36 more

Google does not have a lot of information about it and I had to dig Quartz sources to investigate it, but finally I found that problem is emulateLocators=true on my database URL. I use this parameter for Lucene clustering so it seems there is conflict between them, so it is not possible to use common data source. Otherwise, it fixes this exception easily.