Jesque is an implementation of Resque in Java. It is fully-interoperable with the Ruby and Node.js (Coffee-Resque) implementations.
The grails jesque plugin uses jesque and the grails redis plugin as a dependency. While it uses jesque for the core functionality it makes it groovier to use in grails.
There is also a grails jesque-web plugin initially ported from the jesque-web spring-mvc app, which itself was based on the Sinatra web app resque-web in resque. Either UI will allow you to see what's in your queues and view and re-process failed messages.
A scheduler (a la Quartz) has been added to support scheduled injection of jobs. The syntax is very similar to the grails Quartz plugin.
There is a demo project located in github.
Add the jesque plugin to grails, it will automatically pull in jesque with it's dependencies, and the grails redis plugin.
dependencies {
compile('org.grails.plugins:jesque:1.2.1')
}
You must also have redis installed in your environment.
Example to enqueue
class BackgroundJob {
def someOtherService //auto-wiring supported
def perform( arg1, arg2 ) {
def domainObject = DomainClass.get(arg1) //GORM supported
domainObject.message = arg2
domainObject.save()
}
}
class SomeOtherClass {
def jesqueService
def doWorkAsync() {
jesqueService.enqueue( 'myQueueName', BackgroundJob.simpleName, 1, 'hi there')
}
def doWorkAsyncLater() {
jesqueService.enqueueAt(System.currentTimeMillis() + (1000 * 60), 'myQueueName', BackgroundJob.simpleName, 1, 'hi there')
}
}
Workers can be started manually by calling
jesqueService.startWorker( 'DemoJesqueJobQueue', DemoJesqueJob.simpleName, DemoJesqueJob )
or automatically upon start-up with the following config
---
grails:
redis:
port: 6379
host: localhost
jesque:
enabled: true
pruneWorkersOnStartup: true
createWorkersOnStartup: true
schedulerThreadActive: true
startPaused: false
autoFlush: true
workers:
DemoJesqueJobPool:
queueNames:
- "DemoQueue1"
- "DemoQueue2"
jobTypes:
- org.grails.jesque.demo.DemoJesqueJob
- org.grails.jesque.demo.DemoTwoJesqueJob
The redis pool used is configured in the redis plugin:
grails:
redis:
host: localhost
port: 6379
Or using sentinels
grails:
redis:
sentinels:
- 10.0.0.1:26379
- 10.0.0.2:26379
masterName: foobar
Jobs should be placed in grails-app/jobs similar to the Quartz plugin. However, to not clash with quartz, and to retain similarties with resque, the method to execute must be called perform.
You can run the script create-jesque-job to create a shell of a job for you automatically. The following will create a BackgroundJob in the grails-app/jobs folder.
grails create-jesque-job org.grails.jesque.demo.DemoJesqueJob
package org.grails.jesque.demo
import groovy.util.logging.Slf4j
@Slf4j
class DemoJesqueJob {
static queue = 'DemoJesqueJobQueue'
static workerPool = 'DemoJesqueJobPool'
static triggers = {
cron name: 'DemoJesqueJobTrigger', cronExpression: '0/15 * * * * ? *'
}
def perform() {
log.info "Executing Job"
}
}
You can define one or more custom WorkerListener classes that will be automatically added to all workers started from within jesqueService
.
You can implement the GrailsApplicationAware
interface if you need access to the grailsApplication
in your worker listener.
grails {
jesque {
custom {
listener.clazz = [LoggingWorkerListener] // accepts String, Class or List<String> or List<Class>
}
}
}
All Listeners have to implement the WorkerListener Interface otherwise they will simply be ignored
Copyright 2011 Michael Cameron
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.