Class: Carnivore::Http::RetryDelivery

Inherits:
Object
  • Object
show all
Includes:
Utils::Logging, Zoidberg::SoftShell, Zoidberg::Supervise
Defined in:
lib/carnivore-http/retry_delivery.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(directory) ⇒ self

Create new instance

Parameters:

  • directory (String)

    path to messages



19
20
21
22
# File 'lib/carnivore-http/retry_delivery.rb', line 19

def initialize(directory)
  @message_directory = directory
  Thread.new{ every(60){ attempt_redelivery } }
end

Instance Attribute Details

#message_directoryString (readonly)

Returns message directory.

Returns:

  • (String)

    message directory



13
14
15
# File 'lib/carnivore-http/retry_delivery.rb', line 13

def message_directory
  @message_directory
end

Instance Method Details

#attempt_redelivery(message_id = '*') ⇒ TrueClass, FalseClass

Note:

will not attempt if attempt is currently in progress

Attempt to deliver messages found in message directory

Returns:

  • (TrueClass, FalseClass)

    attempt was made



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/carnivore-http/retry_delivery.rb', line 28

def attempt_redelivery(message_id = '*')
  attempt = false
  begin
    unless(@delivering)
      @delivering = true
      attempt = true
      Dir.glob(File.join(message_directory, "#{message_id}.json")).each do |file|
        debug "Redelivery processing: #{file}"
        begin
          args = MultiJson.load(File.read(file)).to_smash
          debug "Restored from file #{file}: #{args.inspect}"
          if(redeliver(args[:message_id], args[:payload], args[:method], args[:url], args[:headers]))
            FileUtils.rm(file)
          end
        rescue => e
          error "Failed to process file (#{file}): #{e.class}: #{e}"
          debug "#{e.class}: #{e}\n#{e.backtrace.join("\n")}"
        end
      end
    end
  rescue => e
    error "Unexpected error encountered during message redelivery! #{e.class}: #{e}"
    debug "#{e.class}: #{e}\n#{e.backtrace.join("\n")}"
  ensure
    @delivering = false
  end
  attempt
end

#redeliver(message_id, payload, method, url, headers) ⇒ TrueClass, FalseClass

Attempt redelivery of message

Parameters:

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

    serialized payload

  • method (Symbol)

    HTTP method (:get, :post, etc)

  • url (String)

    endpoint URL

  • headers (Hash)

    request headers

Returns:

  • (TrueClass, FalseClass)

    redelivery was successful



65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/carnivore-http/retry_delivery.rb', line 65

def redeliver(message_id, payload, method, url, headers)
  begin
    base = headers.empty? ? HTTP : HTTP.with_headers(headers)
    uri = URI.parse(url)
    if(uri.userinfo)
      base = base.basic_auth(:user => uri.user, :pass => uri.password)
    end
    if(payload.is_a?(String))
      begin
        payload = MultiJson.load(payload)
      rescue MultiJson::ParseError
        # ignore
      end
    end
    result = base.send(method, url,
      payload.is_a?(Hash) ? :json : :body => payload
    )
    if(result.code < 200 || result.code > 299)
      error "Invalid response code received for #{message_id}: #{result.code} - #{result.reason}"
      false
    else
      info "Successful delivery of message on retry! Message ID: #{message_id}"
      true
    end
  rescue => e
    error "Transmission redelivery failure (Message ID: #{message_id}) - #{e.class}: #{e}"
    debug "#{e.class}: #{e}\n#{e.backtrace.join("\n")}"
    false
  end
end