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/