SlideShare a Scribd company logo
1 of 29
Download to read offline
Torquebox 2



        Przemysław Wróblewski
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
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'
JRuby
Torquebox - co jest w środku ?
Kolejki
Workery - konfiguracja
config/torquebox.yml:

queues:
 /queues/raw_offer:
   durable: false

messaging:
 default_message_encoding: marshal
 /queues/raw_offer:
   RawOfferMessageProcessor:
    concurrency: 18
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
Backgroundable
standardowa klasa + blokujące wywołanie
class Something
 def foo
   sleep 5
 end
end

something = Something.new
something.foo
Backgroundable
wywołanie nie blokujące
class Something
 include TorqueBox::Messaging::Backgroundable
 def foo
   sleep 5
 end
end

something = Something.new
something.background.foo
Backgroundable
sprawdz stan zadania nieblokującego
something = Something.new
future = something.background.foo

future.started?
future.complete?
future.error?
future.result
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
Cron
config/torquebox.yml:

jobs:
  data_import:
   description: "Import danych z importu 2.0"
   job:    DataImportJob
   cron:     '0 10 18 * * ?'
   singleton: true
Cron
app/jobs/data_import_job.rb:

class DataImportJob
 def initialize
   dump_directory = File.join(Date.today.to_s(:number))
   @importer = DataImporter.new(dump_directory)
 end

 def run
  ...
 end
end
Usługi
app/services/time_machine.rb:

class TimeMachine
 def initialize(opts)
   @queue=Queue.new(opts['queue'])
 end
 def start
   Thread.new { run }
 end
 def stop
   @done=true
 end
 ...
end
Usługi
config/torquebox.yml:

services:
 TimeMachine:
  config:
    queue: /queue/time
Resource Injection
app/controllers/my_contoller.rb:

class MyController < ApplicationController
 include TorqueBox::Injectors

 def stop
  # Service defined with a unique name in torquebox.yml
  the_torque_service = inject( 'service:TimeMachine' )
  the_torque_service.stop
 end

end
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
Cache
Cache
RailsCaching

config/application.rb:

module MyApp
 class Application < Rails::Application
  ...
  config.cache_store=:torque_box_store
 end
end
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
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
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%")
monitoring
monitoring
monitoring
jboss2:8080/monitoring
Torquebox 2
                    http://torquebox.org/
TorqueBox – moc Javy, piękno Rubiego – Marek Goldmann
    Wideo: http://video-it.pl/2011/07/torquebox-moc-javy-piekno-rubiego-marek-goldmann/
    Slajdy: http://www.slideshare.net/marekgoldmann/torquebox-moc-javy-pikno-rubiego
             Demo: https://github.com/goldmann/confitura-2011-torquebox-demo

More Related Content

What's hot

Laravelowe paczki do uwierzytelniania
Laravelowe paczki do uwierzytelnianiaLaravelowe paczki do uwierzytelniania
Laravelowe paczki do uwierzytelnianiaLaravel Poland MeetUp
 
Budowa elementów GUI za pomocą biblioteki React - szybki start
Budowa elementów GUI za pomocą biblioteki React - szybki startBudowa elementów GUI za pomocą biblioteki React - szybki start
Budowa elementów GUI za pomocą biblioteki React - szybki startSages
 
Asynchroniczny PHP i komunikacja czasu rzeczywistego z wykorzystaniem websocketw
Asynchroniczny PHP i komunikacja czasu rzeczywistego z wykorzystaniem websocketwAsynchroniczny PHP i komunikacja czasu rzeczywistego z wykorzystaniem websocketw
Asynchroniczny PHP i komunikacja czasu rzeczywistego z wykorzystaniem websocketwLuke Adamczewski
 
Hugo - make webdev fun again
Hugo - make webdev fun againHugo - make webdev fun again
Hugo - make webdev fun againMarcin Gajda
 
