TorqueBox - When Java meets Ruby

92
Creative Commons BY-SA 3.0 When Java meets Ruby Thursday, December 8, 11

Transcript of TorqueBox - When Java meets Ruby

Page 1: TorqueBox - When Java meets Ruby

Creative Commons BY-SA 3.0

When Java meets Ruby

Thursday, December 8, 11

Page 2: TorqueBox - When Java meets Ruby

@abstractjJava há 12 anos, Ruby n00bTorqueBox ContributorDynJS ContributorCaelum & ConcreteS

Thursday, December 8, 11

Page 3: TorqueBox - When Java meets Ruby

DISCLAIMER

Thursday, December 8, 11

Page 4: TorqueBox - When Java meets Ruby

nooooooooooooooo!

Java

927 JSRS!

Thursday, December 8, 11

Page 5: TorqueBox - When Java meets 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; } } Thursday, December 8, 11

Page 6: TorqueBox - When Java meets Ruby

ENTERPRISE

Thursday, December 8, 11

Page 7: TorqueBox - When Java meets Ruby

ENTERPRISEWAR

JAX-RPC

StrutsSpring

JAAS

EJB

JNI

EAR

SOA

JAX-WS

JSF

Java-FX

JNDIRMI

JMX

JAXP

JAXB JDOJAX-RS

JAXR JSTL StAX

JAF

JDOMAWTSwing

JEE

JSE

JCP

JVM JME

NIO JSP

JREPOJO

JavaBean

EJBQLJPQL

NPE

Thursday, December 8, 11

Page 8: TorqueBox - When Java meets Ruby

Thursday, December 8, 11

Page 9: TorqueBox - When Java meets Ruby

Mas escala né?!

Thursday, December 8, 11

Page 10: TorqueBox - When Java meets Ruby

JVM

Scala ClojureJython

DynJSRhino Groovy

Thursday, December 8, 11

Page 11: TorqueBox - When Java meets Ruby

RubyMais expressiva que Java

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

Thursday, December 8, 11

Page 12: TorqueBox - When Java meets Ruby

DRY

“It is tempting, if the only tool you have is a hammer, to treat everything as if it were a nail.” - Abraham Maslow

Thursday, December 8, 11

Page 13: TorqueBox - When Java meets Ruby

JRubyJava + Ruby

Thursday, December 8, 11

Page 14: TorqueBox - When Java meets 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

Thursday, December 8, 11

Page 15: TorqueBox - When Java meets 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

Thursday, December 8, 11

Page 16: TorqueBox - When Java meets Ruby

Server Side

Thursday, December 8, 11

Page 17: TorqueBox - When Java meets Ruby

Ruby AppRails

Rack

Sinatra

Apache/Nginx

Passenger/Thin

Thursday, December 8, 11

Page 18: TorqueBox - When Java meets Ruby

Rails

Rack

Sinatra

Apache/Nginx

Passenger/Thin

crond

Jobs

Ruby App

Thursday, December 8, 11

Page 19: TorqueBox - When Java meets Ruby

Rails

Rack

Sinatra

Apache/Nginx

Passenger/Thin

crond

JobsResque/

DelayedJob

Tasks

Ruby App

Thursday, December 8, 11

Page 20: TorqueBox - When Java meets Ruby

Rails

Rack

Sinatra

Apache/Nginx

Passenger/Thin

crond

JobsResque/

DelayedJob

Tasks

god/monit

Daemons

Ruby App

Thursday, December 8, 11

Page 21: TorqueBox - When Java meets Ruby

JBossTomcat

Thursday, December 8, 11

Page 22: TorqueBox - When Java meets Ruby

JBossHornetQ

Thursday, December 8, 11

Page 23: TorqueBox - When Java meets Ruby

JBossQuartz

Thursday, December 8, 11

Page 24: TorqueBox - When Java meets Ruby

JBossClustering

Thursday, December 8, 11

Page 25: TorqueBox - When Java meets Ruby

AS 7Redução do footprint de memória

Class loader modularQueda no tempo de startup

EE6 compliant

Thursday, December 8, 11

Page 26: TorqueBox - When Java meets Ruby

TorqueBox“The power of JBoss with the

expressiveness of Ruby”Jim Crossley - MagicRuby Conference

Thursday, December 8, 11

Page 27: TorqueBox - When Java meets Ruby

TorqueBox

Thursday, December 8, 11

Page 28: TorqueBox - When Java meets Ruby

InstalaçãoTorqueBox do zero

Thursday, December 8, 11

Page 29: TorqueBox - When Java meets Ruby

Pré-requisitos➜ java -versionjava version "1.6.0_07"Java(TM) SE Runtime Environment (build 1.6.0_07-b06-153)Java HotSpot(TM) 64-Bit Server VM (build 1.6.0_07-b06-57, mixed mode)

