Class: FlowCore::Task

Inherits:
ApplicationRecord show all
Defined in:
app/models/flow_core/task.rb

Instance Method Summary collapse

Instance Method Details

#can_enable?Boolean

Returns:

  • (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

Returns:

  • (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

Returns:

  • (Boolean)


76
77
78
# File 'app/models/flow_core/task.rb', line 76

def can_terminate?
  created? || enabled?
end

#create_output_tokenObject



169
170
171
172
173
174
175
176
177
178
# File 'app/models/flow_core/task.rb', line 169

def create_output_token
  return if output_token_created

  with_transaction_returning_status do
    transition.create_tokens_for_output(task: self)
    update! output_token_created: true

    true
  end
end

#enableObject



80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'app/models/flow_core/task.rb', line 80

def enable
  return false unless can_enable?

  with_transaction_returning_status do
    input_free_tokens.each(&:lock!)
    update! stage: :enabled, enabled_at: Time.zone.now

    transition.on_task_enable(self)
    workflow.on_instance_task_enable(self)

    true
  end
end

#enable!Object



180
181
182
# File 'app/models/flow_core/task.rb', line 180

def enable!
  enable || raise(FlowCore::InvalidTransition, "Can't enable Task##{id}")
end

#error(error) ⇒ Object Also known as: error!



127
128
129
130
131
132
133
134
# File 'app/models/flow_core/task.rb', line 127

def error(error)
  update! errored_at: Time.zone.now, error_reason: error.message
  instance.update! errored_at: Time.zone.now
  transition.on_task_errored(self, error)
  workflow.on_instance_task_errored(self, error)

  true
end

#errored?Boolean

Returns:

  • (Boolean)


45
46
47
# File 'app/models/flow_core/task.rb', line 45

def errored?
  errored_at.present?
end

#finishObject



94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# File 'app/models/flow_core/task.rb', line 94

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)
    workflow.on_instance_task_finish(self)

    true
  end

  create_output_token
end

#finish!Object



184
185
186
# File 'app/models/flow_core/task.rb', line 184

def finish!
  finish || raise(FlowCore::InvalidTransition, "Can't finish Task##{id}")
end

#rescueObject



136
137
138
139
140
141
142
143
144
145
146
147
# File 'app/models/flow_core/task.rb', line 136

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)
    workflow.on_instance_task_rescue(self)

    true
  end
end

#rescue!Object



194
195
196
# File 'app/models/flow_core/task.rb', line 194

def rescue!
  self.rescue || raise(FlowCore::InvalidTransition, "Can't rescue Task##{id}")
end

#resumeObject



159
160
161
162
163
164
165
166
167
# File 'app/models/flow_core/task.rb', line 159

def resume
  with_transaction_returning_status do
    update! suspended_at: nil, resumed_at: Time.zone.now
    transition.on_task_resume(self)
    workflow.on_instance_task_resume(self)

    true
  end
end

#resume!Object



202
203
204
# File 'app/models/flow_core/task.rb', line 202

def resume!
  resume || raise(FlowCore::InvalidTransition, "Can't resume Task##{id}")
end

#suspendObject



149
150
151
152
153
154
155
156
157
# 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)
    workflow.on_instance_task_suspend(self)

    true
  end
end

#suspend!Object



198
199
200
# File 'app/models/flow_core/task.rb', line 198

def suspend!
  suspend || raise(FlowCore::InvalidTransition, "Can't suspend Task##{id}")
end

#suspended?Boolean

Returns:

  • (Boolean)


49
50
51
# File 'app/models/flow_core/task.rb', line 49

def suspended?
  suspended_at.present?
end

#terminate(reason:) ⇒ Object



115
116
117
118
119
120
121
122
123
124
125
# File 'app/models/flow_core/task.rb', line 115

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)
    workflow.on_instance_task_terminate(self)

    true
  end
end

#terminate!(reason:) ⇒ Object



188
189
190
# File 'app/models/flow_core/task.rb', line 188

def terminate!(reason:)
  terminate(reason: reason) || raise(FlowCore::InvalidTransition, "Can't terminate Task##{id}")
end