Além da fronteira entre Java & Ruby

        Creative  Commons  BY-­SA  3.0




Friday, November 4, 2011
@abstractj
          Java há 12 anos, Ruby n00b
          TorqueBox Contributor
          DynJS Contributor
          Caelum & ConcreteS


Friday, November 4, 2011
DISCLAIMER



Friday, November 4, 2011
Java

                   927 JSRS!
               nooooooooooooooo!

Friday, November 4, 2011
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) {

Expressiva?                  }
                                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
JAXR                         Java-FX     JAXP
                           JSTL                         StAX JME
                                  JDOM       JVM
          JAX-RPC                                     EJB
                                              AWT           JMX
                  Swing
      EAR Struts          JAAS                        JCP
                 JavaBean
         NPE                                                Spring
     JAX-WS                  ENTERPRISE                        RMI
           JSE               JNI      JNDI               NIO
                                                   SOA          JSP
       JSF JAXB                         WAR             JDO
   JAX-RS JPQL                                 JAF         POJO
                EJBQL                                 JRE
     JEE

Friday, November 4, 2011
Friday, November 4, 2011
Mas escala né?!



Friday, November 4, 2011
Scala            Clojure
                                   Jython


                                    JVM
                                    DynJS
                   Rhino                    Groovy




Friday, November 4, 2011
Ruby
     Mais expressiva que Java

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




Friday, November 4, 2011
DRY


Friday, November 4, 2011
JRuby
                           Java + Ruby




Friday, November 4, 2011
JRuby
    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




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 App
                             Sinatra      Rails
                                   Rack
                             Passenger/Thin


                             Apache/Nginx




Friday, November 4, 2011
Ruby App
                             Sinatra      Rails
                                   Rack
                             Passenger/Thin       Jobs


                             Apache/Nginx         crond




Friday, November 4, 2011
Ruby App
                                      Sinatra      Rails
                                            Rack
                           Tasks      Passenger/Thin       Jobs
                        Resque/
                       DelayedJob     Apache/Nginx         crond




Friday, November 4, 2011
Ruby App
                                      Sinatra      Rails
                                            Rack
                           Tasks      Passenger/Thin       Jobs
                        Resque/
                       DelayedJob     Apache/Nginx         crond


                                         Daemons


                                       god/monit



Friday, November 4, 2011
JBoss
     Tomcat




Friday, November 4, 2011
JBoss
     HornetQ




Friday, November 4, 2011
JBoss
     Quartz




Friday, November 4, 2011
JBoss
     Clustering




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ção
                            TorqueBox 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
Estrutura
     Diretórios do TorqueBox




Friday, November 4, 2011
Rake tasks
      rake torquebox:deploy
      rake torquebox:undeploy
      rake torquebox:run




Friday, November 4, 2011
Deployment
                           Make 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
source "http://torquebox.org/2x/builds/584/gem-
                           repo"
                           source 'http://rubygems.org'

                           gem 'rails', '3.1.1'



     Gemfile
                           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
Web
                           Rack, Sinatra, Rails




Friday, November 4, 2011
Caching
     class 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
Internals
     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'])
      end
     end




Friday, November 4, 2011
Cache distribuído!



Friday, November 4, 2011
mod_cluster



Friday, November 4, 2011
Infinispan
                             Caching




Friday, November 4, 2011
Invalidation
                            Cache     Cache
                           Server1   Server2




Friday, November 4, 2011
Invalidation
                                     Notificação
                            Cache                  Cache
                           Server1                Server2


                           NEW                   Cache
                                              Desatualizado




Friday, November 4, 2011
../config/application.rb
     module Beer

      class Application < Rails::Application
       config.cache_store = :torque_box_store
      end
     end




Friday, November 4, 2011
Replicated
                                             Cache
                                            Server2
                            Cache
                           Server1   Sync
                                             Cache
                                     Sync   Server2



                                             Cache
                                            Server2




Friday, November 4, 2011
../config/application.rb
     module Beer

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




Friday, November 4, 2011
Scheduling
                           Agendamento de Jobs




Friday, November 4, 2011
Internals
      public 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
Internals
      public 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/jobs
     class JobDemo

         def initialize
          #Codigo de inicializacao
         end

      def run
       # O que você quer executar
      end
     end


Friday, November 4, 2011
../config/torquebox.yml
     jobs:
      sync_agenda:
       job: JobDemo
       cron: '0 0 12 * * ?'
     end




Friday, November 4, 2011
Mensageria
     Java 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
Greenfield
                                  REST + NoSQL

                                  Request/Responsext


                                      NoSQL

                     RAILS APP        pub/sub          SINATRA APP




Friday, November 4, 2011
Real World
                                   Nobody Cares!
                                    Request/Responsext


                                        NoSQL

                       RAILS APP        pub/sub          MAINFRAME




Friday, November 4, 2011
../config/torquebox.yml
     /topics/beerTopic
     /queues/queueBeer:




Friday, November 4, 2011
Tasks
     class 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
Tasks
     class 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
Processors
     include 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
Queues
     include 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
Future
     class EmailerTask

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




