class Tengine::Job::Runtime::Edge

Vertexとともにジョブネットを構成するグラフの「辺」を表すモデル Tengine::Job::Runtime::Jobnetにembeddedされます。

Public Instance Methods

alive?() click to toggle source
# File lib/tengine/job/runtime/edge.rb, line 38
def alive?; !!phase_entry[:alive]; end
alive_or_closing?() click to toggle source
# File lib/tengine/job/runtime/edge.rb, line 39
def alive_or_closing?; alive? || closing?; end
alive_or_closing_or_closed?() click to toggle source
# File lib/tengine/job/runtime/edge.rb, line 40
def alive_or_closing_or_closed?; alive? || closing? || closed?; end
close(signal) click to toggle source
# File lib/tengine/job/runtime/edge.rb, line 124
def close(signal)
  case phase_key
  when :active, :suspended, :keeping, :transmitting then
    self.phase_key = :closing
  when :closing, :closed then
    # ignored
  else
    Tengine.logger.warn "#{object_id} #{inspect} wasn't closed"
  end
end
close_followings(signal, options = {}) click to toggle source
# File lib/tengine/job/runtime/edge.rb, line 135
def close_followings(signal, options = {})
  v = Tengine::Job::Runtime::Edge::Closer.new(signal, options)
  accept_visitor(v)
  v.closed_edges
end
close_followings_and_trasmit(signal) click to toggle source

ownerのupdate_with_lockを使っています。

# File lib/tengine/job/runtime/edge.rb, line 142
def close_followings_and_trasmit(signal)
  jobnet = signal.cache(self.owner)
  closing_edges = nil
  closed_edges = []
  jobnet.update_with_lock do
    closing_edges = self.close_followings(signal)
    closing_edges.each do |e|
      next unless e.owner.id == jobnet.id
      je = signal.cache(e) # jobnet単位で保存するので、jobnetオブエジェクトに紐付けられたものを見つける
      je.close(nil)
      closed_edges << e
    end
    # jobnetオブジェクトのedgesに含まれないエッジについては、そのowner毎にまとめて保存する
    self.transmit(signal)

    Tengine.logger.debug "<" * 100
    Tengine.logger.debug "#{__FILE__}##{__LINE__}"
    jobnet.edges.each do |edge|
      Tengine.logger.debug "#{edge.object_id} #{edge.inspect} BEFORE end of block for update_with_lock"
    end
  end
  # signal.cache_list
  signal.changed_vertecs.each(&:save!)
end
complete(signal) click to toggle source
# File lib/tengine/job/runtime/edge.rb, line 97
def complete(signal)
  case phase_key
  when :transmitting then
    self.phase_key = :transmitted
  when :active, :closed then
    # IG
  when :suspended, :keeping then
    # N/A
    raise Tengine::Job::Runtime::Edge::StatusError, "#{self.class.name}#complete not available on #{phase_key.inspect} at #{self.inspect}"
  end
end
destination() click to toggle source
# File lib/tengine/job/runtime/edge.rb, line 52
def destination
  owner.children.detect{|c| c.id == destination_id}
end
inspect() click to toggle source
# File lib/tengine/job/runtime/edge.rb, line 60
def inspect
  "#<#{self.class.name} #{phase_key.inspect} #{name_for_message}>"
end
name_for_message() click to toggle source
# File lib/tengine/job/runtime/edge.rb, line 56
def name_for_message
  "edge(#{id.to_s}) from #{origin ? origin.name_path : 'no origin'} to #{destination ? destination.name_path : 'no destination'}"
end
origin() click to toggle source
# File lib/tengine/job/runtime/edge.rb, line 48
def origin
  owner.children.detect{|c| c.id == origin_id}
end
phase_key=(phase_key) click to toggle source
# File lib/tengine/job/runtime/edge.rb, line 167
def phase_key=(phase_key)
  # Tengine.logger.debug("edge phase changed. <#{self.id.to_s}> #{self.phase_name} -> #{Tengine::Job::Runtime::Edge.phase_name_by_key(phase_key)}")
  Tengine.logger.debug("#{object_id} edge phase changed. <#{inspect}> #{self.phase_name} -> #{Tengine::Job::Runtime::Edge.phase_name_by_key(phase_key)}")
  self.write_attribute(:phase_cd, Tengine::Job::Runtime::Edge.phase_id_by_key(phase_key))
end
reset(signal) click to toggle source
# File lib/tengine/job/runtime/edge.rb, line 109
def reset(signal)
  # 全てのステータスから遷移する
  if d = destination
    if signal.execution.in_scope?(d)
      self.phase_key = :active

      signal.call_later do
        d.reset(signal)
      end
    end
  else
    raise "destination not found: #{destination_id.inspect} from #{origin.inspect}"
  end
end
transmit(signal) click to toggle source

cacoo.com/diagrams/hdLgrzYsTBBpV3Wj#3E9EA

# File lib/tengine/job/runtime/edge.rb, line 65
  def transmit(signal)
    case phase_key
    when :active then
      d = destination
      if signal.execution.in_scope?(d)
        self.phase_key = :transmitting
        signal.leave(self)
      else
        Tengine.logger.info("#{d.name_path} will not be executed, becauase it is out of execution scope.")
      end
    when :suspended then
      self.phase_key = :keeping
    when :closing then

Tengine.logger.debug "c" * 100
Tengine.logger.debug "#{object_id} #{inspect}"
# Tengine.logger.debug caller[0, 20].join("\n  ")

# binding.pry

      self.phase_key = :closed
      signal.paths << self
      signal.with_paths_backup do
        if destination.is_a?(Tengine::Job::Runtime::NamedVertex)
          signal.cache(destination.next_edges.first).transmit(signal)
        else
          signal.leave(self)
        end
      end
    end
  end