Class: Jackal::Callback

Inherits:
Carnivore::Callback
  • Object
show all
Includes:
Utils::Config, Utils::Config, Utils::Constants, Utils::Payload, Utils::Payload
Defined in:
lib/jackal/callback.rb

Overview

Jackal customized callback

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Utils::Constants

#constantize

Methods included from Utils::Config

#config, #config_path, #destination, #service_config, #service_name, #source_prefix

Methods included from Utils::Payload

#new_payload, #unpack

Constructor Details

#initialize(*_) ⇒ self

Create new instance



20
21
22
23
24
25
26
27
# File 'lib/jackal/callback.rb', line 20

def initialize(*_)
  super
  if(service_config[:formatters])
    @formatters = service_config[:formatters].map do |klass_name|
      constantize(klass_name).new
    end
  end
end

Instance Attribute Details

#formattersArray<Formatter> (readonly)

Returns formatters.

Returns:



15
16
17
# File 'lib/jackal/callback.rb', line 15

def formatters
  @formatters
end

Instance Method Details

#apply_formatters!(payload) ⇒ Smash

Apply configured formatters to payload

Parameters:

  • payload (Smash)

Returns:

  • (Smash)


125
126
127
128
129
# File 'lib/jackal/callback.rb', line 125

def apply_formatters!(payload)
  formatters.each do |formatter|
    formatter.format(payload)
  end
end

#completed(payload, message) ⇒ Object

Mark payload complete and forward

Parameters:

  • payload (Hash)
  • message (Carnivore::Message)


85
86
87
88
89
# File 'lib/jackal/callback.rb', line 85

def completed(payload, message)
  message.confirm!
  info "Processing of #{message} complete on this callback"
  forward(payload)
end

#failed(payload, message, reason = 'No reason provided') ⇒ Object

Send payload to error handler

Parameters:

  • payload (Hash)
  • message (Carnivore::Message)
  • reason (String) (defaults to: 'No reason provided')


67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/jackal/callback.rb', line 67

def failed(payload, message, reason='No reason provided')
  error "Processing of #{message} failed! Reason: #{reason}"
  message.confirm!
  destination = "#{source_prefix}_error"
  source = Carnivore::Supervisor.supervisor[destination]
  if(source)
    error "Sending #{message} to error handler: #{source}"
    source.transmit(payload)
  else
    error "No error source found for generated source path: #{destination}"
    info "Processing of message #{message} has completed. Message now discarded."
  end
end

#failure_wrap(message) ⇒ Object

Executes block and catches unexpected exceptions if encountered

Parameters:

  • message (Carnivore::Message)

Returns:

  • (Object)


50
51
52
53
54
55
56
57
58
59
60
# File 'lib/jackal/callback.rb', line 50

def failure_wrap(message)
  abort 'Failure wrap requires block for execution' unless block_given?
  begin
    payload = unpack(message)
    yield payload
  rescue => e
    error "!!! Unexpected failure encountered -> #{e.class}: #{e}"
    debug "#{e.class}: #{e}\n#{(e.backtrace || []).join("\n")}"
    failed(payload, message, e.message)
  end
end

#forward(payload) ⇒ Object

Forward payload to output source

Parameters:

  • payload (Hash)


94
95
96
97
98
99
100
101
102
103
104
105
# File 'lib/jackal/callback.rb', line 94

def forward(payload)
  destination = "#{source_prefix}_output"
  source = Carnivore::Supervisor.supervisor[destination]
  if(source)
    info "Forwarding payload to output destination... (#{source})"
    debug "Forwarded payload: #{payload.inspect}"
    source.transmit(payload)
  else
    warn "No destination source found for generated source path: #{destination}"
    info "Processing of message has completed. Message now discarded."
  end
end

#job_completed(name, payload, message) ⇒ Object

Mark job as completed

Parameters:

  • name (String)
  • payload (Hash)
  • message (Carnivore::Message)


112
113
114
115
116
117
118
119
# File 'lib/jackal/callback.rb', line 112

def job_completed(name, payload, message)
  info "Processing of message #{message} has completed within this component #{name}"
  if(formatters)
    apply_formatters!(payload)
  end
  message.confirm!
  forward(payload)
end

#process_managerUtils::Process

Returns:



30
31
32
33
34
35
# File 'lib/jackal/callback.rb', line 30

def process_manager
  unless(@_process)
    @_process = Utils::Process.new
  end
  @_process
end

#valid?(message) ⇒ TrueClass, FalseClass

Validity of message

Parameters:

  • message (Carnivore::Message)

Returns:

  • (TrueClass, FalseClass)


41
42
43
44
# File 'lib/jackal/callback.rb', line 41

def valid?(message)
  m = unpack(message)
  block_given? ? yield(m) : true
end