46. RUN THE APP
$ bundle exec ruby lib/server.rb
[main] INFO ratpack.server.RatpackServer - Starting server ...
[main] INFO ratpack.server.RatpackServer - Building registry ...
[main] INFO ratpack.server.RatpackServer - Ratpack started ...
47. FIND IT ON GITHUB
https://github.com/jkutner/jruby-ratpack-async-demo
58. lib/server.rb
RatpackServer.start do |b|
book_service = BookService.new
b.handlers do |chain|
chain.get do |ctx|
book_service.all(ctx).subscribe do |books|
render_erb(ctx, "index.html.erb", binding)
end
end
Observable Subscription
60. lib/book_service.rb
class BookService
def initialize
@db = BookDbCommands.new
@isbn_db = IsbnDbCommands.new
end
def all(ctx)
@db.all.flat_map do |row|
@isbn_db.get_book(ctx, row[:isbn]).map do |json|
row.merge(JSON.parse(json))
end
end.to_list
end
61. lib/book_service.rb
class BookService
def initialize
@db = BookDbCommands.new
@isbn_db = IsbnDbCommands.new
end
def all(ctx)
@db.all.flat_map do |row|
@isbn_db.get_book(ctx, row[:isbn]).map do |json|
row.merge(JSON.parse(json))
end
end.to_list
end
Observable
62. lib/book_service.rb
class BookService
def initialize
@db = BookDbCommands.new
@isbn_db = IsbnDbCommands.new
end
def all(ctx)
@db.all.flat_map do |row|
@isbn_db.get_book(ctx, row[:isbn]).map do |json|
row.merge(JSON.parse(json))
end
end.to_list
end Observable
63. lib/book_service.rb
class BookService
def initialize
@db = BookDbCommands.new
@isbn_db = IsbnDbCommands.new
end
def all(ctx)
@db.all.flat_map do |row|
@isbn_db.get_book(ctx, row[:isbn]).map do |json|
row.merge(JSON.parse(json))
end
end.to_list
end
Observable
64. lib/book_service.rb
class BookService
def initialize
@db = BookDbCommands.new
@isbn_db = IsbnDbCommands.new
end
def all(ctx)
@db.all.flat_map do |row|
@isbn_db.get_book(ctx, row[:isbn]).map do |json|
row.merge(JSON.parse(json))
end
end.to_list
end
Observable
65. lib/book_service.rb
class BookService
def initialize
@db = BookDbCommands.new
@isbn_db = IsbnDbCommands.new
end
def all(ctx)
@db.all.flat_map do |row|
@isbn_db.get_book(ctx, row[:isbn]).map do |json|
row.merge(JSON.parse(json))
end
end.to_list
end
Observable
66. OBSERVABLES
▸ all:
Observable that will emit items
▸ flat_map:
Applies a function to each item, and returns an Observable
that emits items
▸ to_list:
Returns an Observable that emits an Array of items
▸ subscribe:
Returns a Subscription to the Observable
68. lib/book_db_commands.rb
class BookDbCommands
def all(ctx)
s = HystrixObservableCommand ::Setter.
with_group_key(GROUP_KEY).
and_command_key(HystrixCommandKey ::Factory.as_key("getAll"))
Class.new(HystrixObservableCommand) do
def construct
RxRatpack.observe_each(Blocking.get {
DB["select isbn, quantity, price from books order by isbn"].all
})
end
def get_cache_key
"db-bookdb-all"
end
end.new(s).to_observable
end
69. lib/book_db_commands.rb
class BookDbCommands
def all(ctx)
s = HystrixObservableCommand ::Setter.
with_group_key(GROUP_KEY).
and_command_key(HystrixCommandKey ::Factory.as_key("getAll"))
Class.new(HystrixObservableCommand) do
def construct
RxRatpack.observe_each(Blocking.get {
DB["select isbn, quantity, price from books order by isbn"].all
})
end
def get_cache_key
"db-bookdb-all"
end
end.new(s).to_observable
end
70. lib/book_db_commands.rb
class BookDbCommands
def all(ctx)
s = HystrixObservableCommand ::Setter.
with_group_key(GROUP_KEY).
and_command_key(HystrixCommandKey ::Factory.as_key("getAll"))
Class.new(HystrixObservableCommand) do
def construct
RxRatpack.observe_each(Blocking.get {
DB["select isbn, quantity, price from books order by isbn"].all
})
end
def get_cache_key
"db-bookdb-all"
end
end.new(s).to_observable
end
71. lib/book_db_commands.rb
class BookDbCommands
def all(ctx)
s = HystrixObservableCommand ::Setter.
with_group_key(GROUP_KEY).
and_command_key(HystrixCommandKey ::Factory.as_key("getAll"))
Class.new(HystrixObservableCommand) do
def construct
RxRatpack.observe_each(Blocking.get {
DB["select isbn, quantity, price from books order by isbn"].all
})
end
def get_cache_key
"db-bookdb-all"
end
end.new(s).to_observable
end
72. FIND IT ON GITHUB
https://github.com/jkutner/jruby-ratpack-books-example
73. IN RUBY…
WAYS TO DO ASYNC
▸ Netty (via Ratpack)
▸ Servlet 3.1 Async (via Warbler)
▸ Vert.x
▸ EventMachine