rocketjob 4.3.0.beta2 → 5.0.0.beta

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b5544569821640636a5dc8cd7953f2c0fbadcfa90ec1c7ac029fa4fc249d1269
4
- data.tar.gz: 601088d6918f605b80565d2185872b161e1ccf27d923bd6483fe49ac8d5b2586
3
+ metadata.gz: 3574aea0102c28eece0aefa25631e57d6458e5e7fb1191e464e6e1f885d83128
4
+ data.tar.gz: 7909db1e628d5460c8500d269a9d3af7fe5a15b685065869a4b93a0919db1b63
5
5
  SHA512:
6
- metadata.gz: 9eda8d1c26f5e808f5ef2c1157c032ed490daaf697040a8987951c5ad25f979783796567b536c897317445b413f774fddcbd82ed3898a4578e3de4ece7a91ed7
7
- data.tar.gz: 21744b1a7fad3e03c49367888e4662d0d00f60c671829c54cd8c7174ead64a8b9ce0642c61ae37c063508d5df3c0a7280a78e2bb1f752ac3fcd8e57343bf4a99
6
+ metadata.gz: 22da70f046dea52843f8f3b7b215ab541eb1242db629cb2833a37d9d2afd0743334935824f48cf03ab50c2952f17b84d3fe80134ad3173c5487457dbea22c4ea
7
+ data.tar.gz: '045886026776a1273844b1184ac0e1ce09b681dbce377029869cceab914d23755eea956bda79bf2794f1d4b3b74ef79859d529bd175a5cef717cfa33902c0a32'
data/bin/rocketjob CHANGED
@@ -4,13 +4,5 @@ require 'semantic_logger'
4
4
  require 'rocket_job/cli'
5
5
 
6
6
  # Start a rocketjob server instance from the command line
7
- begin
8
- RocketJob::CLI.new(ARGV).run
9
- rescue Exception => exc
10
- return if exc.class == SystemExit
11
- # Failsafe logger that writes to STDERR
12
- SemanticLogger.add_appender(io: STDERR, level: :error, formatter: :color)
13
- SemanticLogger['RocketJob'].error('Rocket Job shutting down due to exception', exc)
14
- SemanticLogger.flush
15
- exit 1
16
- end
7
+ # Allow Ruby to catch and display any startup exceptions
8
+ RocketJob::CLI.new(ARGV).run
@@ -62,7 +62,7 @@ module RocketJob
62
62
  end
63
63
 
64
64
  # Allow new jobs with a higher priority to interrupt this job
65
- break if (Time.now - start_time) >= Config.instance.re_check_seconds
65
+ break if (Time.now - start_time) >= Config.re_check_seconds
66
66
  end
67
67
  false
68
68
  end
@@ -8,13 +8,10 @@ module RocketJob
8
8
  # Command Line Interface parser for Rocket Job
9
9
  class CLI
10
10
  include SemanticLogger::Loggable
11
- attr_accessor :name, :workers, :environment, :pidfile, :directory, :quiet,
12
- :log_level, :log_file, :mongo_config, :symmetric_encryption_config,
13
- :include_filter, :exclude_filter, :where_filter
11
+ attr_accessor :environment, :pidfile, :directory, :quiet,
12
+ :log_level, :log_file, :mongo_config, :symmetric_encryption_config
14
13
 
15
14
  def initialize(argv)
16
- @name = nil
17
- @workers = nil
18
15
  @quiet = false
19
16
  @environment = nil
20
17
  @pidfile = nil
@@ -40,14 +37,7 @@ module RocketJob
40
37
  # In case Rails did not load the Mongoid Config
41
38
  RocketJob::Config.load!(environment, mongo_config, symmetric_encryption_config) if ::Mongoid::Config.clients.empty?
42
39
 
43
- filter = build_filter
44
-
45
- opts = {}
46
- opts[:name] = name if name
47
- opts[:max_workers] = workers if workers
48
- opts[:filter] = filter if filter
49
-
50
- Supervisor.run(opts)
40
+ Supervisor.run
51
41
  end
52
42
 
53
43
  def rails?
@@ -63,6 +53,8 @@ module RocketJob
63
53
  logger.info "Loading Rails environment: #{environment}"
64
54
  RocketJob.rails!
65
55
 
56
+ require 'rails'
57
+ require 'rocket_job/railtie'
66
58
  boot_file = Pathname.new(directory).join('config/environment.rb').expand_path
