TorqueBox - Ultrapassando a fronteira entre Java e Ruby

85
Creative Commons BY SA 3.0 Além da fronteira entre Java & Ruby Friday, November 4, 2011

Transcript of TorqueBox - Ultrapassando a fronteira entre Java e Ruby

Page 1: 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

Page 2: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

@abstractjJava há 12 anos, Ruby n00b

TorqueBox Contributor

DynJS Contributor

Caelum & ConcreteS

Friday, November 4, 2011

Page 3: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

DISCLAIMER

Friday, November 4, 2011

Page 4: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

nooooooooooooooo!

Java

927 JSRS!

Friday, November 4, 2011

Page 5: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

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

Page 6: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

ENTERPRISE

Friday, November 4, 2011

Page 7: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

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

Page 8: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

Friday, November 4, 2011

Page 9: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

Mas escala né?!

Friday, November 4, 2011

Page 10: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

JVM

Scala ClojureJython

DynJSRhino Groovy

Friday, November 4, 2011

Page 11: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

RubyMais expressiva que Java

class Beer attr_accessor :beer_id, :description, :created_at end

Friday, November 4, 2011

Page 12: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

DRY

Friday, November 4, 2011

Page 13: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

JRubyJava + Ruby

Friday, November 4, 2011

Page 14: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

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

Page 15: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

“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

Page 16: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

Server Side

Friday, November 4, 2011

Page 17: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

Ruby AppRails

Rack

Sinatra

Apache/Nginx

Passenger/Thin

Friday, November 4, 2011

Page 18: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

Rails

Rack

Sinatra

Apache/Nginx

Passenger/Thin

crond

Jobs

Ruby App

Friday, November 4, 2011

Page 19: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

Rails

Rack

Sinatra

Apache/Nginx

Passenger/Thin

crond

JobsResque/

DelayedJob

Tasks

Ruby App

Friday, November 4, 2011

Page 20: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

Rails

Rack

Sinatra

Apache/Nginx

Passenger/Thin

crond

JobsResque/

DelayedJob

Tasks

god/monit

Daemons

Ruby App

Friday, November 4, 2011

Page 21: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

JBossTomcat

Friday, November 4, 2011

Page 22: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

JBossHornetQ

Friday, November 4, 2011

Page 23: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

JBossQuartz

Friday, November 4, 2011

Page 24: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

JBossClustering

Friday, November 4, 2011

Page 25: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

TorqueBox“The power of JBoss with the

expressiveness of Ruby”Jim Crossley - MagicRuby Conference

Friday, November 4, 2011

Page 26: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

TorqueBox

Friday, November 4, 2011

Page 27: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

InstalaçãoTorqueBox do zero

Friday, November 4, 2011

Page 28: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

➜ jruby -S gem install torquebox torquebox-capistrano-support

Friday, November 4, 2011

Page 29: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

➜ 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

Page 30: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

Rails

rails new beer -m $TORQUEBOX_HOME/share/rails/template.rb

Friday, November 4, 2011

Page 31: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

EstruturaDiretórios do TorqueBox

Friday, November 4, 2011

Page 32: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

Rake tasksrake torquebox:deployrake torquebox:undeployrake torquebox:run

Friday, November 4, 2011

Page 33: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

DeploymentMake knobs, not WAR!

Friday, November 4, 2011

Page 34: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

beer-knob.yml

application: root: /Users/Bruno/rubyconfbr/beer environment: development

Friday, November 4, 2011

Page 35: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

Friday, November 4, 2011

Page 36: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

Aplicação

Friday, November 4, 2011

Page 37: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

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

Page 38: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

WebRack, Sinatra, Rails

Friday, November 4, 2011

Page 39: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

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

Page 40: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

Friday, November 4, 2011

Page 41: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

Clustering➜ torquebox run --clustered

Friday, November 4, 2011

Page 42: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

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

Page 43: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

Cache distribuído!

Friday, November 4, 2011

Page 44: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

mod_cluster

Friday, November 4, 2011

Page 45: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

InfinispanCaching

Friday, November 4, 2011

