Введение
Microsoft не зря активно продвигает и развивает Azure - добрался он и до нас. И несмотря на то, что наиболее комфортно в азуре себя чувствуют .NET приложения, иногда возникают задачи интеграции с такими приложениями из платформ, далеких от .NET.Недавно у нас возникла задача такой интеграции из системы, написанной на Ruby. Интеграционный сценарий просто: необходимо передать в .NET приложение некоторое событие. А как это надежнее всего сделать с .NET приложением, близким к Azure? Правильно! Надо использовать MS Azure Queue.
Сегодня я покажу, как использовать MS Azure Queue из Ruby.
Задачи
- Создание очереди
- Публикация события
- Получения события
- Удаление очереди
Код
#!/usr/bin/env ruby require 'time' require 'base64' require 'openssl' require 'net/http' require 'cgi' def make_azure_call(account, sharedkey_base64, method_cls, path, content = nil) content_length = 0 unless content.nil? content_length = content.length end uri = URI("http://" + account +".queue.core.windows.net" + path) if uri.query.nil? uri_params = {} else uri_params = CGI.parse(uri.query) end date = Time.now.gmtime.strftime "%a, %d %b %Y %H:%M:%S GMT" string_to_sign = "#{method_cls::METHOD}\n\n\n#{content_length}" string_to_sign << "\n\n\n\n\n\n\n\n\n" string_to_sign << "x-ms-date:#{date}\n" string_to_sign << "x-ms-version:2009-09-19\n/#{account}#{uri.path}" # FIXME: not sure that order is correct. # Keys MUST be ordered lexicographically uri_params.each do |key, val| string_to_sign << "\n" string_to_sign << key << ':' << val[0] end # puts string_to_sign key = Base64.strict_decode64(sharedkey_base64) digest = OpenSSL::Digest::Digest.new("sha256") hmac = OpenSSL::HMAC.digest(digest, key, string_to_sign) hmac64 = Base64.strict_encode64(hmac) req = method_cls.new(path) req['Content-Length'] = content_length req['Date'] = date req['x-ms-date'] = date req['x-ms-version'] = '2009-09-19' req['Authorization'] = "SharedKey #{account}:#{hmac64}" unless content.nil? req.body = content req.content_type = '' end http = Net::HTTP.new(uri.host, uri.port) # http.set_debug_output $stderr http.request req do |res| puts res.code puts res.message puts res.body end end acc = "YOUR_AZURE_ACCOUNT" key = "YOUR_SHARED_KEY_IN_BASE64" # Надо найти в консоли Azure queue = "YOUR_QUEUE_NAME" # create queue make_azure_call(acc, key, Net::HTTP::Put, "/#{queue}") # Put message msg = '<QueueMessage><MessageText>message-content</MessageText></QueueMessage>' make_azure_call(acc, key, Net::HTTP::Post, "/#{queue}/messages?messagettl=300", msg) # get messages make_azure_call(acc, key, Net::HTTP::Get, "/#{queue}/messages") # delete queue make_azure_call(acc, key, Net::HTTP::Delete, "/#{queue}")
Ссылки
http://msdn.microsoft.com/en-us/library/windowsazure/dd179363http://msdn.microsoft.com/en-us/library/windowsazure/dd179428
http://www.ruby-doc.org/stdlib-1.9.3/libdoc/net/http/rdoc/Net/HTTP.html
http://blog.wolfman.com/articles/2006/5/26/howto-format-ruby-code-for-blogs :)
No comments:
Post a Comment