67
59
  require(boot_file.to_s)
68
60
 
@@ -153,38 +145,27 @@ module RocketJob
153
145
  end
154
146
  end
155
147
 
156
- # Returns [Hash] a where clause filter to apply to this server.
157
- # Returns nil if no filter should be applied
158
- def build_filter
159
- raise(ArgumentError, 'Cannot supply both a filter and an exclusion filter') if include_filter && exclude_filter
160
-
161
- filter = where_filter
162
- (filter ||= {})['_type'] = include_filter if include_filter
163
- (filter ||= {})['_type'] = {'$not' => exclude_filter} if exclude_filter
164
- filter
165
- end
166
-
167
148
  # Parse command line options placing results in the corresponding instance variables
168
149
  def parse(argv)
169
150
  parser = OptionParser.new do |o|
170
151
  o.on('-n', '--name NAME', 'Unique Name of this server (Default: host_name:PID)') do |arg|
171
- @name = arg
152
+ Config.name = arg
172
153
  end
173
154
  o.on('-w', '--workers COUNT', 'Number of workers (threads) to start') do |arg|
174
- @workers = arg.to_i
155
+ Config.max_workers = arg.to_i
175
156
  end
176
- o.on('-t', '--threads COUNT', 'DEPRECATED') do |arg|
177
- warn '-t and --threads are deprecated, use -w or --workers'
178
- @workers = arg.to_i
157
+ o.on('--include REGEXP', 'Limit this server to only those job classes that match this regular expression (case-insensitive). Example: "DirmonJob|WeeklyReportJob"') do |arg|
158
+ Config.include_filter = Regexp.new(arg, true)
179
159
  end
180
- o.on('-F', '--filter REGEXP', 'Limit this server to only those job classes that match this regular expression (case-insensitive). Example: "DirmonJob|WeeklyReportJob"') do |arg|
181
- @include_filter = Regexp.new(arg, true)
160
+ o.on('-F', '--filter REGEXP', 'DEPRECATED. Use --include') do |arg|
161
+ warn '-F and --filter are deprecated, use --include'
162
+ Config.include_filter = Regexp.new(arg, true)
182
163
  end
183
164
  o.on('-E', '--exclude REGEXP', 'Prevent this server from working on any job classes that match this regular expression (case-insensitive). Example: "DirmonJob|WeeklyReportJob"') do |arg|
184
- @exclude_filter = Regexp.new(arg, true)
165
+ Config.exclude_filter = Regexp.new(arg, true)
185
166
  end
186
167
  o.on('-W', '--where JSON', "Limit this server instance to the supplied mongo query filter. Supply as a string in JSON format. Example: '{\"priority\":{\"$lte\":25}}'") do |arg|
187
- @where_filter = JSON.parse(arg)
168
+ Config.where_filter = JSON.parse(arg)
188
169
  end
189
170
  o.on('-q', '--quiet', 'Do not write to stdout, only to logfile. Necessary when running as a daemon') do
190
171
  @quiet = true
@@ -1,52 +1,75 @@
1
1
  require 'yaml'
2
2
  module RocketJob
3
- # Centralized Configuration for Rocket Jobs
3
+ # Rocket Job Configuration
4
4
  class Config
5
- include Plugins::Document
6
-
7
- # Returns the single instance of the Rocket Job Configuration for this site
8
- # in a thread-safe way
9
- def self.instance
10
- @instance ||= begin
11
- first || create
12
- rescue StandardError
13
- # In case another process has already created the first document
14
- first
15
- end
16
- end
17
-
18
- # DEPRECATED
19
- cattr_accessor(:inline_mode) { false }
5
+ include SemanticLogger::Loggable
20
6
 
21
- store_in collection: 'rocket_job.configs'
7
+ # [String] This Rocket Job Server name
8
+ class_attribute :server_name
9
+ self.server_name = "#{SemanticLogger.host}:#{$$}"
22
10
 
23
- #
24
- # Servers
25
- #
11
+ # [Integer] The maximum number of workers to create on any one server
12
+ class_attribute :max_workers
13
+ self.max_workers = 10
26
14
 
27
- # The maximum number of workers to create on any one server
28
- field :max_workers, type: Integer, default: 10
15
+ # [Integer] Number of seconds between heartbeats from a Rocket Job Server process
16
+ class_attribute :heartbeat_seconds
17
+ self.heartbeat_seconds = 15.0
29
18
 