Webpack - Czym jest webpack i dlaczego chcesz go używać? - wersja krótka
Webpack - Czym jest webpack i dlaczego chcesz go używać? - wersja krótkaWebpack - Czym jest webpack i dlaczego chcesz go używać? - wersja krótka
Webpack - Czym jest webpack i dlaczego chcesz go używać? - wersja krótkaMarcin Gajda
 
Jak zostać mobile deweloperem w 1 dzień
Jak zostać mobile deweloperem w 1 dzieńJak zostać mobile deweloperem w 1 dzień
Jak zostać mobile deweloperem w 1 dzieńPaweł Kondraciuk
 
Automatyzacja utrzymania jakości w środowisku PHP
Automatyzacja utrzymania jakości w środowisku PHPAutomatyzacja utrzymania jakości w środowisku PHP
Automatyzacja utrzymania jakości w środowisku PHPLaravel Poland MeetUp
 
AADays 2015 - Jak to zrobic w JavaScript
AADays 2015 - Jak to zrobic w JavaScriptAADays 2015 - Jak to zrobic w JavaScript
AADays 2015 - Jak to zrobic w JavaScriptJacek Okrojek
 
Camel-Drools - Javarsovia 2010
Camel-Drools - Javarsovia 2010Camel-Drools - Javarsovia 2010
Camel-Drools - Javarsovia 2010Maciek Próchniak
 
PHP@Docker - w produkcji
PHP@Docker - w produkcjiPHP@Docker - w produkcji
PHP@Docker - w produkcjiMarcin Kurzyna
 
Ruby, Ruby on Rails 2010
Ruby, Ruby on Rails 2010Ruby, Ruby on Rails 2010
Ruby, Ruby on Rails 2010Natalia Stanko
 
Podstawy AngularJS
Podstawy AngularJSPodstawy AngularJS
Podstawy AngularJSSages
 
ansible kmonticolo bezlogo
ansible kmonticolo bezlogoansible kmonticolo bezlogo
ansible kmonticolo bezlogoKamil Monticolo
 
Co nowego w świecie Ruby\'ego
Co nowego w świecie Ruby\'egoCo nowego w świecie Ruby\'ego
Co nowego w świecie Ruby\'egoBootstrap
 

What's hot (20)

NSOperation(Queue)
NSOperation(Queue) NSOperation(Queue)
NSOperation(Queue)
 
CruiseControl.rb
CruiseControl.rbCruiseControl.rb
CruiseControl.rb
 
GlusterFS
GlusterFSGlusterFS
GlusterFS
 
Laravelowe paczki do uwierzytelniania
Laravelowe paczki do uwierzytelnianiaLaravelowe paczki do uwierzytelniania
Laravelowe paczki do uwierzytelniania
 
Budowa elementów GUI za pomocą biblioteki React - szybki start
Budowa elementów GUI za pomocą biblioteki React - szybki startBudowa elementów GUI za pomocą biblioteki React - szybki start
Budowa elementów GUI za pomocą biblioteki React - szybki start
 
Asynchroniczny PHP i komunikacja czasu rzeczywistego z wykorzystaniem websocketw
Asynchroniczny PHP i komunikacja czasu rzeczywistego z wykorzystaniem websocketwAsynchroniczny PHP i komunikacja czasu rzeczywistego z wykorzystaniem websocketw
Asynchroniczny PHP i komunikacja czasu rzeczywistego z wykorzystaniem websocketw
 
JavaScript, Moduły
JavaScript, ModułyJavaScript, Moduły
JavaScript, Moduły
 
Hugo - make webdev fun again
Hugo - make webdev fun againHugo - make webdev fun again
Hugo - make webdev fun again
 
Webpack - Czym jest webpack i dlaczego chcesz go używać? - wersja krótka
Webpack - Czym jest webpack i dlaczego chcesz go używać? - wersja krótkaWebpack - Czym jest webpack i dlaczego chcesz go używać? - wersja krótka
Webpack - Czym jest webpack i dlaczego chcesz go używać? - wersja krótka
 
Jak zostać mobile deweloperem w 1 dzień
Jak zostać mobile deweloperem w 1 dzieńJak zostać mobile deweloperem w 1 dzień
Jak zostać mobile deweloperem w 1 dzień
 
