Class AsyncShopController < ApplicationController
def order # synchronous part
o = Order.new(:name => params[:name])
o.save!
ap4r.async_to({:action => ‘payment’},
{:order_id => o.id})
redirect_to ...
end
def payment # asynchronous part
Payment.new(:order_id => params[:order_id]).save!
...
render :text => ‘true’
end
end
83
User Apache Rails AP4R
84
User Apache Rails AP4R
order
message put
85
Class AsyncShopController < ApplicationController
def order # synchronous part
o = Order.new(:name => params[:name])
o.save!
ap4r.async_to({:action => ‘payment’},
{:order_id => o.id})
redirect_to ...
end
def payment # asynchronous part
Payment.new(:order_id => params[:order_id]).save!
...
render :text => ‘true’
end
end
86
User Apache Rails AP4R
order
message put
87
User Apache Rails AP4R
dispatch
88
User Apache Rails AP4R
payment
89
Class AsyncShopController < ApplicationController
def order # synchronous part
o = Order.new(:name => params[:name])
o.save!
ap4r.async_to({:action => ‘payment’},
{:order_id => o.id})
redirect_to ...
end
def payment # asynchronous part
Payment.new(:order_id => params[:order_id]).save!
...
render :text => ‘true’
end
end
90
Rails app-DB AP4R msg-DB
CRUD Store
SAF create
commit
Forward
message put
insert /commit
SAF delete
✓
120
Enterprise Integration Patterns:
Designing, Building, and
Deploying Messaging Solutions
by Gregor Hohpe,Bobby Woolf
Guaranteed Delivery [122]
121
SAF
122
123
Rails app-DB AP4R
start
end
124
Rails app-DB AP4R
start
CRUD
end
124
Rails app-DB AP4R
start
CRUD
commit
end
124
Rails app-DB AP4R
start
CRUD
commit
message put / commit
end
124
Rails app-DB AP4R
start
CRUD
commit
message put / commit
end
data
124
Rails app-DB AP4R
start
CRUD
commit
message put / commit
end
data messages
124
125
...
•
•
126
...
•
•
127
☺
128
129
Ap4r::Client#transaction
Class ShopController < ApplicationController
def order # synchronous side
ap4r.transaction do
o = Order.new(:name => params[:order_id])
o.save!
ap4r.async_to({:action => ‘payment’},
{:order_id => o.id})
end
redirect_to ...
end
end
130
131
ap4r.transaction
ap4r.transaction do
... # CRUD on database
ap4r.async_to(...)
end
132
ap4r.transaction
ap4r.transaction do
... # CRUD on database
ap4r.async_to(...) Insert into SAF table
end
132
ap4r.transaction
ap4r.transaction do
... # CRUD on database
ap4r.async_to(...) Insert into SAF table
end Commit database
132
ap4r.transaction
ap4r.transaction do
... # CRUD on database
ap4r.async_to(...) Insert into SAF table
end Commit database
Queue messages
132
ap4r.transaction
ap4r.transaction do
... # CRUD on database
ap4r.async_to(...) Insert into SAF table
Store
end Commit database
Queue messages
132
ap4r.transaction
ap4r.transaction do
... # CRUD on database
ap4r.async_to(...) Insert into SAF table
Store
end Commit database
Queue messages
Forward
132
SAF
133
start
CRUD
commit
message put / commit
end
data messages
134
start
CRUD
commit
message put / commit
end
data messages
134
start
CRUD
commit
message put / commit
end
data messages
135
start
CRUD
commit
message put / commit
end
data messages
135
start
CRUD
commit
message put / commit
end
data messages
135
start
CRUD
commit
message put / commit
end
data messages
136
start
CRUD
commit
message put / commit
end
data messages
136
start
CRUD
commit
message put / commit
end
data messages
136
start
CRUD
commit
counterchange
message put / commit
end
data messages
137
start
CRUD
message put / commit
counterchange
commit
end
data messages
138
start
CRUD
message put / commit
commit
end
data messages
139
start
CRUD
message put / commit
commit
end
data messages
139
start
CRUD
message put / commit
commit
end
data messages
140
start
CRUD
message put / commit
commit
end
data messages
140
start
CRUD
message put / commit
commit
end
data messages
140
start
CRUD
message put / commit
commit
end
data messages
141
start
CRUD
message put / commit
commit
end
data messages
141
start
CRUD
message put / commit
commit
end
data messages
141
•
• N/W
•
•
... etc
142
☺
☠
143
SAF
144
start CRUD
SAF create
commit
message put / commit
SAF update
end
data messages
145
start CRUD
SAF create
commit
message put / commit
SAF update
end
data messages
146
start CRUD
SAF create
commit
message put / commit
SAF update
end
data messages
146
start CRUD
SAF create
commit
message put / commit
SAF update
end
data messages
147
start CRUD
SAF create
commit
message put / commit
SAF update
end
data messages
147
start CRUD
SAF create
commit
message put / commit
SAF update
end
data messages
147
start CRUD
SAF create
commit
message put / commit
SAF update
end
data ☺ messages
147
start CRUD
SAF create
commit
message put / commit
SAF update
end
data messages
147
start CRUD
SAF create
commit
message put / commit
SAF update
end
data messages
148
start CRUD
SAF create
commit
message put / commit
SAF update
end
data messages
148
start CRUD
SAF create
commit
message put / commit
SAF update
end
data messages
149
start CRUD
SAF create
commit
message put / commit
SAF update
end
data messages
149
start CRUD
SAF create
commit
message put / commit
SAF update
end
data messages
149
start CRUD
SAF create
commit
message put / commit
SAF update
end
data ☺ messages
149
start CRUD
SAF create
commit
message put / commit
SAF update
end
data messages
150
start CRUD
SAF create
commit
message put / commit
SAF update
end
data messages
150
start CRUD
SAF create
commit
message put / commit
SAF update
end
data messages
151
start CRUD
SAF create
commit
message put / commit
SAF update
end
data messages
151
start CRUD
SAF create
commit
message put / commit
SAF update
end
data messages
messages
151
start CRUD
SAF create
commit
message put / commit
Recoverable
SAF update
end
data messages
messages
151
start CRUD
SAF create
commit
message put / commit
Recoverable
SAF update
end
data
messages ☺ messages
151
start CRUD
SAF create
commit
message put / commit
SAF update
end
data messages
152
start CRUD
SAF create
commit
message put / commit
SAF update
end
data messages
152
start CRUD
SAF create
commit
message put / commit
SAF update
end
data messages
153
start CRUD
SAF create
commit
message put / commit
SAF update
end
data messages
messages
153
start CRUD
SAF create
commit
message put / commit
SAF update
end
data
messages ☺ messages
153
start CRUD
SAF create
commit
message put / commit
SAF update Duplicated
end
data
messages ☺ messages
153
def test_order
post :order, :order => {:item => \"introduction to AP4R\"}
assert_response :redirect
assert_redirected_to :action => 'index'
messages = @controller.ap4r.queued_messages # ... (1)
assert_equal 1, messages.keys.size, \"should have messages in just ONE queue\"
assert messages.key?(\"queue.async_shop.payment\"), \"queue name is INCORRECT\"
# ... (2)
assert_equal 1, messages[\"queue.async_shop.payment\"].size,
\"should have just ONE message for payment\"
assert_match /order_id=\\d+/, messages[\"queue.async_shop.payment\"].first[:body],
\"parameter order_id should be included with a numeric value\" # ... (3)
end
1.
2. assert
3. assert
168
functional test
rake .. CRUD
message put
Stub
assert
assert
169
Async
•
•
• e.g.
170
171
[RAILS_ROOT]/test/async/ap4r_test_helper.rb
ENV[\"RAILS_ENV\"] = \"test\"
require File.expand_path(File.dirname(__FILE__) + \"/../../config/environment\")
require \"ap4r/service_handler\"
ap4r_test_helper = Ap4r::ServiceHandler.new
require 'test_help'
class Test::Unit::TestCase
self.use_transactional_fixtures = false
self.use_instantiated_fixtures = false
# Add more helper methods to be used by all tests here...
cattr_accessor :ap4r_helper
def ap4r_helper
@@ap4r_helper
end
def with_services(&block)
ap4r_helper.with_services(&block)
end
end
Test::Unit::TestCase.ap4r_helper = ap4r_test_helper
172
[RAILS_ROOT]/test/async/async_shop_test.rb
require \"#{File.dirname(__FILE__)}/ap4r_test_helper\"
require 'net/http'
class AsyncShopTest < Test::Unit::TestCase
def test_http_dispatch
ap4r_helper.stop_dispatchers # ... (1)
assert_rows_added(Order, 1) { # ... (3)
do_order # ... (2)
}
assert_rows_added(Payment, 1) { # ... (6)
ap4r_helper.start_dispatchers # ... (4)
ap4r_helper.wait_all_done # ... (5)
}
end
private
# Requests to <tt>async_shop/order</tt>.
def do_order(item_name = \"test item\")
Net::HTTP.start(\"localhost\", 3000, nil, nil) do |http|
http.request_post(\"/async_shop/order\",
\"order[item]=#{item_name}\") do |res|
#nop
end
end
end
def assert_rows_added(model, rows)
rows_before = model.count
yield
rows_after = model.count
assert_equal rows, rows_after - rows_before, \"table '#{model.table_name}' should count up by #{rows}\"
end
end
173
async test
rake ..
service control
HTTP
CRUD
message put
assert
HTTP
CRUD
assert
175
• 2
• Functional
• Async
•
176
6.
177
AP4R ..
178
179
API
SAF
180
• API
• Rails
•
181
• dispatcher
• SAF
•
182
183
ver.0.3.x
☑
☑ URL
☑ DLQ / SAF
□ : Stomp, HTTP
184
ver.0.4.x
□ OSS Cacti,
ZABBIX
□ AP4R
□
185
ver.0.5.x
□
□
□
186
□
☑
□
□ Ruby off Rails
187
AP4R@RubyForge
• wiki: http://ap4r.rubyforge.org/wiki/wiki.pl?HomePage
• source: svn co http://ap4r.rubyforge.org/svn/trunk/ap4r
• ML: http://rubyforge.org/mailman/listinfo/ap4r-user
Your patches are welcome!
Thank you.
by Kanican
188
• Future Architect logo belongs to Future Architect, Inc.
Japan. All rights reserved.
• Rails logo is trademarks of David Heinemeier
Hansson. All rights reserved.
• The Ruby logo is copyrighted (c) 2006, Yukihiro
Matsumoto. It is released under the terms of the
Creative Commons Attribution-ShareAlike 2.5 License.
189
0 comments
Post a comment