ap4r 0.3.2 → 0.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/{CHANGELOG → History.txt} +5 -0
- data/Manifest.txt +48 -0
- data/README.txt +82 -0
- data/Rakefile +71 -149
- data/config/queues_mysql.cfg +2 -2
- data/config/queues_pgsql.cfg +19 -0
- data/lib/ap4r.rb +0 -1
- data/lib/ap4r/message_store_ext.rb +230 -0
- data/lib/ap4r/mongrel_ap4r.rb +4 -0
- data/lib/ap4r/postgresql.sql +13 -0
- data/lib/ap4r/retention_history.rb +2 -2
- data/lib/ap4r/script/setup.rb +0 -1
- data/lib/ap4r/stored_message.rb +120 -7
- data/lib/ap4r/version.rb +1 -1
- data/lib/ap4r/xxx_create_table_for_saf.rb +21 -0
- data/lib/ap4r/xxx_create_table_for_saf_to_postgresql.rb +21 -0
- data/rails_plugin/ap4r/init.rb +11 -0
- data/rails_plugin/ap4r/lib/ap4r/queue_put_stub.rb +21 -0
- data/rails_plugin/ap4r/lib/ap4r/service_handler.rb +165 -0
- data/rails_plugin/ap4r/lib/ap4r_client.rb +132 -0
- data/rails_plugin/ap4r/lib/{async_controller.rb → async_helper.rb} +43 -71
- data/rails_plugin/ap4r/lib/message_builder.rb +181 -0
- data/rails_plugin/ap4r/tasks/ap4r.rake +35 -0
- data/spec/local/dispatcher_base_spec.rb +130 -0
- data/spec/spec_helper.rb +7 -0
- metadata +36 -40
- data/README +0 -55
- data/script/loop.cmd +0 -3
- data/script/loop.rb +0 -8
@@ -0,0 +1,35 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + "/../lib/ap4r/service_handler.rb")
|
2
|
+
|
3
|
+
namespace :test do
|
4
|
+
|
5
|
+
# task :asyncs do
|
6
|
+
# setup - run - teardown comes here.
|
7
|
+
# Names should be considered further.
|
8
|
+
# end
|
9
|
+
|
10
|
+
namespace :asyncs do
|
11
|
+
|
12
|
+
desc "Start Rails and AP4R servers to test:asyncs:exec"
|
13
|
+
task :arrange do |t|
|
14
|
+
ap4r_handler = Ap4r::ServiceHandler.new
|
15
|
+
ap4r_handler.start_rails_service
|
16
|
+
ap4r_handler.start_ap4r_service
|
17
|
+
end
|
18
|
+
|
19
|
+
desc "Start Rails and AP4R servers to test:asyncs:exec"
|
20
|
+
task :cleanup do |t|
|
21
|
+
ap4r_handler = Ap4r::ServiceHandler.new
|
22
|
+
ap4r_handler.stop_ap4r_service
|
23
|
+
ap4r_handler.stop_rails_service
|
24
|
+
end
|
25
|
+
|
26
|
+
Rake::TestTask.new(:run => "db:test:prepare") do |t|
|
27
|
+
t.libs << "test"
|
28
|
+
t.pattern = 'test/async/**/*_test.rb'
|
29
|
+
t.verbose = true
|
30
|
+
end
|
31
|
+
Rake::Task['test:asyncs:run'].comment = "Run the unit tests in test/async"
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
@@ -0,0 +1,130 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "../spec_helper")
|
2
|
+
|
3
|
+
require "reliable-msg"
|
4
|
+
require "ap4r/dispatcher"
|
5
|
+
|
6
|
+
class Ap4r::Dispatchers::Base
|
7
|
+
attr_accessor :response
|
8
|
+
end
|
9
|
+
|
10
|
+
describe Ap4r::Dispatchers::Base, " message modification with no configuration" do
|
11
|
+
before(:each) do
|
12
|
+
@headers = {:target_url => "http://www.sample.org:8888/aaa/bbb" }
|
13
|
+
@body = "body"
|
14
|
+
@message = ReliableMsg::Message.new(1, @headers.clone, @body.clone)
|
15
|
+
@conf = {}
|
16
|
+
@dispatcher = Ap4r::Dispatchers::Base.new(@message, @conf)
|
17
|
+
@dispatcher.modify_message
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should not change headers" do
|
21
|
+
@message.headers == @headers.should
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should not change body" do
|
25
|
+
@message.object.should == @body
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
describe Ap4r::Dispatchers::Base, " message modification with url rewrite" do
|
31
|
+
before(:each) do
|
32
|
+
@headers = {:target_url => "http://www.sample.org:8888/aaa/bbb" }
|
33
|
+
@body = "body"
|
34
|
+
@message = ReliableMsg::Message.new(1, @headers.clone, @body.clone)
|
35
|
+
@conf = {"modify_rules" => {"url" => "proc{|url| url.port = url.port + 11}" }}
|
36
|
+
@dispatcher = Ap4r::Dispatchers::Base.new(@message, @conf)
|
37
|
+
@dispatcher.modify_message
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should not change headers except :target_url" do
|
41
|
+
@message.headers[:target_url] = @headers[:target_url]
|
42
|
+
@message.headers.should == @headers
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should change :target_url as ruled" do
|
46
|
+
@message.headers[:target_url].should == "http://www.sample.org:8899/aaa/bbb"
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should not change body" do
|
50
|
+
@message.object.should == @body
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
describe Ap4r::Dispatchers::Http, " validation of response status as HTTP OK" do
|
56
|
+
before(:each) do
|
57
|
+
@dispatcher = Ap4r::Dispatchers::Http.new(@message = nil, @conf = nil)
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should accept 200 status" do
|
61
|
+
@dispatcher.response = Net::HTTPOK.new(nil, 200, nil)
|
62
|
+
proc{ @dispatcher.validate_response_status(Net::HTTPOK) }.should_not raise_error
|
63
|
+
end
|
64
|
+
|
65
|
+
it "should repel 201 status" do
|
66
|
+
@dispatcher.response = Net::HTTPCreated.new(nil, 201, nil)
|
67
|
+
proc{ @dispatcher.validate_response_status(Net::HTTPOK) }.should raise_error
|
68
|
+
end
|
69
|
+
|
70
|
+
it "should repel 301 status" do
|
71
|
+
@dispatcher.response = Net::HTTPMovedPermanently.new(nil, 301, nil)
|
72
|
+
proc{ @dispatcher.validate_response_status(Net::HTTPOK) }.should raise_error
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
|
77
|
+
describe Ap4r::Dispatchers::Http, " validation of response status as 2xx" do
|
78
|
+
before(:each) do
|
79
|
+
@dispatcher = Ap4r::Dispatchers::Http.new(@message = nil, @conf = nil)
|
80
|
+
end
|
81
|
+
|
82
|
+
it "should accept 200 status" do
|
83
|
+
@dispatcher.response = Net::HTTPOK.new(nil, 200, nil)
|
84
|
+
proc{ @dispatcher.validate_response_status(Net::HTTPSuccess) }.should_not raise_error
|
85
|
+
end
|
86
|
+
|
87
|
+
it "should accept 201 status" do
|
88
|
+
@dispatcher.response = Net::HTTPCreated.new(nil, 201, nil)
|
89
|
+
proc{ @dispatcher.validate_response_status(Net::HTTPSuccess) }.should_not raise_error
|
90
|
+
end
|
91
|
+
|
92
|
+
it "should repel 301 status" do
|
93
|
+
@dispatcher.response = Net::HTTPMovedPermanently.new(nil, 301, nil)
|
94
|
+
proc{ @dispatcher.validate_response_status(Net::HTTPSuccess) }.should raise_error
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
98
|
+
|
99
|
+
describe Ap4r::Dispatchers::Http, " validation of response body" do
|
100
|
+
before(:each) do
|
101
|
+
@message = nil
|
102
|
+
@conf = nil
|
103
|
+
@dispatcher = Ap4r::Dispatchers::Http.new(@message, @conf)
|
104
|
+
@response = mock("response")
|
105
|
+
@dispatcher.response = @response
|
106
|
+
end
|
107
|
+
|
108
|
+
it 'should accept just text "true"' do
|
109
|
+
@response.should_receive(:body).once.and_return("true")
|
110
|
+
proc{ @dispatcher.validate_response_body(/true/) }.should_not raise_error
|
111
|
+
end
|
112
|
+
|
113
|
+
it 'should accept text including "true"' do
|
114
|
+
@response.should_receive(:body).and_return{
|
115
|
+
"first line is not important\nsome words true and more\nand also third line is useless." }
|
116
|
+
proc{ @dispatcher.validate_response_body(/true/) }.should_not raise_error
|
117
|
+
end
|
118
|
+
|
119
|
+
it 'should repel empty text' do
|
120
|
+
@response.should_receive(:body).and_return("")
|
121
|
+
proc{ @dispatcher.validate_response_body(/true/) }.should raise_error
|
122
|
+
end
|
123
|
+
|
124
|
+
it 'should repel long text without "true"' do
|
125
|
+
@response.should_receive(:body).and_return{
|
126
|
+
"first line is not important\nsome words, more and more\nand also third line is useless." }
|
127
|
+
proc{ @dispatcher.validate_response_body(/true/) }.should raise_error
|
128
|
+
end
|
129
|
+
|
130
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
CHANGED
@@ -1,19 +1,19 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.9.
|
2
|
+
rubygems_version: 0.9.4
|
3
3
|
specification_version: 1
|
4
4
|
name: ap4r
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.3.
|
7
|
-
date: 2007-
|
6
|
+
version: 0.3.3
|
7
|
+
date: 2007-09-19 00:00:00 +09:00
|
8
8
|
summary: Asynchronous Processing for Ruby.
|
9
9
|
require_paths:
|
10
10
|
- lib
|
11
11
|
email: shinohara.shunichi@future.co.jp, kato.kiwamu@future.co.jp
|
12
|
-
homepage: http://rubyforge.org/
|
12
|
+
homepage: http://ap4r.rubyforge.org/wiki/wiki.pl?HomePage
|
13
13
|
rubyforge_project: ap4r
|
14
14
|
description: Asynchronous Processing for Ruby.
|
15
|
-
autorequire:
|
16
|
-
default_executable:
|
15
|
+
autorequire:
|
16
|
+
default_executable:
|
17
17
|
bindir: bin
|
18
18
|
has_rdoc: true
|
19
19
|
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
@@ -30,43 +30,29 @@ authors:
|
|
30
30
|
- Shunichi Shinohara
|
31
31
|
- Kiwamu Kato
|
32
32
|
files:
|
33
|
-
-
|
34
|
-
- CHANGELOG
|
35
|
-
- config
|
36
|
-
- doc
|
37
|
-
- lib
|
33
|
+
- History.txt
|
38
34
|
- MIT-LICENSE
|
39
|
-
-
|
35
|
+
- Manifest.txt
|
36
|
+
- README.txt
|
40
37
|
- Rakefile
|
41
|
-
- README
|
42
|
-
- script
|
43
|
-
- spec
|
44
38
|
- bin/ap4r_setup
|
45
39
|
- config/ap4r_settings.rb
|
46
40
|
- config/log4r.yaml
|
47
41
|
- config/queues.cfg
|
48
42
|
- config/queues_disk.cfg
|
49
43
|
- config/queues_mysql.cfg
|
50
|
-
-
|
51
|
-
-
|
52
|
-
- rails_plugin/ap4r/lib/async_controller.rb
|
53
|
-
- script/irm
|
54
|
-
- script/loop.cmd
|
55
|
-
- script/loop.rb
|
56
|
-
- script/mongrel_ap4r
|
57
|
-
- script/start
|
58
|
-
- script/stop
|
59
|
-
- lib/ap4r
|
44
|
+
- config/queues_pgsql.cfg
|
45
|
+
- lib/ap4r.rb
|
60
46
|
- lib/ap4r/carrier.rb
|
61
47
|
- lib/ap4r/dispatcher.rb
|
62
48
|
- lib/ap4r/message_store_ext.rb
|
63
49
|
- lib/ap4r/mongrel.rb
|
64
50
|
- lib/ap4r/mongrel_ap4r.rb
|
65
51
|
- lib/ap4r/multi_queue.rb
|
52
|
+
- lib/ap4r/postgresql.sql
|
66
53
|
- lib/ap4r/queue_manager_ext.rb
|
67
54
|
- lib/ap4r/queue_manager_ext_debug.rb
|
68
55
|
- lib/ap4r/retention_history.rb
|
69
|
-
- lib/ap4r/script
|
70
56
|
- lib/ap4r/script/base.rb
|
71
57
|
- lib/ap4r/script/queue_manager_control.rb
|
72
58
|
- lib/ap4r/script/setup.rb
|
@@ -74,23 +60,33 @@ files:
|
|
74
60
|
- lib/ap4r/start_with_log4r.rb
|
75
61
|
- lib/ap4r/store_and_forward.rb
|
76
62
|
- lib/ap4r/stored_message.rb
|
77
|
-
- lib/ap4r/util
|
78
63
|
- lib/ap4r/util/irm.rb
|
79
64
|
- lib/ap4r/util/queue_client.rb
|
80
65
|
- lib/ap4r/version.rb
|
81
|
-
- lib/ap4r.rb
|
82
|
-
|
83
|
-
|
66
|
+
- lib/ap4r/xxx_create_table_for_saf.rb
|
67
|
+
- lib/ap4r/xxx_create_table_for_saf_to_postgresql.rb
|
68
|
+
- rails_plugin/ap4r/init.rb
|
69
|
+
- rails_plugin/ap4r/lib/ap4r/queue_put_stub.rb
|
70
|
+
- rails_plugin/ap4r/lib/ap4r/service_handler.rb
|
71
|
+
- rails_plugin/ap4r/lib/ap4r_client.rb
|
72
|
+
- rails_plugin/ap4r/lib/async_helper.rb
|
73
|
+
- rails_plugin/ap4r/lib/message_builder.rb
|
74
|
+
- rails_plugin/ap4r/tasks/ap4r.rake
|
75
|
+
- script/irm
|
76
|
+
- script/mongrel_ap4r
|
77
|
+
- script/start
|
78
|
+
- script/stop
|
79
|
+
- spec/local/dispatcher_base_spec.rb
|
80
|
+
- spec/spec_helper.rb
|
81
|
+
test_files:
|
82
|
+
- spec/local/dispatcher_base_spec.rb
|
84
83
|
rdoc_options:
|
85
84
|
- --main
|
86
|
-
- README
|
87
|
-
- --title
|
88
|
-
- Asynchronous Processing for Ruby
|
89
|
-
- --line-numbers
|
85
|
+
- README.txt
|
90
86
|
extra_rdoc_files:
|
91
|
-
-
|
92
|
-
-
|
93
|
-
-
|
87
|
+
- History.txt
|
88
|
+
- Manifest.txt
|
89
|
+
- README.txt
|
94
90
|
executables:
|
95
91
|
- ap4r_setup
|
96
92
|
extensions: []
|
@@ -108,7 +104,7 @@ dependencies:
|
|
108
104
|
version: 1.1.0
|
109
105
|
version:
|
110
106
|
- !ruby/object:Gem::Dependency
|
111
|
-
name:
|
107
|
+
name: activesupport
|
112
108
|
version_requirement:
|
113
109
|
version_requirements: !ruby/object:Gem::Version::Requirement
|
114
110
|
requirements:
|
@@ -117,7 +113,7 @@ dependencies:
|
|
117
113
|
version: 0.0.0
|
118
114
|
version:
|
119
115
|
- !ruby/object:Gem::Dependency
|
120
|
-
name:
|
116
|
+
name: mongrel
|
121
117
|
version_requirement:
|
122
118
|
version_requirements: !ruby/object:Gem::Version::Requirement
|
123
119
|
requirements:
|
@@ -126,7 +122,7 @@ dependencies:
|
|
126
122
|
version: 0.0.0
|
127
123
|
version:
|
128
124
|
- !ruby/object:Gem::Dependency
|
129
|
-
name:
|
125
|
+
name: rake
|
130
126
|
version_requirement:
|
131
127
|
version_requirements: !ruby/object:Gem::Version::Requirement
|
132
128
|
requirements:
|
data/README
DELETED
@@ -1,55 +0,0 @@
|
|
1
|
-
== What is AP4R?
|
2
|
-
|
3
|
-
AP4R, Asynchronous Processing for Ruby, is the implementation of reliable asynchronous message processing. It provides message queuing, and message dispatching.
|
4
|
-
Using asynchronous processing, we can cut down turn-around-time of web applications by queuing, or can utilize more machine power by load-balancing.
|
5
|
-
Also AP4R nicely ties with your Ruby on Rails applications. See Hello World sample application from rubyforge.
|
6
|
-
|
7
|
-
For more information, please step in AP4R homepage!
|
8
|
-
|
9
|
-
http://ap4r.rubyforge.org/wiki/wiki.pl
|
10
|
-
|
11
|
-
== Features
|
12
|
-
|
13
|
-
1. Business logics can be implemented as simple Web applications, or ruby code, whether it's called asynchronously or synchronously.
|
14
|
-
1. Asynchronous messaging is reliable by RDBMS persistence (now MySQL only) or file persistence, under the favor of reliable-msg.
|
15
|
-
1. Load balancing over multiple AP4R processes on single/multiple servers is supported.
|
16
|
-
1. Asynchronous logics are called via various protocols, such as XML-RPC, SOAP, HTTP PUT, and more.
|
17
|
-
1. Using store and forward function, at-least-omce QoS level is provided.
|
18
|
-
|
19
|
-
== Typical process flow
|
20
|
-
|
21
|
-
1. A client(e.g. a web browser) makes a request to a web server (Apache, Lighttpd, etc...).
|
22
|
-
1. A rails application (a synchronous logic) is executed on mongrel via mod_proxy or something.
|
23
|
-
1. At the last of the synchronous logic, message(s) are put to AP4R (AP4R provides a helper).
|
24
|
-
1. Once the synchronous logic is done, the clients receives a response immediately.
|
25
|
-
1. AP4R queues the message, and requests it to the web server asynchronously.
|
26
|
-
1. An asynchronous logic, implemented as usual rails action, is executed.
|
27
|
-
|
28
|
-
|
29
|
-
== Installation
|
30
|
-
|
31
|
-
Use RubyGems command.
|
32
|
-
|
33
|
-
$ sudo gem install ap4r --include-dependencies
|
34
|
-
|
35
|
-
== References
|
36
|
-
|
37
|
-
* Ruby Homepage
|
38
|
-
* http://www.ruby-lang.org/
|
39
|
-
* Ruby on Rails tutorial
|
40
|
-
* http://www.onlamp.com/pub/a/onlamp/2005/01/20/rails.html
|
41
|
-
* MySQL tutorial
|
42
|
-
* http://dev.mysql.com/doc/refman/5.0/en/index.html
|
43
|
-
* reliable-msg
|
44
|
-
* http://trac.labnotes.org/cgi-bin/trac.cgi/wiki/Ruby/ReliableMessaging
|
45
|
-
|
46
|
-
== Licence
|
47
|
-
|
48
|
-
This licence is licensed under the MIT license.
|
49
|
-
Copyright(c) 2007 Future Architect Inc.
|
50
|
-
|
51
|
-
== Authors
|
52
|
-
|
53
|
-
* Kiwamu Kato
|
54
|
-
* Shunichi Shinohara
|
55
|
-
|
data/script/loop.cmd
DELETED