Automatyzacja utrzymania jakości w środowisku PHP
Automatyzacja utrzymania jakości w środowisku PHPAutomatyzacja utrzymania jakości w środowisku PHP
Automatyzacja utrzymania jakości w środowisku PHP
 
AADays 2015 - Jak to zrobic w JavaScript
AADays 2015 - Jak to zrobic w JavaScriptAADays 2015 - Jak to zrobic w JavaScript
AADays 2015 - Jak to zrobic w JavaScript
 
Camel-Drools - Javarsovia 2010
Camel-Drools - Javarsovia 2010Camel-Drools - Javarsovia 2010
Camel-Drools - Javarsovia 2010
 
PHP@Docker - w produkcji
PHP@Docker - w produkcjiPHP@Docker - w produkcji
PHP@Docker - w produkcji
 
Ruby, Ruby on Rails 2010
Ruby, Ruby on Rails 2010Ruby, Ruby on Rails 2010
Ruby, Ruby on Rails 2010
 
Barcamp 08/06/2010
Barcamp 08/06/2010Barcamp 08/06/2010
Barcamp 08/06/2010
 
PHP-PM. Hit czy kit?
PHP-PM. Hit czy kit?PHP-PM. Hit czy kit?
PHP-PM. Hit czy kit?
 
Podstawy AngularJS
Podstawy AngularJSPodstawy AngularJS
Podstawy AngularJS
 
ansible kmonticolo bezlogo
ansible kmonticolo bezlogoansible kmonticolo bezlogo
ansible kmonticolo bezlogo
 
Co nowego w świecie Ruby\'ego
Co nowego w świecie Ruby\'egoCo nowego w świecie Ruby\'ego
Co nowego w świecie Ruby\'ego
 

Viewers also liked

Skalowalność przy błyskawicznym wzroście
Skalowalność przy błyskawicznym wzrościeSkalowalność przy błyskawicznym wzroście
Skalowalność przy błyskawicznym wzrościeMarcin Grzybowski
 
Graph cafe-lightning
Graph cafe-lightningGraph cafe-lightning
Graph cafe-lightningVolker Pacher
 
VIII Targi eHandlu: Tomasz Sobol, Beyond.pl "Efekt Wykop - byłem, przeżyłem, ...
VIII Targi eHandlu: Tomasz Sobol, Beyond.pl "Efekt Wykop - byłem, przeżyłem, ...VIII Targi eHandlu: Tomasz Sobol, Beyond.pl "Efekt Wykop - byłem, przeżyłem, ...
VIII Targi eHandlu: Tomasz Sobol, Beyond.pl "Efekt Wykop - byłem, przeżyłem, ...ecommerce poland expo
 
MediaMonks: Games vs Advertising
MediaMonks: Games vs AdvertisingMediaMonks: Games vs Advertising
MediaMonks: Games vs AdvertisingMediaMonks Haar
 

Viewers also liked (7)

It od kuchni w nokaut.pl
It od kuchni w nokaut.plIt od kuchni w nokaut.pl
It od kuchni w nokaut.pl
 
Skalowalność przy błyskawicznym wzroście
Skalowalność przy błyskawicznym wzrościeSkalowalność przy błyskawicznym wzroście
Skalowalność przy błyskawicznym wzroście
 
Graph cafe-lightning
Graph cafe-lightningGraph cafe-lightning
Graph cafe-lightning
 
VIII Targi eHandlu: Tomasz Sobol, Beyond.pl "Efekt Wykop - byłem, przeżyłem, ...
VIII Targi eHandlu: Tomasz Sobol, Beyond.pl "Efekt Wykop - byłem, przeżyłem, ...VIII Targi eHandlu: Tomasz Sobol, Beyond.pl "Efekt Wykop - byłem, przeżyłem, ...
VIII Targi eHandlu: Tomasz Sobol, Beyond.pl "Efekt Wykop - byłem, przeżyłem, ...
 
