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 (also: #error!)
- #errored? ⇒ Boolean
- #finish ⇒ Object
- #finish! ⇒ Object
- #rescue ⇒ Object
- #rescue! ⇒ Object
- #resume ⇒ Object
- #resume! ⇒ Object
- #suspend ⇒ 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
167 168 169 170 171 172 173 174 175 176 |
# File 'app/models/flow_core/task.rb', line 167 def create_output_token return if output_token_created with_transaction_returning_status do transition.create_output_tokens_for(self) update! output_token_created: true true end end |
#enable ⇒ Object
80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
# File 'app/models/flow_core/task.rb', line 80 def enable return false unless can_enable? status = with_transaction_returning_status do input_free_tokens.each(&:lock!) update! stage: :enabled, enabled_at: Time.zone.now transition.on_task_enable(self) true end try_auto_finish if status status end |
#enable! ⇒ Object
178 179 180 |
# File 'app/models/flow_core/task.rb', line 178 def enable! enable || raise(FlowCore::InvalidTransition, "Can't enable Task##{id}") end |
#error(error) ⇒ Object Also known as: error!
129 130 131 132 133 134 135 |
# File 'app/models/flow_core/task.rb', line 129 def error(error) update! errored_at: Time.zone.now, error_reason: error. instance.update! errored_at: Time.zone.now transition.on_task_errored(self, error) true end |
#errored? ⇒ Boolean
45 46 47 |
# File 'app/models/flow_core/task.rb', line 45 def errored? errored_at.present? end |
#finish ⇒ Object
98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 |
# File 'app/models/flow_core/task.rb', line 98 def finish return false unless can_finish? with_transaction_returning_status 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_finish(self) true end create_output_token end |
#finish! ⇒ Object
182 183 184 |
# File 'app/models/flow_core/task.rb', line 182 def finish! finish || raise(FlowCore::InvalidTransition, "Can't finish Task##{id}") end |
#rescue ⇒ Object
137 138 139 140 141 142 143 144 145 146 147 |
# File 'app/models/flow_core/task.rb', line 137 def rescue return unless errored? with_transaction_returning_status do update! errored_at: nil, rescued_at: Time.zone.now instance.update! errored_at: nil, rescued_at: Time.zone.now transition.on_task_rescue(self) true end end |
#rescue! ⇒ Object
192 193 194 |
# File 'app/models/flow_core/task.rb', line 192 def rescue! self.rescue || raise(FlowCore::InvalidTransition, "Can't rescue Task##{id}") end |
#resume ⇒ Object
158 159 160 161 162 163 164 165 |
# File 'app/models/flow_core/task.rb', line 158 def resume with_transaction_returning_status do update! suspended_at: nil, resumed_at: Time.zone.now transition.on_task_resume(self) true end end |
#resume! ⇒ Object
200 201 202 |
# File 'app/models/flow_core/task.rb', line 200 def resume! resume || raise(FlowCore::InvalidTransition, "Can't resume Task##{id}") end |
#suspend ⇒ Object
149 150 151 152 153 154 155 156 |
# File 'app/models/flow_core/task.rb', line 149 def suspend with_transaction_returning_status do update! suspended_at: Time.zone.now transition.on_task_suspend(self) true end end |
#suspend! ⇒ Object
196 197 198 |
# File 'app/models/flow_core/task.rb', line 196 def suspend! suspend || raise(FlowCore::InvalidTransition, "Can't suspend Task##{id}") end |
#suspended? ⇒ Boolean
49 50 51 |
# File 'app/models/flow_core/task.rb', line 49 def suspended? suspended_at.present? end |
#terminate(reason:) ⇒ Object
118 119 120 121 122 123 124 125 126 127 |
# File 'app/models/flow_core/task.rb', line 118 def terminate(reason:) return false unless can_terminate? with_transaction_returning_status do update! stage: :terminated, terminated_at: Time.zone.now, terminate_reason: reason transition.on_task_terminate(self) true end end |
#terminate!(reason:) ⇒ Object
186 187 188 |
# File 'app/models/flow_core/task.rb', line 186 def terminate!(reason:) terminate(reason: reason) || raise(FlowCore::InvalidTransition, "Can't terminate Task##{id}") end |