Class: AWS::SQS::Client

Inherits:
Object
  • Object
show all
Defined in:
lib/aws/sqs/client.rb

Constant Summary collapse

DEFAULT_SQS_OPTIONS =

default options

{ :endpoint => "http://queue.amazonaws.com" }

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(aws_access_key_id, aws_secret_access_key, options = {}) ⇒ Client

Returns a new instance of Client.



31
32
33
34
35
# File 'lib/aws/sqs/client.rb', line 31

def initialize( aws_access_key_id, aws_secret_access_key, options = {} )
  @aws_access_key_id, @aws_secret_access_key = aws_access_key_id, aws_secret_access_key
  opts = DEFAULT_SQS_OPTIONS.merge(options)
  @endpoint = opts[:endpoint]
end

Instance Attribute Details

#endpointObject (readonly)

Returns the value of attribute endpoint.



20
21
22
# File 'lib/aws/sqs/client.rb', line 20

def endpoint
  @endpoint
end

Instance Method Details

#create_queue(name) ⇒ Object

Create a new queue



55
56
57
58
59
60
61
62
63
64
65
# File 'lib/aws/sqs/client.rb', line 55

def create_queue(name)
 params = {}
params['QueueName'] = name
result = make_request('CreateQueue', queue = "", params)
unless result.include?('Error')
  return AWS::SQS::Queue.new(name, self)
else
	raise Exception, "Amazon SQS Error Code :" + result['Error'][0]['Code'][0] +
	                 "\n" + result['Error'][0]['Message'][0]
  			end
end

#delete_queue(name) ⇒ Object

Delete the specified queue

Note: this will delete ALL messages in your queue, so use this function with caution!



73
74
75
76
77
78
79
80
81
# File 'lib/aws/sqs/client.rb', line 73

def delete_queue(name)
result = make_request('DeleteQueue', queue = name)
unless result.include?('Error')
	return true
else
	raise Exception, "Amazon SQS Error Code :" + result['Error'][0]['Code'][0] +
	                 "\n" + result['Error'][0]['Message'][0]
  			end
end

#list_queuesObject

Get an array of queues



40
41
42
43
44
45
46
47
48
49
50
# File 'lib/aws/sqs/client.rb', line 40

def list_queues()
result = make_request('ListQueues')
value = result['ListQueuesResult']
puts result.to_s
unless value.nil?
	return value
else
	raise Exception, "Amazon SQS Error Code :" + result['Error'][0]['Code'][0] +
	                 "\n" + result['Error'][0]['Message'][0]
  			end
end

#make_request(action, queue = "", params = {}) ⇒ Object

Send a query request and return a SimpleXML object



86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
# File 'lib/aws/sqs/client.rb', line 86

def make_request(action, queue = "", params = {})
# Add Actions
params['Action'] = action
params['Version'] = '2008-01-01'
params['AWSAccessKeyId'] = @aws_access_key_id
params['Expires']= (Time.now + 10).gmtime.iso8601
params['SignatureVersion'] = '1'

# Sign the string
sorted_params = params.sort_by { |key,value| key.downcase }
joined_params = sorted_params.collect { |key, value| key + value}
string_to_sign = joined_params.to_s
digest = OpenSSL::Digest::Digest.new('sha1')
  hmac = OpenSSL::HMAC.digest(digest, @aws_secret_access_key, string_to_sign)
  params['Signature'] = Base64.encode64(hmac).chomp
  
  # Construct request
  query = params.collect { |key, value| key + "=" + CGI.escape(value) }.join("&")
  
  # Set our query, keeping in mind that most (not all) actions require a queue name in the URI
  if query["Action"] == "ListQueues" || query["Action"] == "CreateQueue"
    query = "?" + query
  else
    query = "/" + queue + "?" + query
  end
  
  # You should always retry a 5xx error, as some of these are expected
  retry_count = 0
  			try_again = true
  			uri = URI.parse(self.endpoint)
  http = Net::HTTP.new(uri.host, uri.port)
  request = Net::HTTP::Get.new(query)
  			while try_again do
 # Send Amazon SQS query to endpoint
    response = http.start { |http|
      http.request(request)
    }
    # Check if we should retry this request
    if response == Net::HTTPServerError && retry_count <= 5
		  retry_count ++
		  sleep(retry_count / 4 * retry_count)
  else
    try_again = false
    xml = response.body.to_s
  		return XmlSimple.xml_in(xml)
  end
 end
end