MediaMonks
MediaMonksMediaMonks
MediaMonks
 
SphinxSearch
SphinxSearchSphinxSearch
SphinxSearch
 
MediaMonks: Games vs Advertising
MediaMonks: Games vs AdvertisingMediaMonks: Games vs Advertising
MediaMonks: Games vs Advertising
 

Similar to Torquebox

Asynchroniczny PHP & komunikacja czasu rzeczywistego z wykorzystaniem websock...
Asynchroniczny PHP & komunikacja czasu rzeczywistego z wykorzystaniem websock...Asynchroniczny PHP & komunikacja czasu rzeczywistego z wykorzystaniem websock...
Asynchroniczny PHP & komunikacja czasu rzeczywistego z wykorzystaniem websock...Polcode
 
Michał Dec - Quality in Clouds
Michał Dec - Quality in CloudsMichał Dec - Quality in Clouds
Michał Dec - Quality in Cloudskraqa
 
Monitoring systemu. Dlaczego mój kardiolog jest bogatym człowiekiem?
Monitoring systemu. Dlaczego mój kardiolog jest bogatym człowiekiem?Monitoring systemu. Dlaczego mój kardiolog jest bogatym człowiekiem?
Monitoring systemu. Dlaczego mój kardiolog jest bogatym człowiekiem?The Software House
 
“Dziesięć serwerów poproszę!“, czyli co może Ci zaoferować definiowanie infra...
“Dziesięć serwerów poproszę!“, czyli co może Ci zaoferować definiowanie infra...“Dziesięć serwerów poproszę!“, czyli co może Ci zaoferować definiowanie infra...
“Dziesięć serwerów poproszę!“, czyli co może Ci zaoferować definiowanie infra...The Software House
 
Testowanie rozwiązań serverless z LocalStack
Testowanie rozwiązań serverless z LocalStackTestowanie rozwiązań serverless z LocalStack
Testowanie rozwiązań serverless z LocalStackThe Software House
 
Migrate API w Drupalu [PL]
Migrate API w Drupalu [PL]Migrate API w Drupalu [PL]
Migrate API w Drupalu [PL]Droptica
 
Sekrety magicznego ogrodu Docker
Sekrety magicznego ogrodu DockerSekrety magicznego ogrodu Docker
Sekrety magicznego ogrodu DockerKamil Grabowski
 
PLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOps
PLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOpsPLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOps
PLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOpsPROIDEA
 
Microservieces and their communication (RabbitMQ/SIDEKIQ)
Microservieces and their communication (RabbitMQ/SIDEKIQ)Microservieces and their communication (RabbitMQ/SIDEKIQ)
Microservieces and their communication (RabbitMQ/SIDEKIQ)infakt
 
Warsztaty: Podstawy PHP - część 2 - omówienie składni języka PHP (wersja 7)
Warsztaty: Podstawy PHP - część 2 - omówienie składni języka PHP (wersja 7)Warsztaty: Podstawy PHP - część 2 - omówienie składni języka PHP (wersja 7)
Warsztaty: Podstawy PHP - część 2 - omówienie składni języka PHP (wersja 7)Codesushi.co (CODESUSHI LLC)
 
