Class: Legion::Extensions::Actors::Every

Inherits:
Object
  • Object
show all
Extended by:
Dsl
Includes:
Base, Fingerprint
Defined in:
lib/legion/extensions/actors/every.rb

Constant Summary

Constants included from Helpers::Base

Helpers::Base::NAMESPACE_BOUNDARIES

Instance Method Summary collapse

Methods included from Dsl

define_dsl_accessor

Methods included from Fingerprint

#compute_fingerprint, #fingerprint_source, #skip_if_unchanged?, #skip_or_run, #store_fingerprint!, #unchanged?

Methods included from Base

#args, #check_subtask?, #enabled?, #function, #generate_task?, included, #manual, #remote_invocable?, #runner, #use_runner?

Methods included from Helpers::Lex

#default_settings, included, #runner_desc

Methods included from Helpers::Base

#actor_class, #actor_const, #actor_name, #amqp_prefix, #calling_class, #calling_class_array, #find_gem_path, #from_json, #full_path, #lex_class, #lex_const, #lex_name, #lex_slug, #log_tag, #normalize, #runner_class, #runner_const, #runner_name, #segments, #settings_path, #table_prefix, #to_dotted_hash

Methods included from Helpers::Task

#generate_task_id, #generate_task_log, #task_update

Methods included from Helpers::Logger

#handle_runner_exception

Methods included from Helpers::Secret

reset_identity!, resolve_identity!, #secret

Methods included from Helpers::Core

#find_setting

Constructor Details

#initialize(**_opts) ⇒ Every



19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/legion/extensions/actors/every.rb', line 19

def initialize(**_opts)
  @executing = Concurrent::AtomicBoolean.new(false)
  @timer = Concurrent::TimerTask.new(execution_interval: time, run_now: run_now?) do
    if @executing.make_true
      begin
        log.debug "[Every] tick: #{self.class}" if defined?(log)
        skip_or_run { use_runner? ? runner : manual }
      rescue StandardError => e
        log.error "[Every] tick failed for #{self.class}: #{e.class}: #{e.message}" if defined?(log)
        handle_exception(e) if defined?(log)
      ensure
        @executing.make_false
      end
    elsif defined?(log)
      log.debug "[Every] skipped (previous still running): #{self.class}"
    end
  end

  initial_delay = respond_to?(:delay) ? delay.to_f : 0
  if initial_delay.positive?
    Concurrent::ScheduledTask.execute(initial_delay) { @timer.execute }
  else
    @timer.execute
  end
rescue StandardError => e
  handle_exception(e)
end

Instance Method Details

#action(**_opts) ⇒ Object



51
52
53
# File 'lib/legion/extensions/actors/every.rb', line 51

def action(**_opts)
  log.warn 'An extension is using the default block from Legion::Extensions::Runners::Every'
end

#cancelObject



55
56
57
58
59
60
61
62
# File 'lib/legion/extensions/actors/every.rb', line 55

def cancel
  log.debug 'Cancelling Legion Timer'
  return true unless @timer.respond_to?(:shutdown)

  @timer.shutdown
rescue StandardError => e
  handle_exception(e)
end

#run_now?Boolean



47
48
49
# File 'lib/legion/extensions/actors/every.rb', line 47

def run_now?
  run_now
end