Class: Carnivore::Http::RetryDelivery

Inherits:
Object
  • Object
show all
Includes:
Utils::Logging, Celluloid
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



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

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

Instance Attribute Details

#message_directoryString (readonly)

Returns message directory.

Returns:

  • (String)

    message directory



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

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



27
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
# File 'lib/carnivore-http/retry_delivery.rb', line 27

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



64
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
# File 'lib/carnivore-http/retry_delivery.rb', line 64

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