[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro
[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro
[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegroallegro.tech
 
Ganymede - nowoczesne technologie w grach przeglądarkowych i mobilnych
Ganymede - nowoczesne technologie w grach przeglądarkowych i mobilnychGanymede - nowoczesne technologie w grach przeglądarkowych i mobilnych
Ganymede - nowoczesne technologie w grach przeglądarkowych i mobilnychSKN Shader
 
Confitura 2018 - Sekretne życie jobów Sparkowych
Confitura 2018 - Sekretne życie jobów SparkowychConfitura 2018 - Sekretne życie jobów Sparkowych
Confitura 2018 - Sekretne życie jobów SparkowychMarcin Jasiński
 
Webinar - Podstawy Node.js
Webinar - Podstawy Node.jsWebinar - Podstawy Node.js
Webinar - Podstawy Node.jsWojciech Kaniuka
 
Laravel workshops 1
Laravel workshops 1Laravel workshops 1
Laravel workshops 1Kamil Fojuth
 
Przenieś się do kontenera, czyli korzyści z Docker i Docker Compose
Przenieś się do kontenera, czyli korzyści z Docker i Docker ComposePrzenieś się do kontenera, czyli korzyści z Docker i Docker Compose
Przenieś się do kontenera, czyli korzyści z Docker i Docker ComposeMariusz Bąk
 
Xdebug – debugowanie i profilowanie aplikacji PHP
Xdebug – debugowanie i profilowanie aplikacji PHPXdebug – debugowanie i profilowanie aplikacji PHP
Xdebug – debugowanie i profilowanie aplikacji PHP3camp
 
Debugowanie skryptow php za pomoca xdebug
Debugowanie skryptow php za pomoca xdebugDebugowanie skryptow php za pomoca xdebug
Debugowanie skryptow php za pomoca xdebugXSolve
 
Modularny JavaScript - meet.js
Modularny JavaScript - meet.jsModularny JavaScript - meet.js
Modularny JavaScript - meet.jsPatryk Jar
 

Similar to Torquebox (20)

Asynchroniczny PHP & komunikacja czasu rzeczywistego z wykorzystaniem websock...
Asynchroniczny PHP & komunikacja czasu rzeczywistego z wykorzystaniem websock...Asynchroniczny PHP & komunikacja czasu rzeczywistego z wykorzystaniem websock...
Asynchroniczny PHP & komunikacja czasu rzeczywistego z wykorzystaniem websock...
 
Michał Dec - Quality in Clouds
Michał Dec - Quality in CloudsMichał Dec - Quality in Clouds
Michał Dec - Quality in Clouds
 
Monitoring systemu. Dlaczego mój kardiolog jest bogatym człowiekiem?
Monitoring systemu. Dlaczego mój kardiolog jest bogatym człowiekiem?Monitoring systemu. Dlaczego mój kardiolog jest bogatym człowiekiem?
Monitoring systemu. Dlaczego mój kardiolog jest bogatym człowiekiem?
 
“Dziesięć serwerów poproszę!“, czyli co może Ci zaoferować definiowanie infra...
“Dziesięć serwerów poproszę!“, czyli co może Ci zaoferować definiowanie infra...“Dziesięć serwerów poproszę!“, czyli co może Ci zaoferować definiowanie infra...
“Dziesięć serwerów poproszę!“, czyli co może Ci zaoferować definiowanie infra...
 
Testowanie rozwiązań serverless z LocalStack
Testowanie rozwiązań serverless z LocalStackTestowanie rozwiązań serverless z LocalStack
Testowanie rozwiązań serverless z LocalStack
 
Migrate API w Drupalu [PL]
Migrate API w Drupalu [PL]Migrate API w Drupalu [PL]
Migrate API w Drupalu [PL]
 
Sekrety magicznego ogrodu Docker
Sekrety magicznego ogrodu DockerSekrety magicznego ogrodu Docker
Sekrety magicznego ogrodu Docker
 
PLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOps
PLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOpsPLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOps
PLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOps
 
Microservieces and their communication (RabbitMQ/SIDEKIQ)
Microservieces and their communication (RabbitMQ/SIDEKIQ)Microservieces and their communication (RabbitMQ/SIDEKIQ)
Microservieces and their communication (RabbitMQ/SIDEKIQ)
 
Warsztaty: Podstawy PHP - część 2 - omówienie składni języka PHP (wersja 7)
Warsztaty: Podstawy PHP - część 2 - omówienie składni języka PHP (wersja 7)Warsztaty: Podstawy PHP - część 2 - omówienie składni języka PHP (wersja 7)
Warsztaty: Podstawy PHP - część 2 - omówienie składni języka PHP (wersja 7)
 
[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro
[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro
[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro
 
Ganymede - nowoczesne technologie w grach przeglądarkowych i mobilnych
Ganymede - nowoczesne technologie w grach przeglądarkowych i mobilnychGanymede - nowoczesne technologie w grach przeglądarkowych i mobilnych
Ganymede - nowoczesne technologie w grach przeglądarkowych i mobilnych
 
Confitura 2018 - Sekretne życie jobów Sparkowych
Confitura 2018 - Sekretne życie jobów SparkowychConfitura 2018 - Sekretne życie jobów Sparkowych
Confitura 2018 - Sekretne życie jobów Sparkowych
 
Webinar - Podstawy Node.js
Webinar - Podstawy Node.jsWebinar - Podstawy Node.js
Webinar - Podstawy Node.js
 
Kickoff to Node.js
Kickoff to Node.jsKickoff to Node.js
Kickoff to Node.js
 
Laravel workshops 1
Laravel workshops 1Laravel workshops 1
Laravel workshops 1
 
Przenieś się do kontenera, czyli korzyści z Docker i Docker Compose
Przenieś się do kontenera, czyli korzyści z Docker i Docker ComposePrzenieś się do kontenera, czyli korzyści z Docker i Docker Compose
Przenieś się do kontenera, czyli korzyści z Docker i Docker Compose
 
Xdebug – debugowanie i profilowanie aplikacji PHP
Xdebug – debugowanie i profilowanie aplikacji PHPXdebug – debugowanie i profilowanie aplikacji PHP
Xdebug – debugowanie i profilowanie aplikacji PHP
 
Debugowanie skryptow php za pomoca xdebug
Debugowanie skryptow php za pomoca xdebugDebugowanie skryptow php za pomoca xdebug
Debugowanie skryptow php za pomoca xdebug
 
Modularny JavaScript - meet.js
Modularny JavaScript - meet.jsModularny JavaScript - meet.js
Modularny JavaScript - meet.js
 

Torquebox

  • 1. Torquebox 2 Przemysław Wróblewski
  • 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'
  • 5. Torquebox - co jest w środku ?
  • 6.
  • 8. Workery - konfiguracja config/torquebox.yml: queues: /queues/raw_offer: durable: false messaging: default_message_encoding: marshal /queues/raw_offer: RawOfferMessageProcessor: concurrency: 18
  • 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
  • 10. Backgroundable standardowa klasa + blokujące wywołanie class Something def foo sleep 5 end end something = Something.new something.foo
  • 11. Backgroundable wywołanie nie blokujące class Something include TorqueBox::Messaging::Backgroundable def foo sleep 5 end end something = Something.new something.background.foo
  • 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
  • 14. Cron config/torquebox.yml: jobs: data_import: description: "Import danych z importu 2.0" job: DataImportJob cron: '0 10 18 * * ?' singleton: true
  • 15. Cron app/jobs/data_import_job.rb: class DataImportJob def initialize dump_directory = File.join(Date.today.to_s(:number)) @importer = DataImporter.new(dump_directory) end def run ... end end
  • 16. Usługi app/services/time_machine.rb: class TimeMachine def initialize(opts) @queue=Queue.new(opts['queue']) end def start Thread.new { run } end def stop @done=true end ... end
  • 18. Resource Injection app/controllers/my_contoller.rb: class MyController < ApplicationController include TorqueBox::Injectors def stop # Service defined with a unique name in torquebox.yml the_torque_service = inject( 'service:TimeMachine' ) the_torque_service.stop end end
  • 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
  • 20. Cache
  • 21. Cache RailsCaching config/application.rb: module MyApp class Application < Rails::Application ... config.cache_store=:torque_box_store end end
  • 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%")
  • 29. Torquebox 2 http://torquebox.org/ TorqueBox – moc Javy, piękno Rubiego – Marek Goldmann Wideo: http://video-it.pl/2011/07/torquebox-moc-javy-piekno-rubiego-marek-goldmann/ Slajdy: http://www.slideshare.net/marekgoldmann/torquebox-moc-javy-pikno-rubiego Demo: https://github.com/goldmann/confitura-2011-torquebox-demo