Class: FlowCore::Task
- Inherits:
-
ApplicationRecord
- Object
- ActiveRecord::Base
- ApplicationRecord
- FlowCore::Task
- Defined in:
- app/models/flow_core/task.rb
Instance Method Summary collapse
- #can_enable? ⇒ Boolean
- #can_finish? ⇒ Boolean
- #can_terminate? ⇒ Boolean
- #create_output_token! ⇒ Object
- #enable ⇒ Object
- #enable! ⇒ Object
- #error!(error) ⇒ Object
- #errored? ⇒ Boolean
- #finish ⇒ Object
- #finish! ⇒ Object
- #rescue! ⇒ Object
- #resume! ⇒ Object
- #suspend! ⇒ Object
- #suspended? ⇒ Boolean
- #terminate(reason:) ⇒ Object
- #terminate!(reason:) ⇒ Object
Instance Method Details
#can_enable? ⇒ Boolean
53 54 55 56 57 58 59 60 61 62 |
# File 'app/models/flow_core/task.rb', line 53 def can_enable? return false unless created? if input_free_tokens.size == transition.input_arcs.size return true end # Note: It's impossible of it create by a token and needs another token (AND join) to enable? same_origin_tasks.enabled.any? end |
#can_finish? ⇒ Boolean
64 65 66 67 68 69 70 71 72 73 74 |
# File 'app/models/flow_core/task.rb', line 64 def can_finish? return false unless enabled? return false if errored? || suspended? if executable executable.finished? else true end end |
#can_terminate? ⇒ Boolean
76 77 78 |
# File 'app/models/flow_core/task.rb', line 76 def can_terminate? created? || enabled? end |
#create_output_token! ⇒ Object
170 171 172 173 174 175 176 177 |
# File 'app/models/flow_core/task.rb', line 170 def create_output_token! return if output_token_created transaction do transition.create_tokens_for_output(task: self) update! output_token_created: true end end |
#enable ⇒ Object
80 81 82 83 84 85 86 87 88 89 90 91 |
# File 'app/models/flow_core/task.rb', line 80 def enable return false unless can_enable? transaction do input_free_tokens.each(&:lock!) update! stage: :enabled, enabled_at: Time.zone.now transition.on_task_enabled(self) end true end |
#enable! ⇒ Object
124 125 126 |
# File 'app/models/flow_core/task.rb', line 124 def enable! enable || raise(FlowCore::InvalidTransition, "Can't enable Task##{id}") end |
#error!(error) ⇒ Object
136 137 138 139 140 141 142 143 |
# File 'app/models/flow_core/task.rb', line 136 def error!(error) transaction do update! errored_at: Time.zone.now, error_reason: error. transition.on_task_errored(self, error) instance.error! end end |
#errored? ⇒ Boolean
45 46 47 |
# File 'app/models/flow_core/task.rb', line 45 def errored? errored_at.present? end |
#finish ⇒ Object
93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
# File 'app/models/flow_core/task.rb', line 93 def finish return false unless can_finish? transaction do # terminate other racing tasks instance.tasks.enabled.where(created_by_token: created_by_token).find_each do |task| task.terminate! reason: "Same origin task #{id} finished" end input_locked_tokens.each { |token| token.consume! by: self } update! stage: :finished, finished_at: Time.zone.now transition.on_task_finished(self) end create_output_token! true end |
#finish! ⇒ Object
128 129 130 |
# File 'app/models/flow_core/task.rb', line 128 def finish! finish || raise(FlowCore::InvalidTransition, "Can't finish Task##{id}") end |
#rescue! ⇒ Object
145 146 147 148 149 150 151 152 153 154 |
# File 'app/models/flow_core/task.rb', line 145 def rescue! return unless errored? transaction do update! errored_at: nil, rescued_at: Time.zone.now transition.on_task_rescued(self) instance.rescue! end end |
#resume! ⇒ Object
163 164 165 166 167 168 |
# File 'app/models/flow_core/task.rb', line 163 def resume! transaction do update! suspended_at: nil, resumed_at: Time.zone.now transition.on_task_resumed(self) end end |
#suspend! ⇒ Object
156 157 158 159 160 161 |
# File 'app/models/flow_core/task.rb', line 156 def suspend! transaction do update! suspended_at: Time.zone.now transition.on_task_suspended(self) end end |
#suspended? ⇒ Boolean
49 50 51 |
# File 'app/models/flow_core/task.rb', line 49 def suspended? suspended_at.present? end |
#terminate(reason:) ⇒ Object
113 114 115 116 117 118 119 120 121 122 |
# File 'app/models/flow_core/task.rb', line 113 def terminate(reason:) return false unless can_terminate? transaction do update! stage: :terminated, terminated_at: Time.zone.now, terminate_reason: reason transition.on_task_terminated(self) end true end |
#terminate!(reason:) ⇒ Object
132 133 134 |
# File 'app/models/flow_core/task.rb', line 132 def terminate!(reason:) terminate(reason: reason) || raise(FlowCore::InvalidTransition, "Can't terminate Task##{id}") end |