Page 46: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

Invalidation

CacheServer1

CacheServer2

Friday, November 4, 2011

Page 47: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

Invalidation

CacheServer1

CacheServer2

NEW

Notificação

CacheDesatualizado

Friday, November 4, 2011

Page 48: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

../config/application.rbmodule Beer class Application < Rails::Application config.cache_store = :torque_box_store end end

Friday, November 4, 2011

Page 49: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

Replicated

CacheServer1

CacheServer2

CacheServer2

CacheServer2

Sync

Sync

Friday, November 4, 2011

Page 50: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

../config/application.rbmodule Beer class Application < Rails::Application config.cache_store = :torque_box_store, {:mode => replicated, :sync =>false} end end

Friday, November 4, 2011

Page 51: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

SchedulingAgendamento de Jobs

Friday, November 4, 2011

Page 52: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

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

Page 53: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

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

Page 54: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

../app/jobsclass JobDemo def initialize #Codigo de inicializacao end def run # O que você quer executar end end

Friday, November 4, 2011

Page 55: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

../config/torquebox.ymljobs: sync_agenda: job: JobDemo cron: '0 0 12 * * ?'end

Friday, November 4, 2011

Page 56: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

MensageriaJava Messaging Service + HornetQ

Friday, November 4, 2011

Page 57: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

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

Page 58: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

RAILS APP

GreenfieldREST + NoSQL

SINATRA APP

Request/Responsext

pub/sub

NoSQL

Friday, November 4, 2011

Page 59: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

RAILS APP

Real WorldNobody Cares!

MAINFRAME

Request/Responsext

pub/sub

NoSQL

Friday, November 4, 2011

Page 60: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

../config/torquebox.yml/topics/beerTopic/queues/queueBeer:

Friday, November 4, 2011

Page 61: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

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

Page 62: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

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

Page 63: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

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

Page 64: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

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

Page 65: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

Future

Friday, November 4, 2011

Page 66: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

class EmailerTask def send_welcome(payload) to = "#{payload[:name]} <#{payload[:address]}>" # long running task end end

Future

Friday, November 4, 2011

Page 67: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

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

Page 68: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

future = @emailTask.send_welcome(:send_welcome)

future.started? future.complete? future.error?

future.resultfuture.result(10000)

Future

Friday, November 4, 2011

Page 69: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

Services

Friday, November 4, 2011

Page 70: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

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

Page 71: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

Singleton Services

Server1 Server2

Clustered

BeerService BeerService

Friday, November 4, 2011

Page 72: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

Singleton Services

Server1 Server2

Clustered

BeerService BeerService

Friday, November 4, 2011

Page 73: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

Services➜ torquebox run --clustered

../config/torquebox.ymlservices: BeerService: singleton: true end

Friday, November 4, 2011

Page 74: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

CDIInjeção de dependências

Friday, November 4, 2011

Page 75: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

Pra quê?

Friday, November 4, 2011

Page 76: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

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

Page 77: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

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

Page 78: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

JNDIclass MyService include TorqueBox::Injectors def initialize opts={} @factory = inject("java:comp/env/jdbc/myDB") end end

Friday, November 4, 2011

Page 79: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

Destinationsclass MyService include TorqueBox::Injectors def initialize opts={} @inbound = inject("/topic/beerpub") @outbound = inject("/queue/beer") end end

Friday, November 4, 2011

Page 80: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

Outras featuresAutenticação + Websockets + XA (2PC)

Friday, November 4, 2011

Page 81: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

BackStage

Friday, November 4, 2011

Page 82: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

Stomp BoxTorqueBox deployment support

Friday, November 4, 2011

Page 83: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

Friday, November 4, 2011

Page 84: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

Comunidade

irc.freenode.net #torquebox

http://torquebox.org

http://github.com/torquebox

twitter: @torquebox

Friday, November 4, 2011

Page 85: TorqueBox - Ultrapassando a fronteira entre Java e Ruby

Creative  Commons  BY-­SA  3.0

Obrigado!@abstractj

http://github.com/abstractj

Friday, November 4, 2011