30
- # Number of seconds between heartbeats from a Rocket Job Server process
31
- field :heartbeat_seconds, type: Integer, default: 15
19
+ # [Integer] Maximum number of seconds a Worker will wait before checking for new jobs
20
+ class_attribute :max_poll_seconds
21
+ self.max_poll_seconds = 5.0
32
22
 
33
- #
34
- # Workers
35
- #
36
-
37
- # Maximum number of seconds a Worker will wait before checking for new jobs
38
- field :max_poll_seconds, type: Integer, default: 5
39
-
40
- # Number of seconds between checking for:
23
+ # [Integer] Number of seconds between checking for:
41
24
  # - Jobs with a higher priority
42
25
  # - If the current job has been paused, or aborted
43
26
  #
44
27
  # Making this interval too short results in too many checks for job status
45
28
  # changes instead of focusing on completing the active tasks
46
29
  #
30
+ # Notes:
31
+ # - Not all job types support pausing in the middle
32
+ #
33
+ # Default: 60 seconds between checks.
34
+ class_attribute :re_check_seconds
35
+ self.re_check_seconds = 60.0
36
+
37
+ # [Regexp] Limit this server to only those job classes that match this regular expression.
38
+ #
47
39
  # Note:
48
- # Not all job types support pausing in the middle
49
- field :re_check_seconds, type: Integer, default: 60
40
+ # - Supply a case insensitive Regexp if required.
41
+ # - Only supply include_filter or exclude_filter, not both.
42
+ #
43
+ # Example:
44
+ # # This server can only work on jobs that include anywhere
45
+ # # in their names: `DirmonJob` or `WeeklyReportJob`
46
+ # RocketJob::Config.include_filter = /DirmonJob|WeeklyReportJob/i
47
+ class_attribute :include_filter
48
+ self.include_filter = nil
49
+
50
+ # [Regexp] Prevent this server from working on any job classes that match this regular expression.
51
+ #
52
+ # Notes:
53
+ # - Supply a case insensitive Regexp if required.
54
+ # - Only supply include_filter or exclude_filter, not both.
55
+ #
56
+ # Example:
57
+ # # This server can only work any job except that that include anywhere
58
+ # # in their names: `DirmonJob` or `WeeklyReportJob`
59
+ # RocketJob::Config.exclude_filter = /DirmonJob|WeeklyReportJob/i
60
+ class_attribute :exclude_filter
61
+ self.exclude_filter = nil
62
+
63
+ # [Hash] Limit this server instance to the supplied mongo query filter.
64
+ #
65
+ # Notes:
66
+ # - Can be supplied together with `include_filter` or `exclude_filter` above.
67
+ #
68
+ # Example:
69
+ # # This server can only work on jobs with priorities between 1 and 25
70
+ # RocketJob::Config.where_filter = { "priority" => {"$lte" => 25}}
71
+ class_attribute :where_filter
72
+ self.where_filter = nil
50
73
 
51
74
  # Configure Mongoid
52
75
  def self.load!(environment = 'development', file_name = nil, encryption_file_name = nil)
@@ -72,5 +95,19 @@ module RocketJob
72
95
  logger.debug "Reading SymmetricEncryption configuration from: #{config_file}"
73
96
  SymmetricEncryption.load!(config_file.to_s, environment)
74
97
  end
98
+
99
+ # Returns [Hash] the where clause built from the filters above:
100
+ # include_filter, exclude_filter, and where_filter.
101
+ # Returns nil if no filter should be applied.
102
+ def self.filter
103
+ if include_filter && exclude_filter
104
+ raise(ArgumentError, 'Cannot supply both an include_filter and an exclude_filter')
105
+ end
106
+
107
+ filter = where_filter
108
+ (filter ||= {})['_type'] = include_filter if include_filter
109
+ (filter ||= {})['_type'] = {'$not' => exclude_filter} if exclude_filter
110
+ filter
111
+ end
75
112
  end
76
113
  end
@@ -70,14 +70,14 @@ module RocketJob
70
70
 
71
71
  # Default throttle to use when the throttle is exceeded.
72
72
  # When the throttle has been exceeded all jobs of this class will be ignored until the
73
- # next refresh. `RocketJob::Config::re_check_seconds` which by default is 60 seconds.
73
+ # next refresh. `RocketJob::Config.re_check_seconds` which by default is 60 seconds.
74
74
  def throttle_filter_class