Thursday, December 8, 11

Page 30: TorqueBox - When Java meets Ruby

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

Thursday, December 8, 11

Page 31: TorqueBox - When Java meets Ruby

➜ wget http://repository-torquebox.forge.cloudbees.com/release/org/torquebox/torquebox-dist/2.0.0.beta1/torquebox-dist-2.0.0.beta1-bin.zip➜ unzip torquebox-dist-2.0.0.beta1-bin.zip

➜ export TORQUEBOX_HOME=$PWD/torquebox-dist-2.0.0.beta1➜ export JBOSS_HOME=$TORQUEBOX_HOME/jboss➜ export JRUBY_HOME=$TORQUEBOX_HOME/jruby

➜ export PATH=$JRUBY_HOME/bin:$PATH

Thursday, December 8, 11

Page 32: TorqueBox - When Java meets Ruby

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

Thursday, December 8, 11

Page 33: TorqueBox - When Java meets Ruby

EstruturaDiretórios do TorqueBox

Thursday, December 8, 11

Page 34: TorqueBox - When Java meets Ruby

Rake tasksrake torquebox:deployrake torquebox:undeployrake torquebox:run

Thursday, December 8, 11

Page 35: TorqueBox - When Java meets Ruby

DeploymentMake knobs, not WAR!

Thursday, December 8, 11

Page 36: TorqueBox - When Java meets Ruby

beer-knob.yml application: root: /Users/Bruno/javaonebrasil/beer environment: development

Thursday, December 8, 11

Page 37: TorqueBox - When Java meets Ruby

Thursday, December 8, 11

Page 38: TorqueBox - When Java meets Ruby

Aplicação

Thursday, December 8, 11

Page 39: TorqueBox - When Java meets 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"

Thursday, December 8, 11

Page 40: TorqueBox - When Java meets Ruby

WebRack, Sinatra, Rails

Thursday, December 8, 11

Page 41: TorqueBox - When Java meets Ruby

Cachingclass BeersController < ApplicationController caches_action :most_popular, :expires_in => 30.seconds def most_popular @popular_beers = Beer.most_popular(:limit => 25) end end

Thursday, December 8, 11

Page 42: TorqueBox - When Java meets Ruby

Thursday, December 8, 11

Page 43: TorqueBox - When Java meets Ruby

Clustering➜ torquebox run --clustered

Thursday, December 8, 11

Page 44: TorqueBox - When Java meets 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

Thursday, December 8, 11

Page 45: TorqueBox - When Java meets Ruby

Cache distribuído!

Thursday, December 8, 11

Page 46: TorqueBox - When Java meets Ruby

mod_clusterhttpd-based load balancer

Thursday, December 8, 11

Page 47: TorqueBox - When Java meets Ruby

InfinispanCaching

Thursday, December 8, 11

Page 48: TorqueBox - When Java meets Ruby

InvalidationCache

Server1Cache

Server2

Thursday, December 8, 11

Page 49: TorqueBox - When Java meets Ruby

InvalidationCache

Server1Cache

Server2

NEW

Notificação

CacheDesatualizado

Thursday, December 8, 11

Page 50: TorqueBox - When Java meets Ruby

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

Thursday, December 8, 11

Page 51: TorqueBox - When Java meets Ruby

ReplicatedCache

Server1

CacheServer2

CacheServer2

CacheServer2

Sync

Sync

Thursday, December 8, 11

Page 52: TorqueBox - When Java meets Ruby

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

Thursday, December 8, 11

Page 53: TorqueBox - When Java meets Ruby

SchedulingAgendamento de Jobs

Thursday, December 8, 11

Page 54: TorqueBox - When Java meets 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 ); job.run(); } catch (Exception e) { throw new JobExecutionException( e ); } finally { if (ruby != null) { this.runtimePool.returnRuntime( ruby ); } } }

Thursday, December 8, 11

Page 55: TorqueBox - When Java meets 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 ); job.run(); } catch (Exception e) { throw new JobExecutionException( e ); } finally { if (ruby != null) { this.runtimePool.returnRuntime( ruby ); } } }

Thursday, December 8, 11

Page 56: TorqueBox - When Java meets Ruby

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

Thursday, December 8, 11

Page 57: TorqueBox - When Java meets Ruby

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

Thursday, December 8, 11

Page 58: TorqueBox - When Java meets Ruby

MensageriaJava Messaging Service + HornetQ

Thursday, December 8, 11

Page 59: TorqueBox - When Java meets Ruby

O Ministério da Saúde adverte:

NOSQL COMO MENSAGERIA PODE

TRAZER DANOS A SUA SAÚDE E A DE SEUS FAMILIARES

