lib/rocket_job/plugins/state_machine.rb in rocketjob-3.0.0 vs lib/rocket_job/plugins/state_machine.rb in rocketjob-3.0.1
- old
+ new
@@ -1,6 +1,7 @@
# encoding: UTF-8
+require 'thread'
require 'active_support/concern'
require 'aasm'
require 'rocket_job/extensions/aasm'
module RocketJob
@@ -26,10 +27,11 @@
# puts "Oh no, the job has failed with an exception"
# end
# end
module StateMachine
extend ActiveSupport::Concern
+ @@aasm_mutex = Mutex.new
included do
include AASM
# Try to make aasm lookup thread safe
@aasm = Concurrent::Map.new
@@ -40,31 +42,33 @@
# state_machine_add_event_callback(:start, :before, :my_method)
def self.state_machine_add_event_callback(event_name, action, *methods, &block)
raise(ArgumentError, 'Cannot supply both a method name and a block') if (methods.size > 0) && block
raise(ArgumentError, 'Must supply either a method name or a block') unless (methods.size > 0) || block
- # TODO Somehow get AASM to support options such as :if and :unless to be consistent with other callbacks
- # For example:
- # before_start :my_callback, unless: :encrypted?
- # before_start :my_callback, if: :encrypted?
- if event = aasm.state_machine.events[event_name]
- values = Array(event.options[action])
- code =
- if block
- block
- else
- # Validate methods are any of Symbol String Proc
- methods.each do |method|
- unless method.is_a?(Symbol) || method.is_a?(String)
- raise(ArgumentError, "#{action}_#{event_name} currently does not support any options. Only Symbol and String method names can be supplied.")
+ @@aasm_mutex.synchronize do
+ # TODO Somehow get AASM to support options such as :if and :unless to be consistent with other callbacks
+ # For example:
+ # before_start :my_callback, unless: :encrypted?
+ # before_start :my_callback, if: :encrypted?
+ if event = aasm.state_machine.events[event_name]
+ values = Array(event.options[action])
+ code =
+ if block
+ block
+ else
+ # Validate methods are any of Symbol String Proc
+ methods.each do |method|
+ unless method.is_a?(Symbol) || method.is_a?(String)
+ raise(ArgumentError, "#{action}_#{event_name} currently does not support any options. Only Symbol and String method names can be supplied.")
+ end
end
+ methods
end
- methods
- end
- action == :before ? values.push(code) : values.unshift(code)
- event.options[action] = values.flatten.uniq
- else
- raise(ArgumentError, "Unknown event: #{event_name.inspect}")
+ action == :before ? values.push(code) : values.unshift(code)
+ event.options[action] = values.flatten.uniq
+ else
+ raise(ArgumentError, "Unknown event: #{event_name.inspect}")
+ end
end
end
def self.state_machine_define_event_callbacks(*event_names)
event_names.each do |event_name|