From kato-k at rubyforge.org Mon Mar 2 23:59:09 2009 From: kato-k at rubyforge.org (kato-k at rubyforge.org) Date: Mon, 2 Mar 2009 23:59:09 -0500 (EST) Subject: [ap4r-devel] [937] trunk/samples/hello_world_for_rails2/vendor/plugins/ap4r/lib/ async_helper.rb: Added fault tolerance on connection to ap4r servers. Message-ID: <20090303045909.294D615B801E@rubyforge.org> Revision: 937 Author: kato-k Date: 2009-03-02 23:59:08 -0500 (Mon, 02 Mar 2009) Log Message: ----------- Added fault tolerance on connection to ap4r servers. Modified Paths: -------------- trunk/samples/hello_world_for_rails2/vendor/plugins/ap4r/lib/async_helper.rb Modified: trunk/samples/hello_world_for_rails2/vendor/plugins/ap4r/lib/async_helper.rb =================================================================== --- trunk/samples/hello_world_for_rails2/vendor/plugins/ap4r/lib/async_helper.rb 2009-02-20 11:17:12 UTC (rev 936) +++ trunk/samples/hello_world_for_rails2/vendor/plugins/ap4r/lib/async_helper.rb 2009-03-03 04:59:08 UTC (rev 937) @@ -20,12 +20,28 @@ DRUBY_PORT = ENV['AP4R_DRUBY_PORT'] || '6438' DRUBY_URI = "druby://#{DRUBY_HOST}:#{DRUBY_PORT}" + @@druby_uris = [DRUBY_URI] + @@druby_uri_options = { :rotate => false, :fail_over => false, :fail_reuse => false } + @@druby_uri_retry_count = 0 + @@default_dispatch_mode = :HTTP @@default_rm_options = { :delivery => :once, :dispatch_mode => @@default_dispatch_mode } @@default_queue_prefix = "queue." mattr_accessor :default_dispatch_mode, :default_rm_options, :default_queue_prefix, :saf_delete_mode + def druby_uris(uris, options) + @@druby_uris = [] + if uris.empty? + @@druby_uris << DRUBY_URI + else + @@druby_uris << uris + @@druby_uris.flatten! + end + @@druby_uri_options = @@druby_uri_options.merge(options) + end + module_function :druby_uris + # This method is aliased as ::Ap4r::Client#transaction # def transaction_with_saf(active_record_class = ::Ap4r::StoredMessage, *objects, &block) @@ -91,7 +107,7 @@ # Only async_params is not cloned. options and rm_options are cloned before now. # This is a current contract between this class and converter classes. converter = Converters[rm_options[:dispatch_mode]].new(url_options, async_params, rm_options, self) - logger.debug{"druby uri for queue-manager : #{DRUBY_URI}"} + # logger.debug("druby uri for queue-manager : #{@@druby_uris.first}") queue_name = converter.queue_name queue_message = converter.make_params @@ -131,10 +147,42 @@ private def __queue_put(queue_name, queue_message, queue_headers) # TODO: can use a Queue instance repeatedly? 2007/05/02 by shino - q = ReliableMsg::Queue.new(queue_name, :drb_uri => DRUBY_URI) - q.put(queue_message, queue_headers) + begin + druby_uri = @@druby_uris.first + logger.debug "Trying to connect to #{druby_uri} (druby uri list : #{@@druby_uris.join(", ")})." + + q = ReliableMsg::Queue.new(queue_name, :drb_uri => druby_uri) + q.put(queue_message, queue_headers) + + logger.debug "#{druby_uri} was connected and message was enqueued successfully." + @@druby_uri_retry_count = 0 + __rotate_druby_uri if @@druby_uri_options[:rotate] + + rescue DRb::DRbConnError => err + raise err unless @@druby_uri_options[:fail_over] + logger.debug "#{druby_uri} was not connected." + + unconnected_uri = @@druby_uris.shift + raise "No more active druby uri." if @@druby_uris.empty? + + @@druby_uris << unconnected_uri if @@druby_uri_options[:fail_reuse] + @@druby_uri_retry_count += 1 + + unless @@druby_uri_retry_count < @@druby_uris.size + @@druby_uri_retry_count = 0 + logger.debug "All registered druby uri was not connected." + raise err + end + + __queue_put(queue_name, queue_message, queue_headers) + end end + def __rotate_druby_uri() + druby_uri = @@druby_uris.shift + @@druby_uris << druby_uri + end + end module Converters #:nodoc: From kato-k at rubyforge.org Tue Mar 3 00:35:10 2009 From: kato-k at rubyforge.org (kato-k at rubyforge.org) Date: Tue, 3 Mar 2009 00:35:10 -0500 (EST) Subject: [ap4r-devel] [938] trunk/ap4r/spec/local/message_builder_spec.rb: Modified expectation of url-encoded hash value. Message-ID: <20090303053510.6A6DB1858105@rubyforge.org> Revision: 938 Author: kato-k Date: 2009-03-03 00:35:09 -0500 (Tue, 03 Mar 2009) Log Message: ----------- Modified expectation of url-encoded hash value. Modified Paths: -------------- trunk/ap4r/spec/local/message_builder_spec.rb Modified: trunk/ap4r/spec/local/message_builder_spec.rb =================================================================== --- trunk/ap4r/spec/local/message_builder_spec.rb 2009-03-03 04:59:08 UTC (rev 937) +++ trunk/ap4r/spec/local/message_builder_spec.rb 2009-03-03 05:35:09 UTC (rev 938) @@ -96,7 +96,7 @@ end it "should return the urlencoded body." do - @message_builder.format_message_body.should == "key1=value&key2=1" + @message_builder.format_message_body.should == "key2=1&key1=value" end end From kato-k at rubyforge.org Tue Mar 3 00:46:00 2009 From: kato-k at rubyforge.org (kato-k at rubyforge.org) Date: Tue, 3 Mar 2009 00:46:00 -0500 (EST) Subject: [ap4r-devel] [939] trunk: Moved async_helper.rb from plugin to ap4r core. Message-ID: <20090303054601.3BA7518580FC@rubyforge.org> Revision: 939 Author: kato-k Date: 2009-03-03 00:46:00 -0500 (Tue, 03 Mar 2009) Log Message: ----------- Moved async_helper.rb from plugin to ap4r core. Modified Paths: -------------- trunk/ap4r/Manifest.txt trunk/samples/hello_world_for_rails2/vendor/plugins/ap4r/lib/ap4r_client.rb Added Paths: ----------- trunk/ap4r/lib/ap4r/async_helper.rb Removed Paths: ------------- trunk/samples/hello_world_for_rails2/vendor/plugins/ap4r/lib/async_helper.rb Modified: trunk/ap4r/Manifest.txt =================================================================== --- trunk/ap4r/Manifest.txt 2009-03-03 05:35:09 UTC (rev 938) +++ trunk/ap4r/Manifest.txt 2009-03-03 05:46:00 UTC (rev 939) @@ -13,6 +13,7 @@ config/queues_pgsql.cfg fresh_rakefile lib/ap4r.rb +lib/ap4r/async_helper.rb lib/ap4r/carrier.rb lib/ap4r/db/migrate/001_reliable_msg_queue_and_topic.rb lib/ap4r/dispatcher.rb Copied: trunk/ap4r/lib/ap4r/async_helper.rb (from rev 937, trunk/samples/hello_world_for_rails2/vendor/plugins/ap4r/lib/async_helper.rb) =================================================================== --- trunk/ap4r/lib/ap4r/async_helper.rb (rev 0) +++ trunk/ap4r/lib/ap4r/async_helper.rb 2009-03-03 05:46:00 UTC (rev 939) @@ -0,0 +1,373 @@ +# Author:: Shunichi Shinohara +# Copyright:: Copyright (c) 2007 Future Architect Inc. +# Licence:: MIT Licence + +require 'reliable-msg' +require 'ap4r/stored_message' +require 'ap4r/message_builder' + +module Ap4r + + # This +AsyncHelper+ is included to +Ap4rClient+ and works the Rails plugin + # for asynchronous processing. + # + module AsyncHelper + + module Base + Converters = {} + + DRUBY_HOST = ENV['AP4R_DRUBY_HOST'] || 'localhost' + DRUBY_PORT = ENV['AP4R_DRUBY_PORT'] || '6438' + DRUBY_URI = "druby://#{DRUBY_HOST}:#{DRUBY_PORT}" + + @@druby_uris = [DRUBY_URI] + @@druby_uri_options = { :rotate => false, :fail_over => false, :fail_reuse => false } + @@druby_uri_retry_count = 0 + + @@default_dispatch_mode = :HTTP + @@default_rm_options = { :delivery => :once, :dispatch_mode => @@default_dispatch_mode } + @@default_queue_prefix = "queue." + + mattr_accessor :default_dispatch_mode, :default_rm_options, :default_queue_prefix, :saf_delete_mode + + def druby_uris(uris, options) + @@druby_uris = [] + if uris.empty? + @@druby_uris << DRUBY_URI + else + @@druby_uris << uris + @@druby_uris.flatten! + end + @@druby_uri_options = @@druby_uri_options.merge(options) + end + module_function :druby_uris + + # This method is aliased as ::Ap4r::Client#transaction + # + def transaction_with_saf(active_record_class = ::Ap4r::StoredMessage, *objects, &block) + + Thread.current[:use_saf] = true + Thread.current[:stored_messages] = {} + + # store + active_record_class ||= ::Ap4r::StoredMessage + active_record_class.transaction(*objects, &block) + + # forward + forwarded_messages = {} + begin + + # TODO: reconsider forwarding strategy, 2006/10/13 kato-k + # Once some error occured, such as disconnect reliable-msg or server crush, + # which is smart to keep to put a message or stop to do it? + # In the case of being many async messages, the former strategy is not so good. + # + # TODO: add delayed forward mode 2007/05/02 by shino + Thread.current[:stored_messages].each {|k,v| + __queue_put(v[:queue_name], v[:queue_message], v[:queue_headers]) + forwarded_messages[k] = v + } + rescue Exception => err + # Don't raise any Exception. Application logic has already completed and messages are saved. + logger.warn("Failed to put a message into queue: #{err}") + end + + begin + StoredMessage.transaction do + options = {:delete_mode => @@saf_delete_mode || :physical} + forwarded_messages.keys.each {|id| + ::Ap4r::StoredMessage.destroy_if_exists(id, options) + } + end + rescue Exception => err + # Don't raise any Exception. Application logic has already completed and messages are saved. + logger.warn("Failed to put a message into queue: #{err}") + end + + ensure + Thread.current[:use_saf] = false + Thread.current[:stored_messages] = nil + end + + # This method is aliased as ::Ap4r::Client#async_to + # + def async_dispatch(url_options = {}, async_params = {}, rm_options = {}, &block) + + if logger.debug? + logger.debug("url_options: ") + logger.debug(url_options.inspect) + logger.debug("async_params: ") + logger.debug(async_params.inspect) + logger.debug("rm_options: ") + logger.debug(rm_options.inspect) + end + + rm_options = @@default_rm_options.merge(rm_options || {}) + + # Only async_params is not cloned. options and rm_options are cloned before now. + # This is a current contract between this class and converter classes. + converter = Converters[rm_options[:dispatch_mode]].new(url_options, async_params, rm_options, self) + # logger.debug("druby uri for queue-manager : #{@@druby_uris.first}") + + queue_name = converter.queue_name + queue_message = converter.make_params + queue_headers = converter.make_rm_options + + message_builder = ::Ap4r::MessageBuilder.new(queue_name, queue_message, queue_headers) + if block_given? + message_builder.instance_eval(&block) + end + queue_name = message_builder.queue_name + queue_headers = message_builder.message_headers + # TODO: proces flow of Converter and MessageBuilder should (probably) be reversed 2007/09/19 by shino + # This branching is ad-hoc fix + if queue_headers[:dispatch_mode] == :HTTP + queue_message = message_builder.format_message_body + else + queue_message = message_builder.message_body + end + + + if Thread.current[:use_saf] + stored_message = ::Ap4r::StoredMessage.store(queue_name, queue_message, queue_headers) + + Thread.current[:stored_messages].store( + stored_message.id, + { + :queue_message => queue_message, + :queue_name => queue_name, + :queue_headers => queue_headers + } ) + return stored_message.id + end + + __queue_put(queue_name, queue_message, queue_headers) + end + + private + def __queue_put(queue_name, queue_message, queue_headers) + # TODO: can use a Queue instance repeatedly? 2007/05/02 by shino + begin + druby_uri = @@druby_uris.first + logger.debug "Trying to connect to #{druby_uri} (druby uri list : #{@@druby_uris.join(", ")})." + + q = ReliableMsg::Queue.new(queue_name, :drb_uri => druby_uri) + q.put(queue_message, queue_headers) + + logger.debug "#{druby_uri} was connected and message was enqueued successfully." + @@druby_uri_retry_count = 0 + __rotate_druby_uri if @@druby_uri_options[:rotate] + + rescue DRb::DRbConnError => err + raise err unless @@druby_uri_options[:fail_over] + logger.debug "#{druby_uri} was not connected." + + unconnected_uri = @@druby_uris.shift + raise "No more active druby uri." if @@druby_uris.empty? + + @@druby_uris << unconnected_uri if @@druby_uri_options[:fail_reuse] + @@druby_uri_retry_count += 1 + + unless @@druby_uri_retry_count < @@druby_uris.size + @@druby_uri_retry_count = 0 + logger.debug "All registered druby uri was not connected." + raise err + end + + __queue_put(queue_name, queue_message, queue_headers) + end + end + + def __rotate_druby_uri() + druby_uri = @@druby_uris.shift + @@druby_uris << druby_uri + end + + end + + module Converters #:nodoc: + + # A base class for converter classes. + # Responsibilities of subclasses are as folows + # * by +make_params+, convert async_params to appropriate object + # * by +make_rm_options+, make appropriate +Hash+ passed by ReliableMsg::Queue#put + class Base + + # Difine a constant +DISPATCH_MODE+ to value 'mode_symbol' and + # add self to a Converters list. + def self.dispatch_mode(mode_symbol) + self.const_set(:DISPATCH_MODE, mode_symbol) + ::Ap4r::AsyncHelper::Base::Converters[mode_symbol] = self + end + + def initialize(url_options, async_params, rm_options, url_for_handler) + @url_options = url_options + @async_params = async_params + @rm_options = rm_options + @url_for_handler = url_for_handler + end + + # Returns a queue name to which a message will be queued. + # Should be implemented by subclasses. + def queue_name + raise 'must be implemented in subclasses' + end + + # Returns a object which passed to ReliableMsg::Queue.put(message, headers)'s + # first argument +message+. + # Should be implemented by subclasses. + def make_params + raise 'must be implemented in subclasses' + end + + # Returns a object which passed to ReliableMsg::Queue.put(message, headers)'s + # second argument +headers+. + # Should be implemented by subclasses. + def make_rm_options + raise 'must be implemented in subclasses' + end + + private + # helper method for ActionController#url_for + def url_for(url_for_options, *parameter_for_method_reference) + return url_for_options if url_for_options.kind_of?(String) + @url_for_handler.url_for(url_for_options, *parameter_for_method_reference) + end + + end + + class ToRailsBase < Base + def initialize(url_options, async_params, rm_options, url_for_handler) + super + + @url_options ||= {} + @url_options[:controller] ||= @url_for_handler.controller_path.gsub("/", ".") + @url_options[:url] ||= {:controller => url_options[:controller], :action => url_options[:action]} + @url_options[:url][:controller] ||= url_options[:controller] if url_options[:url].kind_of?(Hash) + end + + def queue_name + queue_name = @rm_options[:queue] + return queue_name if queue_name + + queue_prefix = ::Ap4r::AsyncHelper::Base.default_queue_prefix + queue_prefix = queue_prefix.chomp(".") + url = @url_options[:url] + if url.kind_of?(Hash) + @rm_options[:queue] ||= + [queue_prefix, url[:controller].to_s, url[:action].to_s].join(".") + else + @rm_options[:queue] ||= + "#{queue_prefix}.#{URI.parse(url).path.gsub("/", ".")}" + end + @rm_options[:queue] + end + end + + class Http < ToRailsBase + dispatch_mode :HTTP + + def make_params + @async_params + end + + def make_rm_options + @rm_options[:target_url] ||= url_for(@url_options[:url]) + @rm_options[:target_method] ||= 'POST' + #TODO: make option key to specify HTTP headers, 2006/10/16 shino + @rm_options + end + end + + class WebService < ToRailsBase + def make_params + message_obj = {} + @async_params.each_pair{|k,v| message_obj[k.to_sym]=v} + message_obj + end + + def make_rm_options + @rm_options[:target_url] ||= target_url_name + @rm_options[:target_action] ||= action_api_name + @rm_options + end + + def action_api_name + action_method_name = @url_options[:url][:action] + action_method_name.camelcase + end + + def options_without_action + @url_options[:url].reject{ |k,v| k == :action } + end + + end + + class XmlRpc < WebService + dispatch_mode :XMLRPC + + def target_url_name + url_for(options_without_action) + rails_api_url_suffix + end + + private + def rails_api_url_suffix + '/api' + end + end + + class SOAP < WebService + dispatch_mode :SOAP + + def target_url_name + url_for(options_without_action) + rails_wsdl_url_suffix + end + + private + def rails_wsdl_url_suffix + '/service.wsdl' + end + end + + class Druby < Base + OPTION_KEY = :receiver + dispatch_mode :druby + + @@default_url = "druby://localhost:9999" + cattr_accessor :default_url + + def initialize(url_options, async_params, rm_options, url_for_handler) + super + @url_options[:url] ||= @@default_url + end + + def queue_name + queue_name = @rm_options[:queue] + return queue_name if queue_name + + @rm_options[:queue] = + [AsyncHelper::Base.default_queue_prefix.chomp("."), + @url_options[OPTION_KEY].to_s || "druby", + @url_options[:message].to_s].join(".") + @rm_options[:queue] + end + + def make_params + @async_params + end + + def make_rm_options + @rm_options[:target_url] ||= + if @url_options[OPTION_KEY] + "#{@url_options[:url]}?#{@url_options[OPTION_KEY]}" + else + @url_options[:url] + end + @rm_options[:target_method] = @url_options[:message] + @rm_options + end + end + + end + end +end Modified: trunk/samples/hello_world_for_rails2/vendor/plugins/ap4r/lib/ap4r_client.rb =================================================================== --- trunk/samples/hello_world_for_rails2/vendor/plugins/ap4r/lib/ap4r_client.rb 2009-03-03 05:35:09 UTC (rev 938) +++ trunk/samples/hello_world_for_rails2/vendor/plugins/ap4r/lib/ap4r_client.rb 2009-03-03 05:46:00 UTC (rev 939) @@ -3,7 +3,7 @@ # Licence:: MIT Licence require 'forwardable' -require 'async_helper' +require 'ap4r/async_helper' module Ap4r #:nodoc: Deleted: trunk/samples/hello_world_for_rails2/vendor/plugins/ap4r/lib/async_helper.rb =================================================================== --- trunk/samples/hello_world_for_rails2/vendor/plugins/ap4r/lib/async_helper.rb 2009-03-03 05:35:09 UTC (rev 938) +++ trunk/samples/hello_world_for_rails2/vendor/plugins/ap4r/lib/async_helper.rb 2009-03-03 05:46:00 UTC (rev 939) @@ -1,373 +0,0 @@ -# Author:: Shunichi Shinohara -# Copyright:: Copyright (c) 2007 Future Architect Inc. -# Licence:: MIT Licence - -require 'reliable-msg' -require 'ap4r/stored_message' -require 'ap4r/message_builder' - -module Ap4r - - # This +AsyncHelper+ is included to +Ap4rClient+ and works the Rails plugin - # for asynchronous processing. - # - module AsyncHelper - - module Base - Converters = {} - - DRUBY_HOST = ENV['AP4R_DRUBY_HOST'] || 'localhost' - DRUBY_PORT = ENV['AP4R_DRUBY_PORT'] || '6438' - DRUBY_URI = "druby://#{DRUBY_HOST}:#{DRUBY_PORT}" - - @@druby_uris = [DRUBY_URI] - @@druby_uri_options = { :rotate => false, :fail_over => false, :fail_reuse => false } - @@druby_uri_retry_count = 0 - - @@default_dispatch_mode = :HTTP - @@default_rm_options = { :delivery => :once, :dispatch_mode => @@default_dispatch_mode } - @@default_queue_prefix = "queue." - - mattr_accessor :default_dispatch_mode, :default_rm_options, :default_queue_prefix, :saf_delete_mode - - def druby_uris(uris, options) - @@druby_uris = [] - if uris.empty? - @@druby_uris << DRUBY_URI - else - @@druby_uris << uris - @@druby_uris.flatten! - end - @@druby_uri_options = @@druby_uri_options.merge(options) - end - module_function :druby_uris - - # This method is aliased as ::Ap4r::Client#transaction - # - def transaction_with_saf(active_record_class = ::Ap4r::StoredMessage, *objects, &block) - - Thread.current[:use_saf] = true - Thread.current[:stored_messages] = {} - - # store - active_record_class ||= ::Ap4r::StoredMessage - active_record_class.transaction(*objects, &block) - - # forward - forwarded_messages = {} - begin - - # TODO: reconsider forwarding strategy, 2006/10/13 kato-k - # Once some error occured, such as disconnect reliable-msg or server crush, - # which is smart to keep to put a message or stop to do it? - # In the case of being many async messages, the former strategy is not so good. - # - # TODO: add delayed forward mode 2007/05/02 by shino - Thread.current[:stored_messages].each {|k,v| - __queue_put(v[:queue_name], v[:queue_message], v[:queue_headers]) - forwarded_messages[k] = v - } - rescue Exception => err - # Don't raise any Exception. Application logic has already completed and messages are saved. - logger.warn("Failed to put a message into queue: #{err}") - end - - begin - StoredMessage.transaction do - options = {:delete_mode => @@saf_delete_mode || :physical} - forwarded_messages.keys.each {|id| - ::Ap4r::StoredMessage.destroy_if_exists(id, options) - } - end - rescue Exception => err - # Don't raise any Exception. Application logic has already completed and messages are saved. - logger.warn("Failed to put a message into queue: #{err}") - end - - ensure - Thread.current[:use_saf] = false - Thread.current[:stored_messages] = nil - end - - # This method is aliased as ::Ap4r::Client#async_to - # - def async_dispatch(url_options = {}, async_params = {}, rm_options = {}, &block) - - if logger.debug? - logger.debug("url_options: ") - logger.debug(url_options.inspect) - logger.debug("async_params: ") - logger.debug(async_params.inspect) - logger.debug("rm_options: ") - logger.debug(rm_options.inspect) - end - - rm_options = @@default_rm_options.merge(rm_options || {}) - - # Only async_params is not cloned. options and rm_options are cloned before now. - # This is a current contract between this class and converter classes. - converter = Converters[rm_options[:dispatch_mode]].new(url_options, async_params, rm_options, self) - # logger.debug("druby uri for queue-manager : #{@@druby_uris.first}") - - queue_name = converter.queue_name - queue_message = converter.make_params - queue_headers = converter.make_rm_options - - message_builder = ::Ap4r::MessageBuilder.new(queue_name, queue_message, queue_headers) - if block_given? - message_builder.instance_eval(&block) - end - queue_name = message_builder.queue_name - queue_headers = message_builder.message_headers - # TODO: proces flow of Converter and MessageBuilder should (probably) be reversed 2007/09/19 by shino - # This branching is ad-hoc fix - if queue_headers[:dispatch_mode] == :HTTP - queue_message = message_builder.format_message_body - else - queue_message = message_builder.message_body - end - - - if Thread.current[:use_saf] - stored_message = ::Ap4r::StoredMessage.store(queue_name, queue_message, queue_headers) - - Thread.current[:stored_messages].store( - stored_message.id, - { - :queue_message => queue_message, - :queue_name => queue_name, - :queue_headers => queue_headers - } ) - return stored_message.id - end - - __queue_put(queue_name, queue_message, queue_headers) - end - - private - def __queue_put(queue_name, queue_message, queue_headers) - # TODO: can use a Queue instance repeatedly? 2007/05/02 by shino - begin - druby_uri = @@druby_uris.first - logger.debug "Trying to connect to #{druby_uri} (druby uri list : #{@@druby_uris.join(", ")})." - - q = ReliableMsg::Queue.new(queue_name, :drb_uri => druby_uri) - q.put(queue_message, queue_headers) - - logger.debug "#{druby_uri} was connected and message was enqueued successfully." - @@druby_uri_retry_count = 0 - __rotate_druby_uri if @@druby_uri_options[:rotate] - - rescue DRb::DRbConnError => err - raise err unless @@druby_uri_options[:fail_over] - logger.debug "#{druby_uri} was not connected." - - unconnected_uri = @@druby_uris.shift - raise "No more active druby uri." if @@druby_uris.empty? - - @@druby_uris << unconnected_uri if @@druby_uri_options[:fail_reuse] - @@druby_uri_retry_count += 1 - - unless @@druby_uri_retry_count < @@druby_uris.size - @@druby_uri_retry_count = 0 - logger.debug "All registered druby uri was not connected." - raise err - end - - __queue_put(queue_name, queue_message, queue_headers) - end - end - - def __rotate_druby_uri() - druby_uri = @@druby_uris.shift - @@druby_uris << druby_uri - end - - end - - module Converters #:nodoc: - - # A base class for converter classes. - # Responsibilities of subclasses are as folows - # * by +make_params+, convert async_params to appropriate object - # * by +make_rm_options+, make appropriate +Hash+ passed by ReliableMsg::Queue#put - class Base - - # Difine a constant +DISPATCH_MODE+ to value 'mode_symbol' and - # add self to a Converters list. - def self.dispatch_mode(mode_symbol) - self.const_set(:DISPATCH_MODE, mode_symbol) - ::Ap4r::AsyncHelper::Base::Converters[mode_symbol] = self - end - - def initialize(url_options, async_params, rm_options, url_for_handler) - @url_options = url_options - @async_params = async_params - @rm_options = rm_options - @url_for_handler = url_for_handler - end - - # Returns a queue name to which a message will be queued. - # Should be implemented by subclasses. - def queue_name - raise 'must be implemented in subclasses' - end - - # Returns a object which passed to ReliableMsg::Queue.put(message, headers)'s - # first argument +message+. - # Should be implemented by subclasses. - def make_params - raise 'must be implemented in subclasses' - end - - # Returns a object which passed to ReliableMsg::Queue.put(message, headers)'s - # second argument +headers+. - # Should be implemented by subclasses. - def make_rm_options - raise 'must be implemented in subclasses' - end - - private - # helper method for ActionController#url_for - def url_for(url_for_options, *parameter_for_method_reference) - return url_for_options if url_for_options.kind_of?(String) - @url_for_handler.url_for(url_for_options, *parameter_for_method_reference) - end - - end - - class ToRailsBase < Base - def initialize(url_options, async_params, rm_options, url_for_handler) - super - - @url_options ||= {} - @url_options[:controller] ||= @url_for_handler.controller_path.gsub("/", ".") - @url_options[:url] ||= {:controller => url_options[:controller], :action => url_options[:action]} - @url_options[:url][:controller] ||= url_options[:controller] if url_options[:url].kind_of?(Hash) - end - - def queue_name - queue_name = @rm_options[:queue] - return queue_name if queue_name - - queue_prefix = ::Ap4r::AsyncHelper::Base.default_queue_prefix - queue_prefix = queue_prefix.chomp(".") - url = @url_options[:url] - if url.kind_of?(Hash) - @rm_options[:queue] ||= - [queue_prefix, url[:controller].to_s, url[:action].to_s].join(".") - else - @rm_options[:queue] ||= - "#{queue_prefix}.#{URI.parse(url).path.gsub("/", ".")}" - end - @rm_options[:queue] - end - end - - class Http < ToRailsBase - dispatch_mode :HTTP - - def make_params - @async_params - end - - def make_rm_options - @rm_options[:target_url] ||= url_for(@url_options[:url]) - @rm_options[:target_method] ||= 'POST' - #TODO: make option key to specify HTTP headers, 2006/10/16 shino - @rm_options - end - end - - class WebService < ToRailsBase - def make_params - message_obj = {} - @async_params.each_pair{|k,v| message_obj[k.to_sym]=v} - message_obj - end - - def make_rm_options - @rm_options[:target_url] ||= target_url_name - @rm_options[:target_action] ||= action_api_name - @rm_options - end - - def action_api_name - action_method_name = @url_options[:url][:action] - action_method_name.camelcase - end - - def options_without_action - @url_options[:url].reject{ |k,v| k == :action } - end - - end - - class XmlRpc < WebService - dispatch_mode :XMLRPC - - def target_url_name - url_for(options_without_action) + rails_api_url_suffix - end - - private - def rails_api_url_suffix - '/api' - end - end - - class SOAP < WebService - dispatch_mode :SOAP - - def target_url_name - url_for(options_without_action) + rails_wsdl_url_suffix - end - - private - def rails_wsdl_url_suffix - '/service.wsdl' - end - end - - class Druby < Base - OPTION_KEY = :receiver - dispatch_mode :druby - - @@default_url = "druby://localhost:9999" - cattr_accessor :default_url - - def initialize(url_options, async_params, rm_options, url_for_handler) - super - @url_options[:url] ||= @@default_url - end - - def queue_name - queue_name = @rm_options[:queue] - return queue_name if queue_name - - @rm_options[:queue] = - [AsyncHelper::Base.default_queue_prefix.chomp("."), - @url_options[OPTION_KEY].to_s || "druby", - @url_options[:message].to_s].join(".") - @rm_options[:queue] - end - - def make_params - @async_params - end - - def make_rm_options - @rm_options[:target_url] ||= - if @url_options[OPTION_KEY] - "#{@url_options[:url]}?#{@url_options[OPTION_KEY]}" - else - @url_options[:url] - end - @rm_options[:target_method] = @url_options[:message] - @rm_options - end - end - - end - end -end From kato-k at rubyforge.org Wed Mar 4 05:13:01 2009 From: kato-k at rubyforge.org (kato-k at rubyforge.org) Date: Wed, 4 Mar 2009 05:13:01 -0500 (EST) Subject: [ap4r-devel] [940] trunk/ap4r/lib/ap4r/async_helper.rb: Fixed bugs on fail over. Message-ID: <20090304101301.8EF7118580FD@rubyforge.org> Revision: 940 Author: kato-k Date: 2009-03-04 05:13:00 -0500 (Wed, 04 Mar 2009) Log Message: ----------- Fixed bugs on fail over. Modified Paths: -------------- trunk/ap4r/lib/ap4r/async_helper.rb Modified: trunk/ap4r/lib/ap4r/async_helper.rb =================================================================== --- trunk/ap4r/lib/ap4r/async_helper.rb 2009-03-03 05:46:00 UTC (rev 939) +++ trunk/ap4r/lib/ap4r/async_helper.rb 2009-03-04 10:13:00 UTC (rev 940) @@ -23,6 +23,7 @@ @@druby_uris = [DRUBY_URI] @@druby_uri_options = { :rotate => false, :fail_over => false, :fail_reuse => false } @@druby_uri_retry_count = 0 + @@druby_uris_size = 1 @@default_dispatch_mode = :HTTP @@default_rm_options = { :delivery => :once, :dispatch_mode => @@default_dispatch_mode } @@ -30,7 +31,7 @@ mattr_accessor :default_dispatch_mode, :default_rm_options, :default_queue_prefix, :saf_delete_mode - def druby_uris(uris, options) + def druby_uris(uris, options = {}) @@druby_uris = [] if uris.empty? @@druby_uris << DRUBY_URI @@ -39,6 +40,8 @@ @@druby_uris.flatten! end @@druby_uri_options = @@druby_uri_options.merge(options) + @@druby_uris_size = @@druby_uris.size + @@druby_uri_retry_count = 0 end module_function :druby_uris @@ -157,7 +160,6 @@ logger.debug "#{druby_uri} was connected and message was enqueued successfully." @@druby_uri_retry_count = 0 __rotate_druby_uri if @@druby_uri_options[:rotate] - rescue DRb::DRbConnError => err raise err unless @@druby_uri_options[:fail_over] logger.debug "#{druby_uri} was not connected." @@ -168,7 +170,7 @@ @@druby_uris << unconnected_uri if @@druby_uri_options[:fail_reuse] @@druby_uri_retry_count += 1 - unless @@druby_uri_retry_count < @@druby_uris.size + if @@druby_uri_retry_count >= @@druby_uris_size @@druby_uri_retry_count = 0 logger.debug "All registered druby uri was not connected." raise err From kato-k at rubyforge.org Wed Mar 4 05:14:52 2009 From: kato-k at rubyforge.org (kato-k at rubyforge.org) Date: Wed, 4 Mar 2009 05:14:52 -0500 (EST) Subject: [ap4r-devel] [941] trunk/ap4r/spec/local/async_helper_queue_put_spec.rb: Added spec for fail over on queueing message to ap4r servers. Message-ID: <20090304101452.E0B7F18580FD@rubyforge.org> Revision: 941 Author: kato-k Date: 2009-03-04 05:14:52 -0500 (Wed, 04 Mar 2009) Log Message: ----------- Added spec for fail over on queueing message to ap4r servers. Added Paths: ----------- trunk/ap4r/spec/local/async_helper_queue_put_spec.rb Added: trunk/ap4r/spec/local/async_helper_queue_put_spec.rb =================================================================== --- trunk/ap4r/spec/local/async_helper_queue_put_spec.rb (rev 0) +++ trunk/ap4r/spec/local/async_helper_queue_put_spec.rb 2009-03-04 10:14:52 UTC (rev 941) @@ -0,0 +1,418 @@ +require File.join(File.dirname(__FILE__), "../spec_helper") + +require "reliable-msg" +require "ap4r/async_helper" + +module Ap4r::AsyncHelper::Base + module_function :__queue_put +end + +class Target + include Ap4r::AsyncHelper::Base + def initialize + @@logger = Logger.new(STDOUT) + @@logger.level = Logger::INFO + end + + def queue_put + __queue_put("", { }, { }) + end + + require "active_support" + cattr_accessor :logger, :druby_uris, :druby_uri_retry_count +end + +# mock +class ReliableMsg::Queue + def initialize(queue_name, options) + @druby_uri = options[:drb_uri] + end + + def put(queue_message, queue_headers) + case @@ap4r_servers_status[@druby_uri] + when :active then "cd6f82d0-e9f1-012b-6ff8-0016cb9ad524" # uuid + when :inactive then raise ::DRb::DRbConnError + end + end + + require "active_support" + cattr_accessor :ap4r_servers_status +end + + +describe Ap4r::AsyncHelper::Base, "no configuration and active server" do + + before(:each) do + # status + ReliableMsg::Queue.ap4r_servers_status = { + "druby://localhost:6438" => :active + } + @target = Target.new + end + + it "should have default druby uri" do + @target.druby_uris.size.should == 1 + @target.druby_uris.first.should == "druby://localhost:6438" + end + + it "should be not error" do + proc{ @target.queue_put }.should_not raise_error + end +end + + +describe Ap4r::AsyncHelper::Base, "no configuration and inactive server" do + + before(:each) do + # status + ReliableMsg::Queue.ap4r_servers_status = { + "druby://localhost:6438" => :inactive + } + @target = Target.new + end + + it "should be not error" do + proc{ @target.queue_put }.should raise_error(::DRb::DRbConnError) + end +end + + +describe Ap4r::AsyncHelper::Base, "multiple URIs with default options and active server" do + + before(:each) do + # configuration + @uris = %w(6438 6439 6440).map {|port| "druby://localhost:#{port}"} + ::Ap4r::AsyncHelper::Base.druby_uris(@uris) + + # status + ReliableMsg::Queue.ap4r_servers_status = { + "druby://localhost:6438" => :active, + "druby://localhost:6439" => :active, + "druby://localhost:6440" => :active + } + + @target = Target.new + end + + it "should have configured URIs list druby uri" do + @target.druby_uris.size.should == @uris.size + @target.druby_uris.should == @uris + end + + it "should be not error" do + proc{ @target.queue_put }.should_not raise_error + @target.druby_uris.first.should == @uris.first + end +end + + +describe Ap4r::AsyncHelper::Base, "multiple URIs with default options and inactive server" do + + before(:each) do + # configuration + @uris = %w(6438 6439 6440).map {|port| "druby://localhost:#{port}"} + ::Ap4r::AsyncHelper::Base.druby_uris(@uris) + + # status + ReliableMsg::Queue.ap4r_servers_status = { + "druby://localhost:6438" => :inactive, + "druby://localhost:6439" => :active, + "druby://localhost:6440" => :active + } + + @target = Target.new + end + + it "should be error (should not fail over)" do + @target.druby_uris.first.should == @uris.first + proc{ @target.queue_put }.should raise_error(::DRb::DRbConnError) + @target.druby_uris.first.should == @uris.first + end +end + + +describe Ap4r::AsyncHelper::Base, "multiple URIs with rotate option and active server" do + + before(:each) do + # configuration + @uris = %w(6438 6439 6440).map {|port| "druby://localhost:#{port}"} + ::Ap4r::AsyncHelper::Base.druby_uris(@uris, :rotate => true, :fail_over => false, :fail_reuse => false) + + # status + ReliableMsg::Queue.ap4r_servers_status = { + "druby://localhost:6438" => :active, + "druby://localhost:6439" => :active, + "druby://localhost:6440" => :active + } + + @target = Target.new + end + + it "should rotate servers each connection" do + @target.druby_uris.first.should == @uris[0] + proc{ @target.queue_put }.should_not raise_error + + @target.druby_uris.first.should == @uris[1] + proc{ @target.queue_put }.should_not raise_error + + @target.druby_uris.first.should == @uris[2] + proc{ @target.queue_put }.should_not raise_error + + @target.druby_uris.first.should == @uris[0] + proc{ @target.queue_put }.should_not raise_error + end + + it "should have the same URIs list after connections" do + 2.times{ @target.queue_put } + @target.druby_uris.size.should == 3 + (@target.druby_uris - @uris).should == [] + end +end + + +describe Ap4r::AsyncHelper::Base, "multiple URIs with rotate option and inactive 2nd server" do + + before(:each) do + # configuration + @uris = %w(6438 6439 6440).map {|port| "druby://localhost:#{port}"} + ::Ap4r::AsyncHelper::Base.druby_uris(@uris, :rotate => true, :fail_over => false, :fail_reuse => false) + + # status + ReliableMsg::Queue.ap4r_servers_status = { + "druby://localhost:6438" => :active, + "druby://localhost:6439" => :inactive, + "druby://localhost:6440" => :active + } + + @target = Target.new + end + + it "should be error on the 2nd connection" do + @target.druby_uris.first.should == @uris[0] + proc{ @target.queue_put }.should_not raise_error + + @target.druby_uris.first.should == @uris[1] + proc{ @target.queue_put }.should raise_error(::DRb::DRbConnError) + + @target.druby_uris.first.should == @uris[1] + end + + it "should be always error once error occured" do + @target.druby_uris.first.should == @uris[0] + proc{ @target.queue_put }.should_not raise_error + + @target.druby_uris.first.should == @uris[1] + proc{ @target.queue_put }.should raise_error(::DRb::DRbConnError) + + @target.druby_uris.first.should == @uris[1] + proc{ @target.queue_put }.should raise_error(::DRb::DRbConnError) + end +end + + +describe Ap4r::AsyncHelper::Base, "multiple URIs with failover option and inactive 1st server" do + + before(:each) do + # configuration + @uris = %w(6438 6439 6440).map {|port| "druby://localhost:#{port}"} + ::Ap4r::AsyncHelper::Base.druby_uris(@uris, :rotate => false, :fail_over => true, :fail_reuse => false) + + # status + ReliableMsg::Queue.ap4r_servers_status = { + "druby://localhost:6438" => :inactive, + "druby://localhost:6439" => :active, + "druby://localhost:6440" => :active + } + + @target = Target.new + end + + it "should fail over to 2nd server" do + @target.druby_uris.first.should == @uris[0] + proc{ @target.queue_put }.should_not raise_error + + @target.druby_uris.first.should == @uris[1] + proc{ @target.queue_put }.should_not raise_error + + @target.druby_uris.first.should == @uris[1] + @target.druby_uris.size.should == 2 + end +end + + +describe Ap4r::AsyncHelper::Base, "multiple URIs with failover option and inactive 1st & 2nd servers" do + + before(:each) do + # configuration + @uris = %w(6438 6439 6440).map {|port| "druby://localhost:#{port}"} + ::Ap4r::AsyncHelper::Base.druby_uris(@uris, :rotate => false, :fail_over => true, :fail_reuse => false) + + # status + ReliableMsg::Queue.ap4r_servers_status = { + "druby://localhost:6438" => :inactive, + "druby://localhost:6439" => :inactive, + "druby://localhost:6440" => :active + } + + @target = Target.new + end + + it "should fail over to 3rd server" do + @target.druby_uris.first.should == @uris[0] + proc{ @target.queue_put }.should_not raise_error + + @target.druby_uris.first.should == @uris[2] + proc{ @target.queue_put }.should_not raise_error + + @target.druby_uris.first.should == @uris[2] + @target.druby_uris.size.should == 1 + end +end + + +describe Ap4r::AsyncHelper::Base, "multiple URIs with failover option and all inactive servers" do + + before(:each) do + # configuration + @uris = %w(6438 6439 6440).map {|port| "druby://localhost:#{port}"} + ::Ap4r::AsyncHelper::Base.druby_uris(@uris, :rotate => false, :fail_over => true, :fail_reuse => false) + + # status + ReliableMsg::Queue.ap4r_servers_status = { + "druby://localhost:6438" => :inactive, + "druby://localhost:6439" => :inactive, + "druby://localhost:6440" => :inactive + } + + @target = Target.new + end + + it "should be error" do + @target.druby_uris.first.should == @uris[0] + proc{ @target.queue_put }.should raise_error(::RuntimeError, "No more active druby uri.") + + @target.druby_uris.size.should == 0 + end +end + + +describe Ap4r::AsyncHelper::Base, "multiple URIs with fail_reuse option and inactive 1st server" do + + before(:each) do + # configuration + @uris = %w(6438 6439 6440).map {|port| "druby://localhost:#{port}"} + ::Ap4r::AsyncHelper::Base.druby_uris(@uris, :rotate => false, :fail_over => true, :fail_reuse => true) + + # status + ReliableMsg::Queue.ap4r_servers_status = { + "druby://localhost:6438" => :inactive, + "druby://localhost:6439" => :active, + "druby://localhost:6440" => :active + } + + @target = Target.new + end + + it "should have the same URIs list after fail over" do + @target.druby_uri_retry_count.should == 0 + @target.druby_uris.first.should == @uris[0] + proc{ @target.queue_put }.should_not raise_error + @target.druby_uri_retry_count.should == 0 + @target.druby_uris.first.should == @uris[1] + + @target.druby_uris.size.should == @uris.size + (@target.druby_uris - @uris).should == [] + end +end + + +describe Ap4r::AsyncHelper::Base, "multiple URIs with fail_reuse option and all inactive servers" do + + before(:each) do + # configuration + @uris = %w(6438 6439 6440).map {|port| "druby://localhost:#{port}"} + ::Ap4r::AsyncHelper::Base.druby_uris(@uris, :rotate => false, :fail_over => true, :fail_reuse => true) + + # status + ReliableMsg::Queue.ap4r_servers_status = { + "druby://localhost:6438" => :inactive, + "druby://localhost:6439" => :inactive, + "druby://localhost:6440" => :inactive + } + + @target = Target.new + end + + it "should be error after tryed all druby uri" do + @target.druby_uris.first.should == @uris[0] + proc{ @target.queue_put }.should raise_error(::RuntimeError) + + @target.druby_uris.first.should == @uris[0] + @target.druby_uris.size.should == @uris.size + (@target.druby_uris - @uris).should == [] + end + + it "should be not error after some node comes back" do + proc{ @target.queue_put }.should raise_error(::RuntimeError) + + ReliableMsg::Queue.ap4r_servers_status = { + "druby://localhost:6438" => :inactive, + "druby://localhost:6439" => :active, + "druby://localhost:6440" => :inactive + } + + @target.druby_uris.first.should == @uris[0] + proc{ @target.queue_put }.should_not raise_error + + @target.druby_uris.first.should == @uris[1] + end +end + + +describe Ap4r::AsyncHelper::Base, "multiple URIs with all options and inactive 2nd server" do + + before(:each) do + # configuration + @uris = %w(6438 6439 6440).map {|port| "druby://localhost:#{port}"} + ::Ap4r::AsyncHelper::Base.druby_uris(@uris, :rotate => true, :fail_over => true, :fail_reuse => true) + + # status + ReliableMsg::Queue.ap4r_servers_status = { + "druby://localhost:6438" => :active, + "druby://localhost:6439" => :inactive, + "druby://localhost:6440" => :active + } + + @target = Target.new + end + + it "should be not error on the first connection" do + proc { @target.queue_put }.should_not raise_error + end + + it "should fail over on the second connection" do + @target.druby_uris.first.should == @uris[0] + @target.queue_put # connected to 6438 + + @target.druby_uris.first.should == @uris[1] + @target.queue_put # connected to 6440 and rotate next uri + + @target.druby_uris.first.should == @uris[0] + end + + it "should reuse the uri which it was inactive after it comes back" do + 2.times { @target.queue_put } + @target.druby_uris.first.should == @uris[0] + + ReliableMsg::Queue.ap4r_servers_status = { + "druby://localhost:6438" => :active, + "druby://localhost:6439" => :active, + "druby://localhost:6440" => :active + } + + @target.queue_put # connected to 6438 + @target.queue_put # connected to 6439 + + @target.druby_uris.first.should == @uris[2] + end +end From kato-k at rubyforge.org Thu Mar 12 21:29:28 2009 From: kato-k at rubyforge.org (kato-k at rubyforge.org) Date: Thu, 12 Mar 2009 21:29:28 -0400 (EDT) Subject: [ap4r-devel] [942] trunk/ap4r/Manifest.txt: added spec to manifest file. Message-ID: <20090313012928.A8D1318580F7@rubyforge.org> Revision: 942 Author: kato-k Date: 2009-03-12 21:29:28 -0400 (Thu, 12 Mar 2009) Log Message: ----------- added spec to manifest file. Modified Paths: -------------- trunk/ap4r/Manifest.txt Modified: trunk/ap4r/Manifest.txt =================================================================== --- trunk/ap4r/Manifest.txt 2009-03-04 10:14:52 UTC (rev 941) +++ trunk/ap4r/Manifest.txt 2009-03-13 01:29:28 UTC (rev 942) @@ -53,6 +53,7 @@ script/mongrel_ap4r script/start script/stop +spec/local/async_helper_queue_put_spec.rb spec/local/dispatcher_base_spec.rb spec/local/message_builder_spec.rb spec/local/send_message_handler_spec.rb From kato-k at rubyforge.org Mon Mar 23 02:22:10 2009 From: kato-k at rubyforge.org (kato-k at rubyforge.org) Date: Mon, 23 Mar 2009 02:22:10 -0400 (EDT) Subject: [ap4r-devel] [943] trunk/ap4r: Modified: spec tests to be free from side effects and etc . Message-ID: <20090323062210.4E8C718580EE@rubyforge.org> Revision: 943 Author: kato-k Date: 2009-03-23 02:22:09 -0400 (Mon, 23 Mar 2009) Log Message: ----------- Modified: spec tests to be free from side effects and etc. Modified Paths: -------------- trunk/ap4r/lib/ap4r/async_helper.rb trunk/ap4r/spec/local/async_helper_queue_put_spec.rb trunk/ap4r/spec/local/message_builder_spec.rb Modified: trunk/ap4r/lib/ap4r/async_helper.rb =================================================================== --- trunk/ap4r/lib/ap4r/async_helper.rb 2009-03-13 01:29:28 UTC (rev 942) +++ trunk/ap4r/lib/ap4r/async_helper.rb 2009-03-23 06:22:09 UTC (rev 943) @@ -154,7 +154,7 @@ druby_uri = @@druby_uris.first logger.debug "Trying to connect to #{druby_uri} (druby uri list : #{@@druby_uris.join(", ")})." - q = ReliableMsg::Queue.new(queue_name, :drb_uri => druby_uri) + q = __queue_get(queue_name, druby_uri) q.put(queue_message, queue_headers) logger.debug "#{druby_uri} was connected and message was enqueued successfully." @@ -180,6 +180,10 @@ end end + def __queue_get(queue_name, druby_uri) + ReliableMsg::Queue.new(queue_name, :drb_uri => druby_uri) + end + def __rotate_druby_uri() druby_uri = @@druby_uris.shift @@druby_uris << druby_uri Modified: trunk/ap4r/spec/local/async_helper_queue_put_spec.rb =================================================================== --- trunk/ap4r/spec/local/async_helper_queue_put_spec.rb 2009-03-13 01:29:28 UTC (rev 942) +++ trunk/ap4r/spec/local/async_helper_queue_put_spec.rb 2009-03-23 06:22:09 UTC (rev 943) @@ -4,9 +4,26 @@ require "ap4r/async_helper" module Ap4r::AsyncHelper::Base - module_function :__queue_put + module_function :__queue_put, :__queue_get end +# ReliableMsg::Queue's mock +class ReliableMsgQueueMock + def initialize(queue_name, druby_uri) + @druby_uri = druby_uri + end + + def put(queue_message, queue_headers) + case @@ap4r_servers_status[@druby_uri] + when :active then "cd6f82d0-e9f1-012b-6ff8-0016cb9ad524" # uuid + when :inactive then raise ::DRb::DRbConnError + end + end + + require "active_support" + cattr_accessor :ap4r_servers_status +end + class Target include Ap4r::AsyncHelper::Base def initialize @@ -18,33 +35,21 @@ __queue_put("", { }, { }) end + def __queue_get(queue_name, druby_uri) + ReliableMsgQueueMock.new(queue_name, druby_uri) + end + require "active_support" cattr_accessor :logger, :druby_uris, :druby_uri_retry_count end -# mock -class ReliableMsg::Queue - def initialize(queue_name, options) - @druby_uri = options[:drb_uri] - end - def put(queue_message, queue_headers) - case @@ap4r_servers_status[@druby_uri] - when :active then "cd6f82d0-e9f1-012b-6ff8-0016cb9ad524" # uuid - when :inactive then raise ::DRb::DRbConnError - end - end - require "active_support" - cattr_accessor :ap4r_servers_status -end - - describe Ap4r::AsyncHelper::Base, "no configuration and active server" do before(:each) do # status - ReliableMsg::Queue.ap4r_servers_status = { + ReliableMsgQueueMock.ap4r_servers_status = { "druby://localhost:6438" => :active } @target = Target.new @@ -65,7 +70,7 @@ before(:each) do # status - ReliableMsg::Queue.ap4r_servers_status = { + ReliableMsgQueueMock.ap4r_servers_status = { "druby://localhost:6438" => :inactive } @target = Target.new @@ -85,7 +90,7 @@ ::Ap4r::AsyncHelper::Base.druby_uris(@uris) # status - ReliableMsg::Queue.ap4r_servers_status = { + ReliableMsgQueueMock.ap4r_servers_status = { "druby://localhost:6438" => :active, "druby://localhost:6439" => :active, "druby://localhost:6440" => :active @@ -114,7 +119,7 @@ ::Ap4r::AsyncHelper::Base.druby_uris(@uris) # status - ReliableMsg::Queue.ap4r_servers_status = { + ReliableMsgQueueMock.ap4r_servers_status = { "druby://localhost:6438" => :inactive, "druby://localhost:6439" => :active, "druby://localhost:6440" => :active @@ -139,7 +144,7 @@ ::Ap4r::AsyncHelper::Base.druby_uris(@uris, :rotate => true, :fail_over => false, :fail_reuse => false) # status - ReliableMsg::Queue.ap4r_servers_status = { + ReliableMsgQueueMock.ap4r_servers_status = { "druby://localhost:6438" => :active, "druby://localhost:6439" => :active, "druby://localhost:6440" => :active @@ -178,7 +183,7 @@ ::Ap4r::AsyncHelper::Base.druby_uris(@uris, :rotate => true, :fail_over => false, :fail_reuse => false) # status - ReliableMsg::Queue.ap4r_servers_status = { + ReliableMsgQueueMock.ap4r_servers_status = { "druby://localhost:6438" => :active, "druby://localhost:6439" => :inactive, "druby://localhost:6440" => :active @@ -218,7 +223,7 @@ ::Ap4r::AsyncHelper::Base.druby_uris(@uris, :rotate => false, :fail_over => true, :fail_reuse => false) # status - ReliableMsg::Queue.ap4r_servers_status = { + ReliableMsgQueueMock.ap4r_servers_status = { "druby://localhost:6438" => :inactive, "druby://localhost:6439" => :active, "druby://localhost:6440" => :active @@ -248,7 +253,7 @@ ::Ap4r::AsyncHelper::Base.druby_uris(@uris, :rotate => false, :fail_over => true, :fail_reuse => false) # status - ReliableMsg::Queue.ap4r_servers_status = { + ReliableMsgQueueMock.ap4r_servers_status = { "druby://localhost:6438" => :inactive, "druby://localhost:6439" => :inactive, "druby://localhost:6440" => :active @@ -278,7 +283,7 @@ ::Ap4r::AsyncHelper::Base.druby_uris(@uris, :rotate => false, :fail_over => true, :fail_reuse => false) # status - ReliableMsg::Queue.ap4r_servers_status = { + ReliableMsgQueueMock.ap4r_servers_status = { "druby://localhost:6438" => :inactive, "druby://localhost:6439" => :inactive, "druby://localhost:6440" => :inactive @@ -304,7 +309,7 @@ ::Ap4r::AsyncHelper::Base.druby_uris(@uris, :rotate => false, :fail_over => true, :fail_reuse => true) # status - ReliableMsg::Queue.ap4r_servers_status = { + ReliableMsgQueueMock.ap4r_servers_status = { "druby://localhost:6438" => :inactive, "druby://localhost:6439" => :active, "druby://localhost:6440" => :active @@ -334,7 +339,7 @@ ::Ap4r::AsyncHelper::Base.druby_uris(@uris, :rotate => false, :fail_over => true, :fail_reuse => true) # status - ReliableMsg::Queue.ap4r_servers_status = { + ReliableMsgQueueMock.ap4r_servers_status = { "druby://localhost:6438" => :inactive, "druby://localhost:6439" => :inactive, "druby://localhost:6440" => :inactive @@ -355,7 +360,7 @@ it "should be not error after some node comes back" do proc{ @target.queue_put }.should raise_error(::RuntimeError) - ReliableMsg::Queue.ap4r_servers_status = { + ReliableMsgQueueMock.ap4r_servers_status = { "druby://localhost:6438" => :inactive, "druby://localhost:6439" => :active, "druby://localhost:6440" => :inactive @@ -377,7 +382,7 @@ ::Ap4r::AsyncHelper::Base.druby_uris(@uris, :rotate => true, :fail_over => true, :fail_reuse => true) # status - ReliableMsg::Queue.ap4r_servers_status = { + ReliableMsgQueueMock.ap4r_servers_status = { "druby://localhost:6438" => :active, "druby://localhost:6439" => :inactive, "druby://localhost:6440" => :active @@ -404,7 +409,7 @@ 2.times { @target.queue_put } @target.druby_uris.first.should == @uris[0] - ReliableMsg::Queue.ap4r_servers_status = { + ReliableMsgQueueMock.ap4r_servers_status = { "druby://localhost:6438" => :active, "druby://localhost:6439" => :active, "druby://localhost:6440" => :active Modified: trunk/ap4r/spec/local/message_builder_spec.rb =================================================================== --- trunk/ap4r/spec/local/message_builder_spec.rb 2009-03-13 01:29:28 UTC (rev 942) +++ trunk/ap4r/spec/local/message_builder_spec.rb 2009-03-23 06:22:09 UTC (rev 943) @@ -96,7 +96,7 @@ end it "should return the urlencoded body." do - @message_builder.format_message_body.should == "key2=1&key1=value" + @message_builder.format_message_body.split("&").sort.should == ["key2=1","key1=value"].sort end end From kato-k at rubyforge.org Mon Mar 23 02:30:21 2009 From: kato-k at rubyforge.org (kato-k at rubyforge.org) Date: Mon, 23 Mar 2009 02:30:21 -0400 (EDT) Subject: [ap4r-devel] [944] trunk/ap4r/History.txt: Message-ID: <20090323063021.9BEF918580F4@rubyforge.org> Revision: 944 Author: kato-k Date: 2009-03-23 02:30:20 -0400 (Mon, 23 Mar 2009) Log Message: ----------- Modified Paths: -------------- trunk/ap4r/History.txt Modified: trunk/ap4r/History.txt =================================================================== --- trunk/ap4r/History.txt 2009-03-23 06:22:09 UTC (rev 943) +++ trunk/ap4r/History.txt 2009-03-23 06:30:20 UTC (rev 944) @@ -1,5 +1,9 @@ == 0.3.x -* Fixed: qdb connection via PostgresPR etc. + +==- 0.3.7 (March 23, 2009) +* Added: fault tolerance on connection from Rails to AP4R servers. (fail over and round robin connection etc.) +* Changed: async_helper.rb was moved from rails plugin to ap4r core (ap4r/lib directory). +* Fixed: bugs of queue database connection via PostgresPR etc. Based on a patch from cypher256 === 0.3.6 (February 6, 2008) From kato-k at rubyforge.org Mon Mar 23 03:57:30 2009 From: kato-k at rubyforge.org (kato-k at rubyforge.org) Date: Mon, 23 Mar 2009 03:57:30 -0400 (EDT) Subject: [ap4r-devel] [945] trunk/samples/hello_world_for_rails2: Supported rails-2.3. 2 for HelloWorld sample application. Message-ID: <20090323075730.DD0F81978561@rubyforge.org> Revision: 945 Author: kato-k Date: 2009-03-23 03:57:30 -0400 (Mon, 23 Mar 2009) Log Message: ----------- Supported rails-2.3.2 for HelloWorld sample application. Modified Paths: -------------- trunk/samples/hello_world_for_rails2/config/boot.rb trunk/samples/hello_world_for_rails2/config/environment.rb trunk/samples/hello_world_for_rails2/config/environments/production.rb trunk/samples/hello_world_for_rails2/config/environments/test.rb trunk/samples/hello_world_for_rails2/config/initializers/new_rails_defaults.rb trunk/samples/hello_world_for_rails2/db/development.sqlite3 trunk/samples/hello_world_for_rails2/doc/README_FOR_APP trunk/samples/hello_world_for_rails2/public/HelloWorld.txt Added Paths: ----------- trunk/samples/hello_world_for_rails2/app/controllers/application_controller.rb trunk/samples/hello_world_for_rails2/config/initializers/backtrace_silencers.rb trunk/samples/hello_world_for_rails2/config/initializers/session_store.rb Removed Paths: ------------- trunk/samples/hello_world_for_rails2/app/controllers/application.rb trunk/samples/hello_world_for_rails2/next_migration_file_name Deleted: trunk/samples/hello_world_for_rails2/app/controllers/application.rb =================================================================== --- trunk/samples/hello_world_for_rails2/app/controllers/application.rb 2009-03-23 06:30:20 UTC (rev 944) +++ trunk/samples/hello_world_for_rails2/app/controllers/application.rb 2009-03-23 07:57:30 UTC (rev 945) @@ -1,15 +0,0 @@ -# Filters added to this controller apply to all controllers in the application. -# Likewise, all the methods added will be available for all controllers. - -class ApplicationController < ActionController::Base - helper :all # include all helpers, all the time - - # See ActionController::RequestForgeryProtection for details - # Uncomment the :secret if you're not using the cookie session store - protect_from_forgery # :secret => '3d39a7577cd74076fabfb93e1d29186a' - - # See ActionController::Base for details - # Uncomment this to filter the contents of submitted sensitive data parameters - # from your application log (in this case, all fields with names like "password"). - # filter_parameter_logging :password -end Added: trunk/samples/hello_world_for_rails2/app/controllers/application_controller.rb =================================================================== --- trunk/samples/hello_world_for_rails2/app/controllers/application_controller.rb (rev 0) +++ trunk/samples/hello_world_for_rails2/app/controllers/application_controller.rb 2009-03-23 07:57:30 UTC (rev 945) @@ -0,0 +1,15 @@ +# Filters added to this controller apply to all controllers in the application. +# Likewise, all the methods added will be available for all controllers. + +class ApplicationController < ActionController::Base + helper :all # include all helpers, all the time + + # See ActionController::RequestForgeryProtection for details + # Uncomment the :secret if you're not using the cookie session store + protect_from_forgery # :secret => '3d39a7577cd74076fabfb93e1d29186a' + + # See ActionController::Base for details + # Uncomment this to filter the contents of submitted sensitive data parameters + # from your application log (in this case, all fields with names like "password"). + # filter_parameter_logging :password +end Modified: trunk/samples/hello_world_for_rails2/config/boot.rb =================================================================== --- trunk/samples/hello_world_for_rails2/config/boot.rb 2009-03-23 06:30:20 UTC (rev 944) +++ trunk/samples/hello_world_for_rails2/config/boot.rb 2009-03-23 07:57:30 UTC (rev 945) @@ -44,6 +44,7 @@ def load_initializer require "#{RAILS_ROOT}/vendor/rails/railties/lib/initializer" Rails::Initializer.run(:install_gem_spec_stubs) + Rails::GemDependency.add_frozen_gem_path end end Modified: trunk/samples/hello_world_for_rails2/config/environment.rb =================================================================== --- trunk/samples/hello_world_for_rails2/config/environment.rb 2009-03-23 06:30:20 UTC (rev 944) +++ trunk/samples/hello_world_for_rails2/config/environment.rb 2009-03-23 07:57:30 UTC (rev 945) @@ -1,11 +1,7 @@ # Be sure to restart your server when you modify this file -# Uncomment below to force Rails into production mode when -# you don't control web/app server and can't set it the proper way -# ENV['RAILS_ENV'] ||= 'production' - # Specifies gem version of Rails to use when vendor/rails is not present -RAILS_GEM_VERSION = '2.2.2' unless defined? RAILS_GEM_VERSION +RAILS_GEM_VERSION = '2.3.2' unless defined? RAILS_GEM_VERSION # Bootstrap the Rails environment, frameworks, and default configuration require File.join(File.dirname(__FILE__), 'boot') @@ -14,62 +10,35 @@ # Settings in config/environments/* take precedence over those specified here. # Application configuration should go into files in config/initializers # -- all .rb files in that directory are automatically loaded. - # See Rails::Configuration for more options. - # Skip frameworks you're not going to use. To use Rails without a database - # you must remove the Active Record framework. - # config.frameworks -= [ :active_record, :active_resource, :action_mailer ] + # Add additional load paths for your own custom dirs + # config.load_paths += %W( #{RAILS_ROOT}/extras ) - # Specify gems that this application depends on. - # They can then be installed with "rake gems:install" on new installations. - # You have to specify the :lib option for libraries, where the Gem name (sqlite3-ruby) differs from the file itself (sqlite3) + # Specify gems that this application depends on and have them installed with rake gems:install # config.gem "bj" # config.gem "hpricot", :version => '0.6', :source => "http://code.whytheluckystiff.net" # config.gem "sqlite3-ruby", :lib => "sqlite3" # config.gem "aws-s3", :lib => "aws/s3" - # Only load the plugins named here, in the order given. By default, all plugins - # in vendor/plugins are loaded in alphabetical order. + # Only load the plugins named here, in the order given (default is alphabetical). # :all can be used as a placeholder for all plugins not explicitly named # config.plugins = [ :exception_notification, :ssl_requirement, :all ] - # Add additional load paths for your own custom dirs - # config.load_paths += %W( #{RAILS_ROOT}/extras ) + # Skip frameworks you're not going to use. To use Rails without a database, + # you must remove the Active Record framework. + # config.frameworks -= [ :active_record, :active_resource, :action_mailer ] - # Force all environments to use the same logger level - # (by default production uses :info, the others :debug) - # config.log_level = :debug + # Activate observers that should always be running + # config.active_record.observers = :cacher, :garbage_collector, :forum_observer - # Make Time.zone default to the specified zone, and make Active Record store time values - # in the database in UTC, and return them converted to the specified local zone. - # Run "rake -D time" for a list of tasks for finding time zone names. Comment line to use default local time. + # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone. + # Run "rake -D time" for a list of tasks for finding time zone names. config.time_zone = 'UTC' - # The internationalization framework can be changed to have another default locale (standard is :en) or more load paths. - # All files from config/locales/*.rb,yml are added automatically. - # config.i18n.load_path << Dir[File.join(RAILS_ROOT, 'my', 'locales', '*.{rb,yml}')] + # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded. + # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}')] # config.i18n.default_locale = :de - - # Your secret key for verifying cookie session data integrity. - # If you change this key, all old sessions will become invalid! - # Make sure the secret is at least 30 characters and all random, - # no regular words or you'll be exposed to dictionary attacks. - config.action_controller.session = { - :session_key => '_hello_world_for_rails2_session', - :secret => '286917691ce7bf2904cf3d5365a525b1797b22236b0754e62bfe63ccb248cd0d73e9e5c87dd54de441c275ecd057d7269f9e2f22d732f0ea51125c18e1cae3c9' - } - - # Use the database for sessions instead of the cookie-based default, - # which shouldn't be used to store highly confidential information - # (create the session table with "rake db:sessions:create") - # config.action_controller.session_store = :active_record_store - - # Use SQL instead of Active Record's schema dumper when creating the test database. - # This is necessary if your schema can't be completely dumped by the schema dumper, - # like if you have constraints or database-specific column types - # config.active_record.schema_format = :sql - - # Activate observers that should always be running - # Please note that observers generated using script/generate observer need to have an _observer suffix - # config.active_record.observers = :cacher, :garbage_collector, :forum_observer end + +uris = %w(6438 6439 6440).map { |port| "druby://localhost:#{ port}"} +::Ap4r::AsyncHelper::Base.druby_uris(uris, :fail_over => true, :fail_reuse => true, :rotate => false) Modified: trunk/samples/hello_world_for_rails2/config/environments/production.rb =================================================================== --- trunk/samples/hello_world_for_rails2/config/environments/production.rb 2009-03-23 06:30:20 UTC (rev 944) +++ trunk/samples/hello_world_for_rails2/config/environments/production.rb 2009-03-23 07:57:30 UTC (rev 945) @@ -4,21 +4,25 @@ # Code is not reloaded between requests config.cache_classes = true -# Enable threaded mode -# config.threadsafe! +# Full error reports are disabled and caching is turned on +config.action_controller.consider_all_requests_local = false +config.action_controller.perform_caching = true +config.action_view.cache_template_loading = true +# See everything in the log (default is :info) +# config.log_level = :debug + # Use a different logger for distributed setups # config.logger = SyslogLogger.new -# Full error reports are disabled and caching is turned on -config.action_controller.consider_all_requests_local = false -config.action_controller.perform_caching = true - # Use a different cache store in production # config.cache_store = :mem_cache_store # Enable serving of images, stylesheets, and javascripts from an asset server -# config.action_controller.asset_host = "http://assets.example.com" +# config.action_controller.asset_host = "http://assets.example.com" # Disable delivery errors, bad email addresses will be ignored # config.action_mailer.raise_delivery_errors = false + +# Enable threaded mode +# config.threadsafe! \ No newline at end of file Modified: trunk/samples/hello_world_for_rails2/config/environments/test.rb =================================================================== --- trunk/samples/hello_world_for_rails2/config/environments/test.rb 2009-03-23 06:30:20 UTC (rev 944) +++ trunk/samples/hello_world_for_rails2/config/environments/test.rb 2009-03-23 07:57:30 UTC (rev 945) @@ -12,6 +12,7 @@ # Show full error reports and disable caching config.action_controller.consider_all_requests_local = true config.action_controller.perform_caching = false +config.action_view.cache_template_loading = true # Disable request forgery protection in test environment config.action_controller.allow_forgery_protection = false @@ -20,3 +21,8 @@ # The :test delivery method accumulates sent emails in the # ActionMailer::Base.deliveries array. config.action_mailer.delivery_method = :test + +# Use SQL instead of Active Record's schema dumper when creating the test database. +# This is necessary if your schema can't be completely dumped by the schema dumper, +# like if you have constraints or database-specific column types +# config.active_record.schema_format = :sql \ No newline at end of file Added: trunk/samples/hello_world_for_rails2/config/initializers/backtrace_silencers.rb =================================================================== --- trunk/samples/hello_world_for_rails2/config/initializers/backtrace_silencers.rb (rev 0) +++ trunk/samples/hello_world_for_rails2/config/initializers/backtrace_silencers.rb 2009-03-23 07:57:30 UTC (rev 945) @@ -0,0 +1,7 @@ +# Be sure to restart your server when you modify this file. + +# You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces. +# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ } + +# You can also remove all the silencers if you're trying do debug a problem that might steem from framework code. +# Rails.backtrace_cleaner.remove_silencers! \ No newline at end of file Modified: trunk/samples/hello_world_for_rails2/config/initializers/new_rails_defaults.rb =================================================================== --- trunk/samples/hello_world_for_rails2/config/initializers/new_rails_defaults.rb 2009-03-23 06:30:20 UTC (rev 944) +++ trunk/samples/hello_world_for_rails2/config/initializers/new_rails_defaults.rb 2009-03-23 07:57:30 UTC (rev 945) @@ -1,3 +1,5 @@ +# Be sure to restart your server when you modify this file. + # These settings change the behavior of Rails 2 apps and will be defaults # for Rails 3. You can remove this initializer when Rails 3 is released. Added: trunk/samples/hello_world_for_rails2/config/initializers/session_store.rb =================================================================== --- trunk/samples/hello_world_for_rails2/config/initializers/session_store.rb (rev 0) +++ trunk/samples/hello_world_for_rails2/config/initializers/session_store.rb 2009-03-23 07:57:30 UTC (rev 945) @@ -0,0 +1,15 @@ +# Be sure to restart your server when you modify this file. + +# Your secret key for verifying cookie session data integrity. +# If you change this key, all old sessions will become invalid! +# Make sure the secret is at least 30 characters and all random, +# no regular words or you'll be exposed to dictionary attacks. +ActionController::Base.session = { + :key => '_hoge_session', + :secret => '174995b4a72cbcc76734452d00a9ed5a4a6ae4c2803a11013eb6597ac3455235fe3d64c3eccaa676efe4ce0e5ff741b7603ea82aa5bcb1da0e5e13801a6d4424' +} + +# Use the database for sessions instead of the cookie-based default, +# which shouldn't be used to store highly confidential information +# (create the session table with "rake db:sessions:create") +# ActionController::Base.session_store = :active_record_store Modified: trunk/samples/hello_world_for_rails2/db/development.sqlite3 =================================================================== (Binary files differ) Modified: trunk/samples/hello_world_for_rails2/doc/README_FOR_APP =================================================================== --- trunk/samples/hello_world_for_rails2/doc/README_FOR_APP 2009-03-23 06:30:20 UTC (rev 944) +++ trunk/samples/hello_world_for_rails2/doc/README_FOR_APP 2009-03-23 07:57:30 UTC (rev 945) @@ -1,5 +1,2 @@ -To build the guides: - -* Install source-highlighter (http://www.gnu.org/software/src-highlite/source-highlight.html) -* Install the mizuho gem (http://github.com/FooBarWidget/mizuho/tree/master) -* Run `rake guides` from the railties directory \ No newline at end of file +Use this README file to introduce your application and point to useful places in the API for learning more. +Run "rake doc:app" to generate API documentation for your models, controllers, helpers, and libraries. Deleted: trunk/samples/hello_world_for_rails2/next_migration_file_name =================================================================== --- trunk/samples/hello_world_for_rails2/next_migration_file_name 2009-03-23 06:30:20 UTC (rev 944) +++ trunk/samples/hello_world_for_rails2/next_migration_file_name 2009-03-23 07:57:30 UTC (rev 945) @@ -1,17 +0,0 @@ -class CreateTableForSaf < ActiveRecord::Migration - def self.up - create_table :stored_messages do |t| - t.column :duplication_check_id, :string, :null => false - t.column :queue, :string, :null => false - t.column :headers, :binary, :null => false - t.column :object, :binary, :null => false - t.column :status, :integer, :null => false - t.column :created_at, :datetime, :null => false - t.column :updated_at, :datetime, :null => false - end - end - - def self.down - drop_table :stored_messages - end -end Modified: trunk/samples/hello_world_for_rails2/public/HelloWorld.txt =================================================================== --- trunk/samples/hello_world_for_rails2/public/HelloWorld.txt 2009-03-23 06:30:20 UTC (rev 944) +++ trunk/samples/hello_world_for_rails2/public/HelloWorld.txt 2009-03-23 07:57:30 UTC (rev 945) @@ -1,4 +1,4 @@ -Hello # ...written at Thu Feb 19 18:05:45 +0900 2009 -Hello # ...written at Thu Feb 19 18:06:39 +0900 2009 -Hello # ...written at Fri Feb 20 12:36:15 +0900 2009 -World # ...written at Fri Feb 20 12:36:26 +0900 2009 +Hello # ...written at Mon Mar 23 16:51:52 +0900 2009 +World # ...written at Mon Mar 23 16:52:02 +0900 2009 +Hello # ...written at Mon Mar 23 16:52:06 +0900 2009 +World # ...written at Mon Mar 23 16:52:16 +0900 2009 From kato-k at rubyforge.org Mon Mar 23 04:38:40 2009 From: kato-k at rubyforge.org (kato-k at rubyforge.org) Date: Mon, 23 Mar 2009 04:38:40 -0400 (EDT) Subject: [ap4r-devel] [946] trunk/ap4r: Modified release task for sample hello world application and so on. Message-ID: <20090323083840.E18BC18580F7@rubyforge.org> Revision: 946 Author: kato-k Date: 2009-03-23 04:38:39 -0400 (Mon, 23 Mar 2009) Log Message: ----------- Modified release task for sample hello world application and so on. Modified Paths: -------------- trunk/ap4r/Manifest.txt trunk/ap4r/Rakefile Modified: trunk/ap4r/Manifest.txt =================================================================== --- trunk/ap4r/Manifest.txt 2009-03-23 07:57:30 UTC (rev 945) +++ trunk/ap4r/Manifest.txt 2009-03-23 08:38:39 UTC (rev 946) @@ -47,7 +47,6 @@ rails_plugin/ap4r/lib/ap4r/queue_put_stub.rb rails_plugin/ap4r/lib/ap4r/service_handler.rb rails_plugin/ap4r/lib/ap4r_client.rb -rails_plugin/ap4r/lib/async_helper.rb rails_plugin/ap4r/tasks/ap4r.rake script/irm script/mongrel_ap4r Modified: trunk/ap4r/Rakefile =================================================================== --- trunk/ap4r/Rakefile 2009-03-23 07:57:30 UTC (rev 945) +++ trunk/ap4r/Rakefile 2009-03-23 08:38:39 UTC (rev 946) @@ -45,7 +45,9 @@ # AP4R release tasks -------------------------------------------------------- -HelloWorld = '../samples/HelloWorld' +#HelloWorld = '../samples/HelloWorld' +#HelloWorld = '../samples/hello_world_for_rails2' +ProjectName = 'hello_world_for_rails2' namespace :release do desc "copy rails plugin from sample before gem build" @@ -53,9 +55,9 @@ # TODO: Should use file task ? 2007/09/27 by shino FileUtils.rm_rf('./rails_plugin/ap4r') FileUtils.mkdir_p('./rails_plugin/ap4r/lib') - FileUtils.cp(HelloWorld + '/db/migrate/001_create_table_for_saf.rb', + FileUtils.cp(Dir.glob("../samples/#{ProjectName}/db/migrate/*.rb").first, './lib/ap4r/xxx_create_table_for_saf.rb') - FileUtils.cp_r(Dir.glob(HelloWorld + '/vendor/plugins/ap4r/*').reject{|f| f =~ /tmp$|CVS|\.svn/}, + FileUtils.cp_r(Dir.glob("../samples/#{ProjectName}/vendor/plugins/ap4r/*").reject{|f| f =~ /tmp$|CVS|\.svn/}, './rails_plugin/ap4r') # TODO: dot files and tilde files are copied 2007/09/20 by shino end @@ -84,19 +86,19 @@ desc 'Make sample tarball (Now only one sample "HelloWorld").' task :sample do FileUtils.mkdir_p('./pkg/samples') - FileUtils.rm_rf('./pkg/samples/HelloWorld') + FileUtils.rm_rf("./pkg/samples/#{ProjectName}") - FileUtils.cp_r(HelloWorld, './pkg/samples/') + FileUtils.cp_r("../samples/#{ProjectName}", './pkg/samples/') Find.find('./pkg/samples') do |path| next unless File.file? path FileUtils.rm_rf(path) if path =~ /\.svn|tmp$|CVS|.rb\~/ end - Dir.chdir('./pkg/samples/HelloWorld') + Dir.chdir("./pkg/samples/#{ProjectName}") `rake db:migrate` Dir.chdir('../../') - `tar czf HelloWorld-#{Ap4r::VERSION::STRING}.tar.gz ./samples/HelloWorld/` + `tar czf HelloWorld-#{Ap4r::VERSION::STRING}.tar.gz ./samples/#{ProjectName}/` Dir.chdir('../') end end From kato-k at rubyforge.org Mon Mar 23 05:34:10 2009 From: kato-k at rubyforge.org (kato-k at rubyforge.org) Date: Mon, 23 Mar 2009 05:34:10 -0400 (EDT) Subject: [ap4r-devel] [947] tags/ap4r-0.3.7/: taged 0.3.7 Message-ID: <20090323093414.ED09A18580ED@rubyforge.org> Revision: 947 Author: kato-k Date: 2009-03-23 05:34:06 -0400 (Mon, 23 Mar 2009) Log Message: ----------- taged 0.3.7 Added Paths: ----------- tags/ap4r-0.3.7/ From kato-k at rubyforge.org Mon Mar 23 05:42:52 2009 From: kato-k at rubyforge.org (kato-k at rubyforge.org) Date: Mon, 23 Mar 2009 05:42:52 -0400 (EDT) Subject: [ap4r-devel] [948] tags/ap4r-0.3.7: Message-ID: <20090323094254.033E818580ED@rubyforge.org> Revision: 948 Author: kato-k Date: 2009-03-23 05:42:51 -0400 (Mon, 23 Mar 2009) Log Message: ----------- Removed Paths: ------------- tags/ap4r-0.3.7/reliable-msg/ tags/ap4r-0.3.7/uuid/