techwhizbang-jruby-quartz 0.1 → 0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/base_scheduler.rb +80 -0
- data/lib/jobs/base_job.rb +30 -0
- data/lib/jobs/base_job_detail.rb +27 -0
- data/lib/jobs/base_job_factory.rb +15 -0
- data/lib/jruby-quartz.rb +8 -0
- data/test/integration/jruby_quartz_integration_test.rb +36 -0
- data/test/test_helper.rb +5 -0
- data/test/unit/base_job_detail_test.rb +13 -0
- data/test/unit/base_job_factory_test.rb +12 -0
- data/test/unit/base_job_test.rb +20 -0
- data/test/unit/base_scheduler_test.rb +62 -0
- metadata +17 -6
@@ -0,0 +1,80 @@
|
|
1
|
+
require 'singleton'
|
2
|
+
|
3
|
+
import org.quartz.SchedulerFactory
|
4
|
+
import org.quartz.SchedulerException
|
5
|
+
import org.quartz.Scheduler
|
6
|
+
import org.quartz.JobDetail
|
7
|
+
import org.quartz.CronTrigger
|
8
|
+
import org.quartz.SimpleTrigger
|
9
|
+
import org.quartz.impl.StdSchedulerFactory
|
10
|
+
|
11
|
+
class BaseScheduler
|
12
|
+
include Singleton
|
13
|
+
attr_reader :scheduler_factory
|
14
|
+
|
15
|
+
attr_accessor :base_jobs_group, :base_triggers_group
|
16
|
+
attr_accessor :job_name, :trigger_name, :cron_expression
|
17
|
+
|
18
|
+
def fire!(job_class, options={})
|
19
|
+
raise "Not implemented yet"
|
20
|
+
end
|
21
|
+
|
22
|
+
def schedule!(job_class, options={})
|
23
|
+
begin
|
24
|
+
scheduler = self.scheduler_factory.get_scheduler
|
25
|
+
scheduler.set_job_factory(job_factory.new)
|
26
|
+
detail = job_detail.new(self.job_name,
|
27
|
+
self.base_jobs_group,
|
28
|
+
job_class.new())
|
29
|
+
|
30
|
+
customer_load_trigger = cron_trigger.new(self.trigger_name,
|
31
|
+
self.base_triggers_group,
|
32
|
+
self.job_name,
|
33
|
+
self.base_jobs_group,
|
34
|
+
self.cron_expression)
|
35
|
+
|
36
|
+
scheduler.schedule_job(detail, customer_load_trigger)
|
37
|
+
|
38
|
+
rescue Exception => e
|
39
|
+
raise SchedulerError.new(e)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
protected
|
44
|
+
|
45
|
+
def trigger
|
46
|
+
SimpleTrigger
|
47
|
+
end
|
48
|
+
|
49
|
+
def initialize_scheduler_factory(options={})
|
50
|
+
StdSchedulerFactory.new
|
51
|
+
end
|
52
|
+
|
53
|
+
def job_factory
|
54
|
+
Jobs::BaseJobFactory
|
55
|
+
end
|
56
|
+
|
57
|
+
def job_detail
|
58
|
+
Jobs::BaseJobDetail
|
59
|
+
end
|
60
|
+
|
61
|
+
def cron_trigger
|
62
|
+
CronTrigger
|
63
|
+
end
|
64
|
+
|
65
|
+
private
|
66
|
+
|
67
|
+
def initialize
|
68
|
+
super
|
69
|
+
@scheduler_factory = initialize_scheduler_factory
|
70
|
+
@base_jobs_group = "BaseJobsGroup"
|
71
|
+
@base_triggers_group = "BaseTriggersGroup"
|
72
|
+
@job_name = "BaseJob"
|
73
|
+
@trigger_name = "BaseTrigger"
|
74
|
+
@cron_expression = "0 0/1 * * * ?"
|
75
|
+
end
|
76
|
+
|
77
|
+
class SchedulerError < StandardError; end
|
78
|
+
|
79
|
+
end
|
80
|
+
|
@@ -0,0 +1,30 @@
|
|
1
|
+
import org.quartz.Job
|
2
|
+
import org.quartz.JobExecutionContext
|
3
|
+
import org.quartz.JobExecutionException
|
4
|
+
|
5
|
+
module Jobs
|
6
|
+
class BaseJob
|
7
|
+
include org.quartz.Job
|
8
|
+
implement org.quartz.Job
|
9
|
+
|
10
|
+
def initialize(); end
|
11
|
+
|
12
|
+
def execute(context)
|
13
|
+
begin
|
14
|
+
perform_job
|
15
|
+
rescue Exception => e
|
16
|
+
raise JobError.new(e)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def perform_job
|
21
|
+
raise "Subclass must implement the perform job method"
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
class JobError < StandardError ; end
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
|
@@ -0,0 +1,27 @@
|
|
1
|
+
import org.quartz.JobDetail
|
2
|
+
import org.quartz.SchedulerException
|
3
|
+
|
4
|
+
module Jobs
|
5
|
+
class BaseJobDetail < org.quartz.JobDetail
|
6
|
+
|
7
|
+
attr_accessor :job
|
8
|
+
|
9
|
+
def initialize(name, group, job)
|
10
|
+
super()
|
11
|
+
set_name name
|
12
|
+
set_group group
|
13
|
+
@job = job
|
14
|
+
end
|
15
|
+
|
16
|
+
def validate
|
17
|
+
raise org.quartz.SchedulerException.new("Job's name cannot be null",
|
18
|
+
org.quartz.SchedulerException.ERR_CLIENT_ERROR) if get_name == nil
|
19
|
+
raise org.quartz.SchedulerException.new("Job's group cannot be null",
|
20
|
+
org.quartz.SchedulerException.ERR_CLIENT_ERROR) if get_group == nil
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
|
27
|
+
|
@@ -0,0 +1,15 @@
|
|
1
|
+
import org.quartz.spi.JobFactory
|
2
|
+
import org.quartz.spi.TriggerFiredBundle
|
3
|
+
import org.quartz.JobDetail
|
4
|
+
|
5
|
+
module Jobs
|
6
|
+
class BaseJobFactory
|
7
|
+
include org.quartz.spi.JobFactory
|
8
|
+
|
9
|
+
def new_job bundle
|
10
|
+
bundle.get_job_detail.job
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
|
data/lib/jruby-quartz.rb
ADDED
@@ -0,0 +1,8 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/base_scheduler')
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + '/jobs/base_job')
|
3
|
+
require File.expand_path(File.dirname(__FILE__) + '/jobs/base_job_detail')
|
4
|
+
require File.expand_path(File.dirname(__FILE__) + '/jobs/base_job_factory')
|
5
|
+
|
6
|
+
module JrubyQuartz
|
7
|
+
VERSION = '0.2'
|
8
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
|
2
|
+
|
3
|
+
class IntegrationScheduler < BaseScheduler
|
4
|
+
|
5
|
+
private
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
super
|
9
|
+
@base_jobs_group = "IntegrationJobs"
|
10
|
+
@base_triggers_group = "IntegrationTriggers"
|
11
|
+
@cron_expression = "0 0/1 * * * ?"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class IntegrationJob < Jobs::BaseJob
|
16
|
+
|
17
|
+
def perform_job
|
18
|
+
worker_one = mock('worker class one', :whatever => "123")
|
19
|
+
worker_two = mock('worker class two', :whatever => '123')
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class JrubyQuartzIntegrationTest < Test::Unit::TestCase
|
24
|
+
|
25
|
+
def test_scheduler_implementation
|
26
|
+
#must stub the scheduler and scheduler factory to avoid invokation of real Quartz thread pool, etc.
|
27
|
+
scheduler = mock('scheduler')
|
28
|
+
scheduler_factory = mock('scheduler factory', :get_scheduler => scheduler)
|
29
|
+
|
30
|
+
scheduler.expects(:schedule_job)
|
31
|
+
scheduler.expects(:set_job_factory)
|
32
|
+
|
33
|
+
IntegrationScheduler.instance.expects(:scheduler_factory).returns(scheduler_factory)
|
34
|
+
IntegrationScheduler.instance.schedule!(IntegrationJob)
|
35
|
+
end
|
36
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
|
2
|
+
|
3
|
+
class BaseJobDetailTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def test_initialization
|
6
|
+
assert_instance_of(Jobs::BaseJobDetail, Jobs::BaseJobDetail.new("Name", "Group", "Job"))
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_initialization_with_failed_validation
|
10
|
+
assert_raise(NativeException) { Jobs::BaseJobDetail.new(nil, nil, nil) }
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
|
2
|
+
|
3
|
+
class BaseJobFactoryTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def test_new_job
|
6
|
+
job = mock('job')
|
7
|
+
job_detail = mock('job detail', :job => job)
|
8
|
+
bundle = mock('bundle', :get_job_detail => job_detail)
|
9
|
+
Jobs::BaseJobFactory.new.new_job(bundle)
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
|
2
|
+
|
3
|
+
class BaseJobTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def test_initialize
|
6
|
+
assert_instance_of(Jobs::BaseJob, Jobs::BaseJob.new)
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_quartz_job_implement
|
10
|
+
assert_kind_of(org.quartz.Job, Jobs::BaseJob.new)
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_execute
|
14
|
+
context = mock('context')
|
15
|
+
job = Jobs::BaseJob.new
|
16
|
+
job.expects(:perform_job)
|
17
|
+
job.execute(context)
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
|
2
|
+
|
3
|
+
class BaseSchedulerTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def test_singleton_initialization
|
6
|
+
assert_raise(NoMethodError) { BaseScheduler.new }
|
7
|
+
assert_not_nil(BaseScheduler.instance)
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_scheduler_instance_variables
|
11
|
+
assert_equal BaseScheduler.instance.base_jobs_group, "BaseJobsGroup"
|
12
|
+
assert_equal BaseScheduler.instance.job_name, "BaseJob"
|
13
|
+
assert_equal BaseScheduler.instance.base_triggers_group, "BaseTriggersGroup"
|
14
|
+
assert_equal BaseScheduler.instance.trigger_name, "BaseTrigger"
|
15
|
+
assert_equal BaseScheduler.instance.cron_expression, "0 0/1 * * * ?"
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_trigger_class
|
19
|
+
assert_kind_of(org.quartz.SimpleTrigger, BaseScheduler.instance.send(:trigger).new)
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_job_factory_class
|
23
|
+
assert_kind_of(Jobs::BaseJobFactory, BaseScheduler.instance.send(:job_factory).new)
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_job_detail_class
|
27
|
+
assert_kind_of(Jobs::BaseJobDetail, BaseScheduler.instance.send(:job_detail).new("JobName",
|
28
|
+
'JobGroup',
|
29
|
+
'JobClass'))
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_scheduler_factory_class
|
33
|
+
assert_kind_of(StdSchedulerFactory, BaseScheduler.instance.send(:initialize_scheduler_factory))
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_cron_trigger_class
|
37
|
+
assert_kind_of(CronTrigger, BaseScheduler.instance.send(:cron_trigger).new)
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_schedule_method
|
41
|
+
base_job = mock("base job")
|
42
|
+
scheduler = mock('scheduler')
|
43
|
+
job_factory = mock('job factory')
|
44
|
+
job_detail = mock('job detail')
|
45
|
+
cron_trigger = mock('cron trigger')
|
46
|
+
scheduler_factory = mock('scheduler factory', :get_scheduler => scheduler)
|
47
|
+
|
48
|
+
job_factory.expects(:new).returns(job_factory)
|
49
|
+
base_job.expects(:new).returns(base_job)
|
50
|
+
job_detail.expects(:new).returns(job_detail)
|
51
|
+
cron_trigger.expects(:new).returns(cron_trigger)
|
52
|
+
|
53
|
+
scheduler.expects(:set_job_factory).with(job_factory)
|
54
|
+
scheduler.expects(:schedule_job).with(job_detail, cron_trigger)
|
55
|
+
BaseScheduler.instance.expects(:scheduler_factory).returns(scheduler_factory)
|
56
|
+
|
57
|
+
BaseScheduler.instance.stubs(:job_detail).returns(job_detail)
|
58
|
+
BaseScheduler.instance.stubs(:job_factory).returns(job_factory)
|
59
|
+
BaseScheduler.instance.stubs(:cron_trigger).returns(cron_trigger)
|
60
|
+
BaseScheduler.instance.schedule!(base_job)
|
61
|
+
end
|
62
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: techwhizbang-jruby-quartz
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: "0.
|
4
|
+
version: "0.2"
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nick Zalabak
|
@@ -9,12 +9,12 @@ autorequire: jruby-quartz
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-05-16 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
16
16
|
description: Jruby-Quartz is a wrapper library for the Java based Quartz scheduling framework.
|
17
|
-
email:
|
17
|
+
email: techwhizbang@gmail.com
|
18
18
|
executables: []
|
19
19
|
|
20
20
|
extensions: []
|
@@ -22,7 +22,18 @@ extensions: []
|
|
22
22
|
extra_rdoc_files:
|
23
23
|
- README
|
24
24
|
files:
|
25
|
-
-
|
25
|
+
- lib/base_scheduler.rb
|
26
|
+
- lib/jruby-quartz.rb
|
27
|
+
- lib/jobs/base_job.rb
|
28
|
+
- lib/jobs/base_job_detail.rb
|
29
|
+
- lib/jobs/base_job_factory.rb
|
30
|
+
- test/integration/jruby_quartz_integration_test.rb
|
31
|
+
- test/unit/base_job_detail_test.rb
|
32
|
+
- test/unit/base_job_factory_test.rb
|
33
|
+
- test/unit/base_job_test.rb
|
34
|
+
- test/unit/base_scheduler_test.rb
|
35
|
+
- test/all_tests.rb
|
36
|
+
- test/test_helper.rb
|
26
37
|
- LICENSE
|
27
38
|
- README
|
28
39
|
- Rakefile
|
@@ -56,5 +67,5 @@ rubygems_version: 1.2.0
|
|
56
67
|
signing_key:
|
57
68
|
specification_version: 2
|
58
69
|
summary: A JRuby implementation of the Quartz scheduling framework that makes it easy to integrate into Ruby and Rails based projects.
|
59
|
-
test_files:
|
60
|
-
|
70
|
+
test_files: []
|
71
|
+
|