2. Co to jest Torquebox ?
● Torquebox to zmodyfikowany JBoss AS 7,
który integruje środowisko JEE ze
środowiskiem Rubiego.
● Dostarcza interfejsy Ruby do usług
dostarczanych przez server aplikacji
● pozwala uruchamiać Jave i Ruby w tym
samym kontenerze aplikacji
● umożliwia szybkie i proste sklastrowanie
aplikacji
3. JRuby
• połączenie Ruby i JVM
• Java i Ruby mogą się integrować
require 'java'
java.lang.System.setProperty('key','value')
java_import java.util.HashMap
hashmap = HashMap.new
hashmap['key'] = 'value'
9. Workery
class RawOfferMessageProcessor < TorqueBox::Messaging::MessageProcessor
include TorqueBox::Injectors
include AirbrakeReportable
def on_message(body)
out_msg = OfferChecker.new.check body
if out_msg
queue = inject('/queues/offer')
queue.publish(out_msg)
end
end
def on_error(error)
notify_airbrake(error, {parameters: {message: @message.decode}})
end
end
12. Backgroundable
sprawdz stan zadania nieblokującego
something = Something.new
future = something.background.foo
future.started?
future.complete?
future.error?
future.result
13. Backgroundable
sprawdz stan zadania nieblokującego
class Something
def foo
...
count+=1
future.status=count
...
end something = Something.new
end future = something.background.foo
future.status_changed?
future.status #=>42
19. Resource Injection
metody
inject_cdi(...)
Injects CDI resources by literal class name.
inject_queue(...)
Injects a messaging queue by literal name.
inject_topic(...)
Injects a messaging topic by literal name.
inject_naming(...)
Injects JNDI resources by literal name.
inject_msc(...)
Injects MSC services by literal name.
inject_service(...)
Injects a TorqueBox application service component
22. Cache
bezpośredni dostep do własnej przestrzeni
include ActiveSupport::Cache
my_cache = TorqueBoxStore.new(:name=>'MyCache', :
mode=>:replicated, :sync=>true)
my_cache.put('klucz','wartość')
my_cache.put_if_absent('klucz','inna wartość')
my_cache.replace('klucz','jeszcze inna wartość')
Torquebox.transaction do
my_cache.remove( 'klucz' )
end
my_cache.transaction do
my_cache.put_if_absent('klucz','zupełnie inna wartość')
end
23. Cache
tryby pracy
Local
Domyślny, wszystko jest trzymane w ramach pojedyńczego node'a, odpowiednik
trzymania w pamięci ale pozwala na zapewnienie persystencji, daje transakcje
Invalidation
Domyślny w trybie clustra, nie wysyla zmian do innych node'ów tylko komunikaty o
przedawnieniu klucza. Dobrze sprawuje sie do cacheowania widoków i innych
szybkich do odtworzenia wartości
Replicated
Kopiuje zawartość klucza do kazdego node'a, odczyty będą wykonywane już
lokalnie
Distributed
czyli sharding + replikacja, memcache, redis schowajcie sie :-P
24. Cache noSQL data mapper
require 'dm-core'
require 'datamapper/dm-infinispan-adapter'
class Beer
include DataMapper::Resource
property :id, Serial
property :name, String
property :desc, Text
property :likes, Integer
property :created_at, DateTime
end
DataMapper.setup(:default, :adapter=>'infinispan', :persist=>'db/infinispan')
DataMapper::Model.raise_on_save_failure = true
DataMapper.finalize
Beer.create(:name=>'Catawba White Zombie Ale',
:description=>'A Belgium white ale made with coriander, orange peel, and wheat.
This beer is refreshing and tasty with a sweet and shimmering frothy head.',
:created_at=>Time.now)
beers = Beer.all(:desc.like => "%belgium%", :name.like => "%ale%")