Thursday, December 8, 11

Page 60: TorqueBox - When Java meets Ruby

RAILS APP

GreenfieldREST + NoSQL

SINATRA APP

Request/Responsext

pub/sub

NoSQL

Thursday, December 8, 11

Page 61: TorqueBox - When Java meets Ruby

RAILS APP

Real WorldNobody Cares!

MAINFRAME

Request/Responsext

pub/sub

NoSQL

Thursday, December 8, 11

Page 62: TorqueBox - When Java meets Ruby

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

Thursday, December 8, 11

Page 63: TorqueBox - When Java meets Ruby

Tasksclass EmailerTask < TorqueBox::Messaging::Task def send_welcome(payload) to = "#{payload[:name]} <#{payload[:address]}>" # send welcome email to the user end end

Thursday, December 8, 11

Page 64: TorqueBox - When Java meets Ruby

Tasksclass UserController < ApplicationController def register user = User.new(params[:user]) EmailerTask.async(:send_welcome, :address => user.email, :name => user.name) end end

Thursday, December 8, 11

Page 65: TorqueBox - When Java meets 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

Thursday, December 8, 11

Page 66: TorqueBox - When Java meets 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

Thursday, December 8, 11

Page 67: TorqueBox - When Java meets Ruby

Future

Thursday, December 8, 11

Page 68: TorqueBox - When Java meets Ruby

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

Future

Thursday, December 8, 11

Page 69: TorqueBox - When Java meets 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

Thursday, December 8, 11

Page 70: TorqueBox - When Java meets Ruby

future = @emailTask.send_welcome(:send_welcome)

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

future.resultfuture.result(10000)

Future

Thursday, December 8, 11

Page 71: TorqueBox - When Java meets Ruby

Services

Thursday, December 8, 11

Page 72: TorqueBox - When Java meets 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

Thursday, December 8, 11

Page 73: TorqueBox - When Java meets Ruby

Singleton Services

Server1 Server2

Clustered

BeerService BeerService

Thursday, December 8, 11

Page 74: TorqueBox - When Java meets Ruby

Singleton Services

Server1 Server2

Clustered

BeerService BeerService

Thursday, December 8, 11

Page 75: TorqueBox - When Java meets Ruby

Services➜ torquebox run --clustered

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

Thursday, December 8, 11

Page 76: TorqueBox - When Java meets Ruby

CDIInjeção de dependências

Thursday, December 8, 11

Page 77: TorqueBox - When Java meets Ruby

Pra quê?

Thursday, December 8, 11

Page 78: TorqueBox - When Java meets Ruby

Javapackage br.com.javaonebrasil;

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

Thursday, December 8, 11

Page 79: TorqueBox - When Java meets Ruby

Rubyclass BeerController < ApplicationController

include TorqueBox::Injectors

def create beer = inject(br.com.javaonebrasil.Beer ) beer.say “Ruby is for Java” end

end

Thursday, December 8, 11

Page 80: TorqueBox - When Java meets Ruby

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

Thursday, December 8, 11

Page 81: TorqueBox - When Java meets Ruby

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

Thursday, December 8, 11

Page 82: TorqueBox - When Java meets Ruby

Transactions

Rails Application

Queue Database Infinispan

Topic

XA Distributed, multi resource transaction

Thursday, December 8, 11

Page 83: TorqueBox - When Java meets Ruby

XA (2PC)HornetQ ✔

TorqueBox + ActiveRecord ✔Infinispan ✔

Thursday, December 8, 11

Page 84: TorqueBox - When Java meets Ruby

Outras featuresAutenticação + Websockets

Thursday, December 8, 11

Page 85: TorqueBox - When Java meets Ruby

BackStage

Thursday, December 8, 11

Page 86: TorqueBox - When Java meets Ruby

Stomp BoxTorqueBox deployment support

Thursday, December 8, 11

Page 87: TorqueBox - When Java meets Ruby

Thursday, December 8, 11

Page 88: TorqueBox - When Java meets Ruby

What’s next?

Thursday, December 8, 11

Page 89: TorqueBox - When Java meets Ruby

Polyglot

QueueQueue

Immutant

TorqueBox

Thursday, December 8, 11

Page 90: TorqueBox - When Java meets Ruby

Getting started

Installing TorqueBox 2.0 http://vimeo.com/33299335

Thursday, December 8, 11

Page 91: TorqueBox - When Java meets Ruby

Comunidade

irc.freenode.net #torquebox http://torquebox.orghttp://github.com/torqueboxtwitter: @torquebox

Thursday, December 8, 11

Page 92: TorqueBox - When Java meets Ruby

Creative Commons BY-SA 3.0

Obrigado!@abstractj

http://github.com/abstractj

Thursday, December 8, 11