TorqueBox - Ultrapassando a fronteira entre Java e Ruby
-
Upload
bruno-oliveira -
Category
Technology
-
view
2.172 -
download
0
Transcript of TorqueBox - Ultrapassando a fronteira entre Java e Ruby
Creative Commons BY-SA 3.0
Além da fronteira entre Java & Ruby
Friday, November 4, 2011
@abstractjJava há 12 anos, Ruby n00b
TorqueBox Contributor
DynJS Contributor
Caelum & ConcreteS
Friday, November 4, 2011
DISCLAIMER
Friday, November 4, 2011
nooooooooooooooo!
Java
927 JSRS!
Friday, November 4, 2011
Expressiva?
import java.util.Calendar; public class Beer { private Long beerId; private String description; private Calendar createdAt; public Long getBeerId() { return beerId; } public void setBeerId(Long beerId) { this.beerId = beerId; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public Calendar getCreatedAt() { return createdAt; } public void setCreatedAt(Calendar createdAt) { this.createdAt = createdAt; } } Friday, November 4, 2011
ENTERPRISE
Friday, November 4, 2011
ENTERPRISE
WAR
JAX-RPC
StrutsSpring
JAAS
EJB
JNI
EAR
SOA
JAX-WS
JSF
Java-FX
JNDIRMI
JMX
JAXP
JAXB JDOJAX-RS
JAXRJSTL StAX
JAF
JDOMAWTSwing
JEE
JSE
JCP
JVM JME
NIO JSP
JREPOJO
JavaBean
EJBQLJPQL
NPE
Friday, November 4, 2011
Friday, November 4, 2011
Mas escala né?!
Friday, November 4, 2011
JVM
Scala ClojureJython
DynJSRhino Groovy
Friday, November 4, 2011
RubyMais expressiva que Java
class Beer attr_accessor :beer_id, :description, :created_at end
Friday, November 4, 2011
DRY
Friday, November 4, 2011
JRubyJava + Ruby
Friday, November 4, 2011
require 'java' pdf = com.itextpdf.text.Document.new para = com.itextpdf.text.Paragraph.new 'Brought to you by JRuby' file = java.io.FileOutputStream.new 'pdf_demo.pdf' com.itextpdf.text.pdf.PdfWriter.get_instance pdf, file pdf.open pdf.add para pdf.close
JRuby
Friday, November 4, 2011
“You get true multithreading that can use all your computer’s cores from one process, plus a virtual machine that’s been tuned for a decade and a half.”
Using JRuby - Bringing Ruby to Java
Friday, November 4, 2011
Server Side
Friday, November 4, 2011
Ruby AppRails
Rack
Sinatra
Apache/Nginx
Passenger/Thin
Friday, November 4, 2011
Rails
Rack
Sinatra
Apache/Nginx
Passenger/Thin
crond
Jobs
Ruby App
Friday, November 4, 2011
Rails
Rack
Sinatra
Apache/Nginx
Passenger/Thin
crond
JobsResque/
DelayedJob
Tasks
Ruby App
Friday, November 4, 2011
Rails
Rack
Sinatra
Apache/Nginx
Passenger/Thin
crond
JobsResque/
DelayedJob
Tasks
god/monit
Daemons
Ruby App
Friday, November 4, 2011
JBossTomcat
Friday, November 4, 2011
JBossHornetQ
Friday, November 4, 2011
JBossQuartz
Friday, November 4, 2011
JBossClustering
Friday, November 4, 2011
TorqueBox“The power of JBoss with the
expressiveness of Ruby”Jim Crossley - MagicRuby Conference
Friday, November 4, 2011
TorqueBox
Friday, November 4, 2011
InstalaçãoTorqueBox do zero
Friday, November 4, 2011
➜ jruby -S gem install torquebox torquebox-capistrano-support
Friday, November 4, 2011
➜ wget http://torquebox.org/builds/LATEST/torquebox-dist-bin.zip➜ unzip torquebox-dist-bin.zip
➜ export TORQUEBOX_HOME=$PWD/torquebox-2.x➜ export JBOSS_HOME=$TORQUEBOX_HOME/jboss➜ export JRUBY_HOME=$TORQUEBOX_HOME/jruby
➜ export PATH=$JRUBY_HOME/bin:$PATH
Friday, November 4, 2011
Rails
rails new beer -m $TORQUEBOX_HOME/share/rails/template.rb
Friday, November 4, 2011
EstruturaDiretórios do TorqueBox
Friday, November 4, 2011
Rake tasksrake torquebox:deployrake torquebox:undeployrake torquebox:run
Friday, November 4, 2011
DeploymentMake knobs, not WAR!
Friday, November 4, 2011
beer-knob.yml
application: root: /Users/Bruno/rubyconfbr/beer environment: development
Friday, November 4, 2011
Friday, November 4, 2011
Aplicação
Friday, November 4, 2011
Gemfile
source "http://torquebox.org/2x/builds/584/gem-repo" source 'http://rubygems.org' gem 'rails', '3.1.1' gem 'activerecord-jdbcsqlite3-adapter' gem 'jruby-openssl' gem 'json' gem 'jquery-rails'
gem "torquebox-rake-support", "2.x.incremental.584" gem "torquebox", "2.x.incremental.584"
Friday, November 4, 2011
WebRack, Sinatra, Rails
Friday, November 4, 2011
Cachingclass BeersController < ApplicationController caches_action :most_popular, :expires_in => 30.seconds def most_popular @popular_beers = Beer.most_popular(:limit => 25) end end
Friday, November 4, 2011
Friday, November 4, 2011
Clustering➜ torquebox run --clustered
Friday, November 4, 2011
class TorqueBoxCommand < Thor TASK_ORDER = %w(deploy undeploy start cli env help) map "run" => "start" desc "run", "Run TorqueBox" method_option :clustered, :type => :boolean, :desc => "Run TorqueBox in clustered mode" def start setup_environment TorqueBox::DeployUtils.run_server(:clustered => options.clustered, :max_threads => options['max-threads'], :bind_address => options['bind-address']) endend
Internals
Friday, November 4, 2011
Cache distribuído!
Friday, November 4, 2011
mod_cluster
Friday, November 4, 2011
InfinispanCaching
Friday, November 4, 2011
Invalidation
CacheServer1
CacheServer2
Friday, November 4, 2011
Invalidation
CacheServer1
CacheServer2
NEW
Notificação
CacheDesatualizado
Friday, November 4, 2011
../config/application.rbmodule Beer class Application < Rails::Application config.cache_store = :torque_box_store end end
Friday, November 4, 2011
Replicated
CacheServer1
CacheServer2
CacheServer2
CacheServer2
Sync
Sync
Friday, November 4, 2011
../config/application.rbmodule Beer class Application < Rails::Application config.cache_store = :torque_box_store, {:mode => replicated, :sync =>false} end end
Friday, November 4, 2011
SchedulingAgendamento de Jobs
Friday, November 4, 2011
Internalspublic class RubyJobProxy implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { Ruby ruby = null; try { ruby = this.runtimePool.borrowRuntime( resolver.getComponentName() ); JobComponent job = (JobComponent)resolver.resolve( ruby ); watchDog(context); job.run(); } catch (Exception e) { throw new JobExecutionException( e ); } finally { if (ruby != null) { this.runtimePool.returnRuntime( ruby ); } } }
Friday, November 4, 2011
Internalspublic class RubyJobProxy implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { Ruby ruby = null; try { ruby = this.runtimePool.borrowRuntime( resolver.getComponentName() ); JobComponent job = (JobComponent)resolver.resolve( ruby ); watchDog(context); job.run(); } catch (Exception e) { throw new JobExecutionException( e ); } finally { if (ruby != null) { this.runtimePool.returnRuntime( ruby ); } } }
Friday, November 4, 2011
../app/jobsclass JobDemo def initialize #Codigo de inicializacao end def run # O que você quer executar end end
Friday, November 4, 2011
../config/torquebox.ymljobs: sync_agenda: job: JobDemo cron: '0 0 12 * * ?'end
Friday, November 4, 2011
MensageriaJava Messaging Service + HornetQ
Friday, November 4, 2011
O Ministério da Saúde adverte:
NOSQL COMO MENSAGERIA PODE
TRAZER DANOS A SUA SAÚDE E A DE SEUS FAMILIARES
Friday, November 4, 2011
RAILS APP
GreenfieldREST + NoSQL
SINATRA APP
Request/Responsext
pub/sub
NoSQL
Friday, November 4, 2011
RAILS APP
Real WorldNobody Cares!
MAINFRAME
Request/Responsext
pub/sub
NoSQL
Friday, November 4, 2011
../config/torquebox.yml/topics/beerTopic/queues/queueBeer:
Friday, November 4, 2011
Tasksclass EmailerTask < TorqueBox::Messaging::Task def send_welcome(payload) to = "#{payload[:name]} <#{payload[:address]}>" # send welcome email to the user end end
Friday, November 4, 2011
Tasksclass UserController < ApplicationController def register user = User.new(params[:user]) EmailerTask.async(:send_welcome, :address => user.email, :name => user.name) end end
Friday, November 4, 2011
Processorsinclude TorqueBox::Messaging class PrintHandler < MessageProcessor def on_message(body) puts "Processing #{body} of #{message}" end def configure(opts) @color = opts['color'] end end
Friday, November 4, 2011
Queuesinclude TorqueBox req = Messaging::Queue.new '/queues/questions' res = Messaging::Queue.new '/queues/answers' Thread.new do req.publish "What time is it?" puts res.receive( :timeout => 1000 ) end
Friday, November 4, 2011
Future
Friday, November 4, 2011
class EmailerTask def send_welcome(payload) to = "#{payload[:name]} <#{payload[:address]}>" # long running task end end
Future
Friday, November 4, 2011
class EmailerTask
include TorqueBox::Messaging::Backgroundable always_background :send_welcome
def send_welcome(payload) to = "#{payload[:name]} <#{payload[:address]}>" # long running task end end
Future
Friday, November 4, 2011
future = @emailTask.send_welcome(:send_welcome)
future.started? future.complete? future.error?
future.resultfuture.result(10000)
Future
Friday, November 4, 2011
Services
Friday, November 4, 2011
class BeerService def initialize @queue = Messaging::Queue.new(“beer”) end def start @queue.publish “Testing” end def stop # O que fazer quando o serviço receber um stop end end
Services
Friday, November 4, 2011
Singleton Services
Server1 Server2
Clustered
BeerService BeerService
Friday, November 4, 2011
Singleton Services
Server1 Server2
Clustered
BeerService BeerService
Friday, November 4, 2011
Services➜ torquebox run --clustered
../config/torquebox.ymlservices: BeerService: singleton: true end
Friday, November 4, 2011
CDIInjeção de dependências
Friday, November 4, 2011
Pra quê?
Friday, November 4, 2011
Javapackage br.com.rubyconf;
public class Beer { //gets e sets public void say(String message) { // Execução do método }}
Deploy do jar na aplicaçãoapp/models/views/controllers/lib/beer.jar
Friday, November 4, 2011
Rubyclass BeerController < ApplicationController
include TorqueBox::Injectors
def create beer = inject(br.com.rubyconf.Beer ) beer.say “Ruby is for Java” end
end
Friday, November 4, 2011
JNDIclass MyService include TorqueBox::Injectors def initialize opts={} @factory = inject("java:comp/env/jdbc/myDB") end end
Friday, November 4, 2011
Destinationsclass MyService include TorqueBox::Injectors def initialize opts={} @inbound = inject("/topic/beerpub") @outbound = inject("/queue/beer") end end
Friday, November 4, 2011
Outras featuresAutenticação + Websockets + XA (2PC)
Friday, November 4, 2011
BackStage
Friday, November 4, 2011
Stomp BoxTorqueBox deployment support
Friday, November 4, 2011
Friday, November 4, 2011
Comunidade
irc.freenode.net #torquebox
http://torquebox.org
http://github.com/torquebox
twitter: @torquebox
Friday, November 4, 2011
Creative Commons BY-SA 3.0
Obrigado!@abstractj
http://github.com/abstractj
Friday, November 4, 2011