Friday, November 4, 2011
Future
     class EmailerTask

         include TorqueBox::Messaging::Backgroundable
         always_background :send_welcome

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




Friday, November 4, 2011
Future
       future = @emailTask.send_welcome(:send_welcome)

       future.started?

       future.complete?

       future.error?

       future.result
       future.result(10000)




Friday, November 4, 2011
Services



Friday, November 4, 2011
Services
     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




Friday, November 4, 2011
Singleton Services
                                     Clustered
                           Server1                  Server2




            BeerService                          BeerService




Friday, November 4, 2011
Singleton Services
                                     Clustered
                           Server1                  Server2




            BeerService                          BeerService




Friday, November 4, 2011
Services
     ➜ torquebox run --clustered



     ../config/torquebox.yml
     services:
      BeerService:
       singleton: true
     end




Friday, November 4, 2011
CDI
                           Injeção de dependências




Friday, November 4, 2011
Pra quê?



Friday, November 4, 2011
Java
     package br.com.rubyconf;

     public class Beer {
       //gets e sets
       public void say(String message) { // Execução do método }
     }

     Deploy do jar na aplicação
     app/
     models/
     views/
     controllers/
     lib/beer.jar




Friday, November 4, 2011
Ruby
     class 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
JNDI
    class MyService
     include TorqueBox::Injectors

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




Friday, November 4, 2011
Destinations
      class MyService
       include TorqueBox::Injectors

       def initialize opts={}
        @inbound = inject("/topic/beerpub")
        @outbound = inject("/queue/beer")
       end
      end




Friday, November 4, 2011
Outras features
     Autenticação + Websockets + XA (2PC)




Friday, November 4, 2011
BackStage




Friday, November 4, 2011
Stomp Box
                           TorqueBox 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
Obrigado!
                                                  @abstractj
                                         http://github.com/abstractj



        Creative  Commons  BY-­SA  3.0




Friday, November 4, 2011

TorqueBox - Ultrapassando a fronteira entre Java e Ruby

  • 1.
    Além da fronteiraentre Java & Ruby Creative  Commons  BY-­SA  3.0 Friday, November 4, 2011
  • 2.
    @abstractj Java há 12 anos, Ruby n00b TorqueBox Contributor DynJS Contributor Caelum & ConcreteS Friday, November 4, 2011
  • 3.
  • 4.
    Java 927 JSRS! nooooooooooooooo! Friday, November 4, 2011
  • 5.
    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) { Expressiva? } 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 }
  • 6.
  • 7.
    JAXR Java-FX JAXP JSTL StAX JME JDOM JVM JAX-RPC EJB AWT JMX Swing EAR Struts JAAS JCP JavaBean NPE Spring JAX-WS ENTERPRISE RMI JSE JNI JNDI NIO SOA JSP JSF JAXB WAR JDO JAX-RS JPQL JAF POJO EJBQL JRE JEE Friday, November 4, 2011
  • 8.
  • 9.
    Mas escala né?! Friday,November 4, 2011
  • 10.
    Scala Clojure Jython JVM DynJS Rhino Groovy Friday, November 4, 2011
  • 11.
    Ruby Mais expressiva que Java class Beer attr_accessor :beer_id, :description, :created_at end Friday, November 4, 2011
  • 12.
  • 13.
    JRuby Java + Ruby Friday, November 4, 2011
  • 14.
    JRuby 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 Friday, November 4, 2011
  • 15.
    “You get truemultithreading 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
  • 16.
  • 17.
    Ruby App Sinatra Rails Rack Passenger/Thin Apache/Nginx Friday, November 4, 2011
  • 18.
    Ruby App Sinatra Rails Rack Passenger/Thin Jobs Apache/Nginx crond Friday, November 4, 2011
  • 19.
    Ruby App Sinatra Rails Rack Tasks Passenger/Thin Jobs Resque/ DelayedJob Apache/Nginx crond Friday, November 4, 2011
  • 20.
    Ruby App Sinatra Rails Rack Tasks Passenger/Thin Jobs Resque/ DelayedJob Apache/Nginx crond Daemons god/monit Friday, November 4, 2011
  • 21.
    JBoss Tomcat Friday, November 4, 2011
  • 22.
    JBoss HornetQ Friday, November 4, 2011
  • 23.
    JBoss Quartz Friday, November 4, 2011
  • 24.
    JBoss Clustering Friday, November 4, 2011
  • 25.
    TorqueBox “The power of JBoss with the expressiveness of Ruby” Jim Crossley - MagicRuby Conference Friday, November 4, 2011
  • 26.
  • 27.
    Instalação TorqueBox do zero Friday, November 4, 2011
  • 28.
    ➜ jruby -Sgem install torquebox torquebox-capistrano-support Friday, November 4, 2011
  • 29.
    ➜ 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
  • 30.
    Rails rails new beer -m $TORQUEBOX_HOME/share/rails/template.rb Friday, November 4, 2011
  • 31.
    Estrutura Diretórios do TorqueBox Friday, November 4, 2011
  • 32.
    Rake tasks rake torquebox:deploy rake torquebox:undeploy rake torquebox:run Friday, November 4, 2011
  • 33.
    Deployment Make knobs, not WAR! Friday, November 4, 2011
  • 34.
    beer-knob.yml application: root: /Users/Bruno/rubyconfbr/beer environment: development Friday, November 4, 2011
  • 35.
  • 36.
  • 37.
    source "http://torquebox.org/2x/builds/584/gem- repo" source 'http://rubygems.org' gem 'rails', '3.1.1' Gemfile 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
  • 38.
    Web Rack, Sinatra, Rails Friday, November 4, 2011
  • 39.
    Caching class 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
  • 40.
  • 41.
    Clustering ➜ torquebox run --clustered Friday, November 4, 2011
  • 42.
    Internals 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']) end end Friday, November 4, 2011
  • 43.
  • 44.
  • 45.
    Infinispan Caching Friday, November 4, 2011
  • 46.
    Invalidation Cache Cache Server1 Server2 Friday, November 4, 2011
  • 47.
    Invalidation Notificação Cache Cache Server1 Server2 NEW Cache Desatualizado Friday, November 4, 2011
  • 48.
    ../config/application.rb module Beer class Application < Rails::Application config.cache_store = :torque_box_store end end Friday, November 4, 2011
  • 49.
    Replicated Cache Server2 Cache Server1 Sync Cache Sync Server2 Cache Server2 Friday, November 4, 2011
  • 50.
    ../config/application.rb module Beer class Application < Rails::Application config.cache_store = :torque_box_store, {:mode => replicated, :sync =>false} end end Friday, November 4, 2011
  • 51.
    Scheduling Agendamento de Jobs Friday, November 4, 2011
  • 52.
    Internals public 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
  • 53.
    Internals public 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
  • 54.
    ../app/jobs class JobDemo def initialize #Codigo de inicializacao end def run # O que você quer executar end end Friday, November 4, 2011
  • 55.
    ../config/torquebox.yml jobs: sync_agenda: job: JobDemo cron: '0 0 12 * * ?' end Friday, November 4, 2011
  • 56.
    Mensageria Java Messaging Service + HornetQ Friday, November 4, 2011
  • 57.
    O Ministério daSaúde adverte: NOSQL COMO MENSAGERIA PODE TRAZER DANOS A SUA SAÚDE E A DE SEUS FAMILIARES Friday, November 4, 2011
  • 58.
    Greenfield REST + NoSQL Request/Responsext NoSQL RAILS APP pub/sub SINATRA APP Friday, November 4, 2011
  • 59.
    Real World Nobody Cares! Request/Responsext NoSQL RAILS APP pub/sub MAINFRAME Friday, November 4, 2011
  • 60.
    ../config/torquebox.yml /topics/beerTopic /queues/queueBeer: Friday, November 4, 2011
  • 61.
    Tasks class 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
  • 62.
    Tasks class 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
  • 63.
    Processors include 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
  • 64.
    Queues include 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
  • 65.
  • 66.
    Future class EmailerTask def send_welcome(payload) to = "#{payload[:name]} <#{payload[:address]}>" # long running task end end Friday, November 4, 2011
  • 67.
    Future class EmailerTask include TorqueBox::Messaging::Backgroundable always_background :send_welcome def send_welcome(payload) to = "#{payload[:name]} <#{payload[:address]}>" # long running task end end Friday, November 4, 2011
  • 68.
    Future future = @emailTask.send_welcome(:send_welcome) future.started? future.complete? future.error? future.result future.result(10000) Friday, November 4, 2011
  • 69.
  • 70.
    Services 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 Friday, November 4, 2011
  • 71.
    Singleton Services Clustered Server1 Server2 BeerService BeerService Friday, November 4, 2011
  • 72.
    Singleton Services Clustered Server1 Server2 BeerService BeerService Friday, November 4, 2011
  • 73.
    Services ➜ torquebox run --clustered ../config/torquebox.yml services: BeerService: singleton: true end Friday, November 4, 2011
  • 74.
    CDI Injeção de dependências Friday, November 4, 2011
  • 75.
  • 76.
    Java package br.com.rubyconf; public class Beer { //gets e sets public void say(String message) { // Execução do método } } Deploy do jar na aplicação app/ models/ views/ controllers/ lib/beer.jar Friday, November 4, 2011
  • 77.
    Ruby class 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
  • 78.
    JNDI class MyService include TorqueBox::Injectors def initialize opts={} @factory = inject("java:comp/env/jdbc/myDB") end end Friday, November 4, 2011
  • 79.
    Destinations class MyService include TorqueBox::Injectors def initialize opts={} @inbound = inject("/topic/beerpub") @outbound = inject("/queue/beer") end end Friday, November 4, 2011
  • 80.
    Outras features Autenticação + Websockets + XA (2PC) Friday, November 4, 2011
  • 81.
  • 82.
    Stomp Box TorqueBox deployment support Friday, November 4, 2011
  • 83.
  • 84.
    Comunidade irc.freenode.net #torquebox http://torquebox.org http://github.com/torquebox twitter: @torquebox Friday, November 4, 2011
  • 85.
    Obrigado! @abstractj http://github.com/abstractj Creative  Commons  BY-­SA  3.0 Friday, November 4, 2011