75
75
  {:_type.nin => [self.class.name]}
76
76
  end
77
77
 
78
78
  # Filter out only this instance of the job.
79
79
  # When the throttle has been exceeded this job will be ignored by this server until the next refresh.
80
- # `RocketJob::Config::re_check_seconds` which by default is 60 seconds.
80
+ # `RocketJob::Config.re_check_seconds` which by default is 60 seconds.
81
81
  def throttle_filter_id
82
82
  {:id.nin => [id]}
83
83
  end
@@ -66,18 +66,6 @@ module RocketJob
66
66
  end
67
67
  end
68
68
 
69
- # DEPRECATED
70
- def perform_later(args, &block)
71
- if RocketJob::Config.inline_mode
72
- perform_now(args, &block)
73
- else
74
- job = new(args)
75
- yield(job) if block
76
- job.save!
77
- job
78
- end
79
- end
80
-
81
69
  private
82
70
 
83
71
  def rocket_job_merge_filter(target, source)
@@ -0,0 +1,36 @@
1
+ module RocketJob
2
+ class Railtie < Rails::Railtie
3
+ # Exposes Rocket Job's configuration to the Rails application configuration.
4
+ #
5
+ # @example Set up configuration in the Rails app.
6
+ # module MyApplication
7
+ # class Application < Rails::Application
8
+ # # The maximum number of workers to create on any one server. (Default: 10)
9
+ # config.rocket_job.max_workers = config.secret_config.fetch("rocket_job/max_workers", type: :integer, default: 10)
10
+ #
11
+ # # Number of seconds between heartbeats from a Rocket Job Server process. (Default: 15)
12
+ # config.rocket_job.heartbeat_seconds = config.secret_config.fetch("rocket_job/heartbeat_seconds", type: :float, default: 15.0)
13
+ #
14
+ # # Maximum number of seconds a Worker will wait before checking for new jobs. (Default: 5)
15
+ # config.rocket_job.max_poll_seconds = config.secret_config.fetch("rocket_job/max_poll_seconds", type: :float, default: 5.0)
16
+ #
17
+ # # Number of seconds between checking for:
18
+ # # - Jobs with a higher priority
19
+ # # - If the current job has been paused, or aborted
20
+ # #
21
+ # # Making this interval too short results in too many checks for job status
22
+ # # changes instead of focusing on completing the active tasks
23
+ # #
24
+ # # Note:
25
+ # # Not all job types support pausing in the middle
26
+ # # Default: 60 seconds between checks.
27
+ # config.rocket_job.re_check_seconds = config.secret_config.fetch("rocket_job/re_check_seconds", type: :float, default: 60.0)
28
+ #
29
+ # config.rocket_job.include_filter = config.secret_config["rocket_job/include_filter"]
30
+ # config.rocket_job.exclude_filter = config.secret_config["rocket_job/exclude_filter"]
31
+ # config.rocket_job.where_filter = config.secret_config["rocket_job/where_filter"]
32
+ # end
33
+ # end
34
+ config.rocket_job = Config
35
+ end
36
+ end
@@ -14,18 +14,15 @@ module RocketJob
14
14
  # Default: `host name:PID`
15
15
  # The unique name is used on re-start to re-queue any jobs that were being processed
16
16
  # at the time the server unexpectedly terminated, if any
17
- field :name, type: String, default: -> { "#{SemanticLogger.host}:#{$$}" }
17
+ field :name, type: String, default: -> { Config.server_name }
18
18
 
19
19
  # The maximum number of workers this server should start
20
20
  # If set, it will override the default value in RocketJob::Config
21
- field :max_workers, type: Integer, default: -> { Config.instance.max_workers }
21
+ field :max_workers, type: Integer, default: -> { Config.max_workers }
22
22
 
23
23
  # When this server process was started
24
24
  field :started_at, type: Time
25
25
 
26
- # Filter to apply to control which job classes this server can process
27
- field :yaml_filter, type: String
28
-
29
26
  # The heartbeat information for this server
30
27
  embeds_one :heartbeat, class_name: 'RocketJob::Heartbeat'
31
28
 
@@ -82,7 +79,7 @@ module RocketJob
82
79
 
83
80
  # Scope for all zombie servers
84
81
  def self.zombies(missed = 4)
85
- dead_seconds = Config.instance.heartbeat_seconds * missed
82
+ dead_seconds = Config.heartbeat_seconds * missed
86
83
  last_heartbeat_time = Time.now - dead_seconds
87
84
  where(
88
85
  :state.in => %i[stopping running paused],
@@ -94,15 +91,6 @@ module RocketJob
94
91
  end
95
92
  end
96
93
 
97
- # Where clause filter to apply to workers looking for jobs
98
- def filter
99
- YAML.load(yaml_filter) if yaml_filter
100
- end
101
-
102
- def filter=(hash)
103
- self.yaml_filter = hash.nil? ? nil : hash.to_yaml
104
- end
105
-
106
94
  # Returns [true|false] if this server has missed at least the last 4 heartbeats
107
95
  #
108
96
  # Possible causes for a server to miss its heartbeats:
@@ -112,7 +100,7 @@ module RocketJob
112
100
  def zombie?(missed = 4)
113
101
  return false unless running? || stopping? || paused?
114
102
  return true if heartbeat.nil? || heartbeat.updated_at.nil?
115
- dead_seconds = Config.instance.heartbeat_seconds * missed
103
+ dead_seconds = Config.heartbeat_seconds * missed
116
104
  (Time.now - heartbeat.updated_at) >= dead_seconds
117
105
  end
118
106
 
@@ -10,12 +10,12 @@ module RocketJob
10
10
  attr_accessor :worker_id
11
11
 
12
12
  # Start the Supervisor, using the supplied attributes to create a new Server instance.
13
- def self.run(attrs = {})
13
+ def self.run
14
14
  Thread.current.name = 'rocketjob main'
15
15
  RocketJob.create_indexes
16
16
  register_signal_handlers
17
17
 
18
- server = Server.create!(attrs)
18
+ server = Server.create!
19
19
  new(server).run
20
20
  ensure
21
21
  server&.destroy
@@ -23,13 +23,13 @@ module RocketJob
23
23
 
24
24
  def initialize(server)
25
25
  @server = server
26
- @worker_pool = WorkerPool.new(server.name, server.filter)
26
+ @worker_pool = WorkerPool.new(server.name)
27
27
  @mutex = Mutex.new
28
28
  end
29
29
 
30
30
  def run
31
31
  logger.info "Using MongoDB Database: #{RocketJob::Job.collection.database.name}"
32
- logger.info('Running with filter', server.filter) if server.filter
32
+ logger.info('Running with filter', Config.filter) if Config.filter
33
33
  server.started!
34
34
  logger.info 'Rocket Job Server started'
35
35
 
@@ -81,7 +81,7 @@ module RocketJob
81
81
  end
82
82
  end
83
83
 
84
- self.class.wait_for_event(Config.instance.heartbeat_seconds)
84
+ self.class.wait_for_event(Config.heartbeat_seconds)
85
85
 
86
86
  break if self.class.shutdown?
87
87
 
@@ -1,3 +1,3 @@
1
1
  module RocketJob
2
- VERSION = '4.3.0.beta2'.freeze
2
+ VERSION = '5.0.0.beta'.freeze
3
3
  end
@@ -11,7 +11,7 @@ module RocketJob
11
11
 
12
12
  define_callbacks :running
13
13
 
14
- attr_accessor :id, :re_check_seconds, :filter, :current_filter
14
+ attr_accessor :id, :current_filter
15
15
  attr_reader :thread, :name, :inline
16
16
 
17
17
  # Raised when a worker is killed so that it shutdown immediately, yet cleanly.
@@ -33,21 +33,15 @@ module RocketJob
33
33
  set_callback(:running, :around, *filters, &blk)
34
34
  end
35
35
 
36
- def initialize(id: 0,
37
- server_name: 'inline:0',
38
- inline: false,
39
- re_check_seconds: Config.instance.re_check_seconds,
40
- filter: nil)
41
- @id = id
42
- @server_name = server_name
43
- @shutdown = Concurrent::Event.new
44
- @name = "#{server_name}:#{id}"
45
- @re_check_seconds = (re_check_seconds || 60).to_f
46
- @re_check_start = Time.now
47
- @filter = filter.nil? ? {} : filter.dup
48
- @current_filter = @filter.dup
49
- @thread = Thread.new { run } unless inline
50
- @inline = inline
36
+ def initialize(id: 0, server_name: 'inline:0', inline: false)
37
+ @id = id
38
+ @server_name = server_name
39
+ @shutdown = Concurrent::Event.new
40
+ @name = "#{server_name}:#{id}"
41
+ @re_check_start = Time.now
42
+ @current_filter = Config.filter || {}
43
+ @thread = Thread.new { run } unless inline
44
+ @inline = inline
51
45
  end
52
46
 
53
47
  def alive?
@@ -93,7 +87,7 @@ module RocketJob
93
87
  Thread.current.name = format('rocketjob %03i', id)
94
88
  logger.info 'Started'
95
89
  until shutdown?
96
- wait = RocketJob::Config.instance.max_poll_seconds
90
+ wait = Config.max_poll_seconds
97
91
  if process_available_jobs
98
92
  # Keeps workers staggered across the poll interval so that
99
93
  # all workers don't poll at the same time
@@ -131,10 +125,10 @@ module RocketJob
131
125
  def reset_filter_if_expired
132
126
  # Only clear out the current_filter after every `re_check_seconds`
133
127
  time = Time.now
134
- return unless (time - @re_check_start) > re_check_seconds
128
+ return unless (time - @re_check_start) > Config.re_check_seconds
135
129
 
136
130
  @re_check_start = time
137
- self.current_filter = filter.dup if current_filter != filter
131
+ self.current_filter = Config.filter
138
132
  end
139
133
  end
140
134
  end
@@ -5,11 +5,10 @@ module RocketJob
5
5
  class WorkerPool
6
6
  include SemanticLogger::Loggable
7
7
 
8
- attr_reader :server_name, :filter, :workers
8
+ attr_reader :server_name, :workers
9
9
 
10
- def initialize(server_name, filter)
10
+ def initialize(server_name)
11
11
  @server_name = server_name
12
- @filter = filter
13
12
  @workers = Concurrent::Array.new
14
13
  @worker_id = 0
15
14
  end
@@ -34,7 +33,7 @@ module RocketJob
34
33
 
35
34
  add_one
36
35
  count -= 1
37
- delay = Config.instance.max_poll_seconds.to_f / max_workers
36
+ delay = Config.max_poll_seconds.to_f / max_workers
38
37
 
39
38
  count.times.each do
40
39
  sleep(delay) if stagger_start
@@ -90,7 +89,7 @@ module RocketJob
90
89
  private
91
90
 
92
91
  def add_one
93
- workers << Worker.new(id: next_worker_id, server_name: server_name, filter: filter)
92
+ workers << Worker.new(id: next_worker_id, server_name: server_name)
94
93
  rescue StandardError => exc
95
94
  logger.fatal('Cannot start worker', exc)
96
95
  end
data/lib/rocketjob.rb CHANGED
@@ -4,6 +4,8 @@ require 'mongoid'
4
4
  require 'rocket_job/extensions/mongo/logging'
5
5
  require 'rocket_job/version'
6
6
  require 'rocket_job/rocket_job'
7
+ require 'rocket_job/config'
8
+ require 'rocket_job/railtie' if defined?(Rails)
7
9
 
8
10
  # Apply patches to implement `with_collection`
9
11
  if Mongoid::VERSION.to_i >= 6
@@ -21,7 +23,6 @@ module RocketJob
21
23
  autoload :ActiveWorker, 'rocket_job/active_worker'
22
24
  autoload :Batch, 'rocket_job/batch'
23
25
  autoload :CLI, 'rocket_job/cli'
24
- autoload :Config, 'rocket_job/config'
25
26
  autoload :DirmonEntry, 'rocket_job/dirmon_entry'
26
27
  autoload :Event, 'rocket_job/event'
27
28
  autoload :Heartbeat, 'rocket_job/heartbeat'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rocketjob
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.3.0.beta2
4
+ version: 5.0.0.beta
5
5
  platform: ruby
6
6
  authors:
7
7
  - Reid Morrison
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-10-24 00:00:00.000000000 Z
11
+ date: 2019-10-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aasm
@@ -155,6 +155,7 @@ files:
155
155
  - lib/rocket_job/plugins/singleton.rb
156
156
  - lib/rocket_job/plugins/state_machine.rb
157
157
  - lib/rocket_job/plugins/transaction.rb
158
+ - lib/rocket_job/railtie.rb
158
159
  - lib/rocket_job/rocket_job.rb
159
160
  - lib/rocket_job/server.rb
160
161
  - lib/rocket_job/server/model.rb