SlideShare a Scribd company logo
Bob McWhirter
                                 Presented at DevNexus
                                             22 March 2011
Creative  Commons  BY-­SA  3.0
Bob McWhirter

• Project  lead  of  TorqueBox
• JBoss  Fellow
• Founder  of  The  Codehaus
• Founder  of  Drools
• Been  with  Red  Hat  ~4  years
but it's a team.
What is TorqueBox?

The  mating  of  JRuby  to  
JBoss AS.
TorqueBox: The beauty of Ruby with the power of JBoss.  Presented at Devnexus 2011.
Goals
• Support  Ruby  web  frameworks
 • Rails
 • Sinatra
 • Rack
• Go  beyond  the  web
 • Messaging
 • Jobs
 • Services
But...

...Java  already  supports  
messaging,  jobs  and  
services.
That's right.
Why Ruby?

• No  compilation
• Low  ceremony
• Highly  expressive
• Lots  of  shiny  frameworks
• Few  specifications  (more  fun!)
• Meta
Expressive
                        anything.rb




teams.
    collect(&:members).
    flatten.uniq.each  &:promote!
Uhh...
                         com/foo/Anything.java

Set<Person>  people  =  new  HashSet<Person>();;

for  (  Team  each  :  teams  )  {
    people.addAll(  each.getMembers()  );;
}

for  (  Person  each  :  people  )  {
    each.promote();;
}
Why JRuby

• Very  fast  runtime
• Real  threads
• Java  libraries
• Java  tools
• Healthy  community
Easy Install. Even on Windows


$  wget  http://torquebox.org/torquebox-­dev.zip
$  unzip  torquebox-­dev.zip

$  export  TORQUEBOX_HOME=$PWD/torquebox-­1*
$  export  JBOSS_HOME=$TORQUEBOX_HOME/jboss
$  export  JRUBY_HOME=$TORQUEBOX_HOME/jruby

$  export  PATH=$JRUBY_HOME/bin:$PATH
Easy Install. Even on Windows


$ wget http://torquebox.org/torquebox-dev.zip
$ unzip torquebox-dev.zip

$  export  TORQUEBOX_HOME=$PWD/torquebox-­1*
$  export  JBOSS_HOME=$TORQUEBOX_HOME/jboss
$  export  JRUBY_HOME=$TORQUEBOX_HOME/jruby

$  export  PATH=$JRUBY_HOME/bin:$PATH
Easy Install. Even on Windows


$  wget  http://torquebox.org/torquebox-­dev.zip
$  unzip  torquebox-­dev.zip

$ export TORQUEBOX_HOME=$PWD/torquebox-1*
$ export JBOSS_HOME=$TORQUEBOX_HOME/jboss
$ export JRUBY_HOME=$TORQUEBOX_HOME/jruby

$  export  PATH=$JRUBY_HOME/bin:$PATH
Easy Install. Even on Windows


$  wget  http://torquebox.org/torquebox-­dev.zip
$  unzip  torquebox-­dev.zip Make  sure  the  jruby  
                            found  in  your  path  is  in  
                             $JRUBY_HOME/bin.
$  export  TORQUEBOX_HOME=$PWD/torquebox-­1*
$  export  JBOSS_HOME=$TORQUEBOX_HOME/jboss
$  export  JRUBY_HOME=$TORQUEBOX_HOME/jruby

$ export PATH=$JRUBY_HOME/bin:$PATH
The Details

Builds  upon  and  requires  
JBoss  AS  6.x.    

Tight  integration  with  the  
JBoss  stack.
The Competition

Warbler,  Trinidad,  Unicorn,  
Thin,  Passenger...

...all  address  only  the  web  
question.
Web

Run  Ruby  web-­apps  within  
the  context  of  the  Servlet  
container.    

Without compilation.
A rails application
RAILS_ROOT/                         Filename
    app/
        models/
            person.rb
        views/
            person/
                index.html.haml
                show.html.haml
        controllers/
            persons_controller.rb
    lib/
        my-­java-­components.jar
    config/
        database.yml
        torquebox.yml
Deploy!
                     Filename




$  rake  torquebox:deploy
But continue editing
Deployment  does  not  create  
archives  (by  default).

Continue  live-­editing  of  running  
app:  

models,views,  controllers...
Non-surprising.
Almost boring.
Web (Java Integration)
                                  Filename


class  SomeController

    def  index
        session[:password]  =  'sw0rdfish'
    end

end
Web (Java Integration)
                                                      Filename


public  class  SomeServlet  
{
    public  void  doGet(HttpServletRequest  req,
                                        HttpServletResponse  resp)  
    {
        request.getSession().getValue("password");;
    }
}
Clustering

Ruby  applications  participate  
fully  in  AS  clustering.

Can  use  JBoss  mod_cluster.
mod_cluster
A  reverse  proxy  implemented  as  
an  Apache  module  with  JBoss  
awareness.  

Constantly  gathers  load  statistics  
and  deployment  availability  for  
intelligent  request  distribution.
mod_cluster
mod_cluster

• Dynamic  configuration
• Server-­side  load  factor  calculation
• Fine-­grained  web  app  lifecycle
• AJP  (Apache  JServ  Protocol)  is  
  optional.  HTTP[S]  is  also  supported.
Let's go
beyond the
  web...
Scheduled Jobs
Jobs
             app/jobs/newsletter_sender.rb

class  NewsletterSender
  
    def run()
        subscriptions  =  Subscription.find(:all)
        subscriptions.each  do  |e|
            send_newsletter(  e  )
        end
    end
  
end
Jobs
                        config/torquebox.yml
jobs:
    monthly_newsletter:
        description:  first  of  month
        job:  NewsletterSender
        cron:  ‘0  0  0  1  *  ?’

    sandbox:
        job:  Sandbox
        cron:  ‘*/5  *  *  *  *  ?’
Messaging, Part 1
   (async tasks)
Tasks
                      app/tasks/email_task.rb
class  EmailTask  <  TorqueBox::Messaging::Task

    def  welcome(payload)
        person  =  payload[:person]  
        person  ||=  Person.find_by_id(payload[:id])
        if  person
            #  send  the  email
            person.welcomed  =  true
            person.save!
        end
    end

end
Tasks


EmailTask.async(:welcome,  payload  )
Tasks

Call  them  from  your  
controllers,  models,  and  
observers,  or  even  other  
tasks.  Even  in  non-­Rails  
apps!
Messaging, Part 2
 (backgroundable)
Regular Class
                   Filename
class  Something

    def  foo()
    end

    def  bar()
    end

end
Blocking invocations
                              Filename



something  =  Something.new

something.foo

something.bar
Backgroundable
                                    Filename
class  Something

  include TorqueBox::Messaging::Backgroundable

    def  foo()
    end

    def  bar()
    end

end
Non-blocking invocations
                              Filename



something  =  Something.new

something.background.foo

something.background.bar
Choices
                                      Filename
class  Something

    include  TorqueBox::Messaging::Backgroundable
  always_background :foo

    def  foo()
    end

    def  bar()
    end

end
Just do it right.
                              Filename



something  =  Something.new

something.foo
Messaging, Part 3
    (low-level)
Destinations
config/torquebox.yml

queues:
    /queues/questions:
    /queues/answers:
        durable:  false
topics:
    /topics/new_accounts
    /topics/notifications
Processors
config/torquebox.yml

messaging:
  /topics/print: PrintHandler
  /queues/popular:
    - PopularHandler
    - AdultObserver:
        filter: "age >= 18"
        concurrency: 5
  /queues/students:
    PrintHandler:
      config:
        color: true
Processors
app/models/print_handler.rb

include  TorqueBox::Messaging

class  PrintHandler  < MessageProcessor
    def  initialize(opts)
        @color  =  opts['color']
    end
    def  on_message(body)
        puts  "Processing  #{body}  of  #{message}"
    end
end
Queues
example

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
  
puts  req.receive
res.publish  Time.now
Queues
example

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
  
puts  req.receive
res.publish  Time.now
Queues
example

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
  
puts  req.receive
res.publish  Time.now
Queues
example

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
  
puts req.receive
res.publish Time.now
Queues
“on the fly”



include  TorqueBox

queue  =  Messaging::Queue.new  '/queues/foo'
queue.create
    ...  
queue.destroy
Topics

• behavior  is  different,  but  interface  is  
  the  same.
• all  subscribers  of  a  topic  see  each  
  message,  but  only  one  subscriber  
    will  see  any  message  from  a  queue
•   use  TorqueBox::Messaging::Topic
Services
run along, lil’ daemon
Services

Long-­running,  non-­web  
“daemons”  that  share  the  
runtime  environment  and  
deployment  lifecycle  of  your  
app.
Services

• Represented  as  a  class  with  
  optional  initialize(Hash),  
    start()  and  stop()  methods,  
    which  should  each  return  quickly.
•   Typically  will  start  a  long-­running  
    loop  in  a  thread  and  respond  to  
    external  events.
Services
config/torquebox.yml

services:
    IrcBot:
        server:  freenode.net
        channel:  #torquebox
        publish:  /topics/irc

    MyMudServer:

    SomeOtherService:
Services
app/{models,etc}/my_service.rb

class  MyService
    def  initialize  opts={}
        name  =  opts[:publish]
        @queue  =  Messaging::Queue.new(name)
    end
    def  start  
        Thread.new  {  run  }  
    end
    def  stop  
        @done  =  true
    end
end
Services
app/{models,etc}/my_service.rb

class  MyService
    def initialize opts={}
        name = opts[:publish]
        @queue = Messaging::Queue.new(name)
    end
    def  start  
        Thread.new  {  run  }  
    end
    def  stop  
        @done  =  true
    end
end
Services
app/{models,etc}/my_service.rb

class  MyService
    def  initialize  opts={}
        name  =  opts[:publish]
        @queue  =  Messaging::Queue.new(name)
    end
    def start
        Thread.new { run }
    end
    def  stop  
        @done  =  true
    end
end
Services
app/{models,etc}/my_service.rb

class  MyService
    def  initialize  opts={}
        name  =  opts[:publish]
        @queue  =  Messaging::Queue.new(name)
    end
    def  start  
        Thread.new  {  run  }  
    end
    def stop
        @done = true
    end
end
Services
app/{models,etc}/my_service.rb


class  MyService
    def  run
        until  @done
            @queue.publish(Time.now)
            sleep(1)  
        end
    end
end
Services
app/{models,etc}/my_service.rb


class  MyService
    def  run
      until @done
         @queue.publish(Time.now)
         sleep(1)
      end
    end
end
Caching
Caching NoSQL

Integration  with  JBoss
Infinispan,  a  distributed/
replicated  object  store.
Transparent Infinispan

Easily  used  for  all  of  the  
implicit  caching  within  Rails.

Replace  in-­memory,  or  
memcached  caches.
Opaque Infinispan
                                         Filename



include ActiveSupport::Cache

myCache = TorqueBoxStore.new(:name => 'MyCache',
                             :mode => :replicated,
                             :sync => true)
I N J E C T I O N
    (we must go deeper)
Injection?

Letting  the  container  figure  
out  how  to  help  you  wire  up  
complex  component  models.
aka


Inversion of Control

Guice, PicoContainer, JBoss Microcontainer
Java CDI
package  com.mycorp;;           Filename

@ApplicationScoped
class  Something  {
    @Inject
    private  Else  elsewise;;
}

@ApplicationScoped
class  Else  {

}
CDI Injection


class  MyService
    def  initialize  opts={}
        @thing  =  cdi(com.mycorp.Something)
    end
end
CDI Injection


class  MyService
    def  initialize  opts={}
        @thing  =  cdi(com.mycorp.Something)
    end
end
But there's more than
just CDI you can inject.
There's also heroin,
queues, topics and
other things.

But not really heroin.
           (Drugs are bad, m'kay?)
Destination Injection


class  MyService
    def  initialize  opts={}
        @inbound    =  topic(  "/topics/questions"  )
        @outbound  =  queue(  "/queues/answers"  )
    end
end
Destination Injection


class  MyService
    def  initialize  opts={}
        @inbound    =  topic( "/topics/questions" )
        @outbound  =  queue( "/queues/answers" )
    end
end
JNDI Injection


class  MyService
    def  initialize  opts={}
        @factory  =  naming("java:comp/env/jdbc/myDS")
    end
end
JNDI Injection


class  MyService
    def  initialize  opts={}
        @factory  =  naming("java:comp/env/jdbc/myDS")
    end
end
JBossMC Injection


class  MyService
    def  initialize  opts={}
        @heroin  =  mc(  "SomeMCBean"  )
    end
end
JBossMC Injection


class  MyService
    def  initialize  opts={}
        @heroin  =  mc( "SomeMCBean" )
    end
end
Why MC Beans?
All  internal  plumbing  of  
JBoss AS  is  stitched  
together  using  MC.    

Grab  the  WebServer,  the  
CacheManager,  whatevs.
But that's not all!
BackStage

Dashboard  to  inspect  and  
control  Ruby  components.

And  a  RESTful  API.
TorqueBox: The beauty of Ruby with the power of JBoss.  Presented at Devnexus 2011.
StompBox


Easy  Heroku-­esque  
git-­based  deployments.
StompBox
But how does it
   perform?
BENchmarks
Real-world Rail application:
Redmine
Comparisons:
TorqueBox,  Trinidad,  Passenger,  
Unicorn,  Glassfish,  Thin
Runtimes:
JRuby,  MRI,  RubyEE
TorqueBox: The beauty of Ruby with the power of JBoss.  Presented at Devnexus 2011.
TorqueBox: The beauty of Ruby with the power of JBoss.  Presented at Devnexus 2011.
Roadmap
May - 1.0.0.Final
Then...
    AS7
    Authentication
    Transactions
    Drools/jBPM/etc
    Mobicents
Resources

•   http://torquebox.org/
•   http://github.com/torquebox
•   #torquebox  on  FreeNode
•   @torquebox
Thanks, and don't
 forget to pick up
  some stickers.

More Related Content

PDF
Complex Made Simple: Sleep Better with TorqueBox
bobmcwhirter
 
PDF
TorqueBox at DC:JBUG - November 2011
bobmcwhirter
 
PDF
TorqueBox for Rubyists
bobmcwhirter
 
KEY
Devignition 2011
tobiascrawley
 
PDF
When Ruby Meets Java - The Power of Torquebox
rockyjaiswal
 
PDF
TorqueBox - Ultrapassando a fronteira entre Java e Ruby
Bruno Oliveira
 
PDF
TorqueBox - When Java meets Ruby
Bruno Oliveira
 
PDF
DataMapper on Infinispan
Lance Ball
 
Complex Made Simple: Sleep Better with TorqueBox
bobmcwhirter
 
TorqueBox at DC:JBUG - November 2011
bobmcwhirter
 
TorqueBox for Rubyists
bobmcwhirter
 
Devignition 2011
tobiascrawley
 
When Ruby Meets Java - The Power of Torquebox
rockyjaiswal
 
TorqueBox - Ultrapassando a fronteira entre Java e Ruby
Bruno Oliveira
 
TorqueBox - When Java meets Ruby
Bruno Oliveira
 
DataMapper on Infinispan
Lance Ball
 

What's hot (20)

PDF
JUDCon 2010 Boston : TorqueBox
marekgoldmann
 
PDF
Torquebox - O melhor dos dois mundos
Bruno Oliveira
 
PDF
JUDCon 2010 Boston : BoxGrinder
marekgoldmann
 
KEY
TorqueBox - Ruby Hoedown 2011
Lance Ball
 
PDF
Torquebox OSCON Java 2011
tobiascrawley
 
PDF
Torquebox @ Raleigh.rb - April 2011
tobiascrawley
 
PDF
The Enterprise Strikes Back
Burke Libbey
 
KEY
When Two Worlds Collide: Java and Ruby in the Enterprise
benbrowning
 
PDF
How DSL works on Ruby
Hiroshi SHIBATA
 
PDF
ZK_Arch_notes_20081121
WANGCHOU LU
 
ODP
First Day With J Ruby
Praveen Kumar Sinha
 
PDF
Spring into rails
Hiro Asari
 
KEY
Ruby 1.9 Fibers
Kevin Ball
 
PDF
Ruby 2.4 Internals
Koichi Sasada
 
ODP
Pfm technical-inside
iyatomi takehiro
 
PDF
Fiber in the 10th year
Koichi Sasada
 
KEY
Ruby on Rails survival guide of an aged Java developer
gicappa
 
PPTX
Apache camel overview dec 2011
Marcelo Jabali
 
PPTX
Running Ruby on Solaris (RubyKaigi 2015, 12/Dec/2015)
ngotogenome
 
PDF
JRuby 9000 - Taipei Ruby User's Group 2015
Charles Nutter
 
JUDCon 2010 Boston : TorqueBox
marekgoldmann
 
Torquebox - O melhor dos dois mundos
Bruno Oliveira
 
JUDCon 2010 Boston : BoxGrinder
marekgoldmann
 
TorqueBox - Ruby Hoedown 2011
Lance Ball
 
Torquebox OSCON Java 2011
tobiascrawley
 
Torquebox @ Raleigh.rb - April 2011
tobiascrawley
 
The Enterprise Strikes Back
Burke Libbey
 
When Two Worlds Collide: Java and Ruby in the Enterprise
benbrowning
 
How DSL works on Ruby
Hiroshi SHIBATA
 
ZK_Arch_notes_20081121
WANGCHOU LU
 
First Day With J Ruby
Praveen Kumar Sinha
 
Spring into rails
Hiro Asari
 
Ruby 1.9 Fibers
Kevin Ball
 
Ruby 2.4 Internals
Koichi Sasada
 
Pfm technical-inside
iyatomi takehiro
 
Fiber in the 10th year
Koichi Sasada
 
Ruby on Rails survival guide of an aged Java developer
gicappa
 
Apache camel overview dec 2011
Marcelo Jabali
 
Running Ruby on Solaris (RubyKaigi 2015, 12/Dec/2015)
ngotogenome
 
JRuby 9000 - Taipei Ruby User's Group 2015
Charles Nutter
 
Ad

Similar to TorqueBox: The beauty of Ruby with the power of JBoss. Presented at Devnexus 2011. (20)

PDF
Building web framework with Rack
sickill
 
PPTX
Node.js Patterns for Discerning Developers
cacois
 
PDF
JRuby + Rails = Awesome Java Web Framework at Jfokus 2011
Nick Sieger
 
PDF
JavaScript Miller Columns
Jonathan Fine
 
PDF
Play framework
Andrew Skiba
 
PDF
TorqueBox at GNUnify 2012
Saleem Ansari
 
PPTX
Intro To Node.js
Chris Cowan
 
KEY
JavaScript Growing Up
David Padbury
 
KEY
A tour on ruby and friends
旻琦 潘
 
KEY
node.js: Javascript's in your backend
David Padbury
 
PPTX
Node.js: The What, The How and The When
FITC
 
KEY
Wider than rails
Alexey Nayden
 
PDF
Connecting the Worlds of Java and Ruby with JRuby
Nick Sieger
 
PDF
Intro To JavaScript Unit Testing - Ran Mizrahi
Ran Mizrahi
 
PPTX
Why Ruby?
IT Weekend
 
PDF
Ruby On Rails
Balint Erdi
 
PDF
Phoenix for Rails Devs
Diacode
 
PDF
Exploring Clojurescript
Luke Donnet
 
PPTX
Introduction to node.js GDD
Sudar Muthu
 
PPT
React native
Mohammed El Rafie Tarabay
 
Building web framework with Rack
sickill
 
Node.js Patterns for Discerning Developers
cacois
 
JRuby + Rails = Awesome Java Web Framework at Jfokus 2011
Nick Sieger
 
JavaScript Miller Columns
Jonathan Fine
 
Play framework
Andrew Skiba
 
TorqueBox at GNUnify 2012
Saleem Ansari
 
Intro To Node.js
Chris Cowan
 
JavaScript Growing Up
David Padbury
 
A tour on ruby and friends
旻琦 潘
 
node.js: Javascript's in your backend
David Padbury
 
Node.js: The What, The How and The When
FITC
 
Wider than rails
Alexey Nayden
 
Connecting the Worlds of Java and Ruby with JRuby
Nick Sieger
 
Intro To JavaScript Unit Testing - Ran Mizrahi
Ran Mizrahi
 
Why Ruby?
IT Weekend
 
Ruby On Rails
Balint Erdi
 
Phoenix for Rails Devs
Diacode
 
Exploring Clojurescript
Luke Donnet
 
Introduction to node.js GDD
Sudar Muthu
 
Ad

Recently uploaded (20)

PDF
NewMind AI Weekly Chronicles - July'25 - Week IV
NewMind AI
 
PDF
Event Presentation Google Cloud Next Extended 2025
minhtrietgect
 
PDF
Chapter 1 Introduction to CV and IP Lecture Note.pdf
Getnet Tigabie Askale -(GM)
 
PDF
CIFDAQ'S Market Insight: BTC to ETH money in motion
CIFDAQ
 
PDF
The Evolution of KM Roles (Presented at Knowledge Summit Dublin 2025)
Enterprise Knowledge
 
PDF
Google I/O Extended 2025 Baku - all ppts
HusseinMalikMammadli
 
PDF
Data_Analytics_vs_Data_Science_vs_BI_by_CA_Suvidha_Chaplot.pdf
CA Suvidha Chaplot
 
PDF
Unlocking the Future- AI Agents Meet Oracle Database 23ai - AIOUG Yatra 2025.pdf
Sandesh Rao
 
PDF
Oracle AI Vector Search- Getting Started and what's new in 2025- AIOUG Yatra ...
Sandesh Rao
 
PDF
Using Anchore and DefectDojo to Stand Up Your DevSecOps Function
Anchore
 
PDF
How-Cloud-Computing-Impacts-Businesses-in-2025-and-Beyond.pdf
Artjoker Software Development Company
 
PPTX
Smart Infrastructure and Automation through IoT Sensors
Rejig Digital
 
PDF
AI Unleashed - Shaping the Future -Starting Today - AIOUG Yatra 2025 - For Co...
Sandesh Rao
 
PPTX
Comunidade Salesforce São Paulo - Desmistificando o Omnistudio (Vlocity)
Francisco Vieira Júnior
 
PDF
Automating ArcGIS Content Discovery with FME: A Real World Use Case
Safe Software
 
PPT
Coupa-Kickoff-Meeting-Template presentai
annapureddyn
 
PPTX
cloud computing vai.pptx for the project
vaibhavdobariyal79
 
PDF
Security features in Dell, HP, and Lenovo PC systems: A research-based compar...
Principled Technologies
 
PDF
Building High-Performance Oracle Teams: Strategic Staffing for Database Manag...
SMACT Works
 
PDF
Advances in Ultra High Voltage (UHV) Transmission and Distribution Systems.pdf
Nabajyoti Banik
 
NewMind AI Weekly Chronicles - July'25 - Week IV
NewMind AI
 
Event Presentation Google Cloud Next Extended 2025
minhtrietgect
 
Chapter 1 Introduction to CV and IP Lecture Note.pdf
Getnet Tigabie Askale -(GM)
 
CIFDAQ'S Market Insight: BTC to ETH money in motion
CIFDAQ
 
The Evolution of KM Roles (Presented at Knowledge Summit Dublin 2025)
Enterprise Knowledge
 
Google I/O Extended 2025 Baku - all ppts
HusseinMalikMammadli
 
Data_Analytics_vs_Data_Science_vs_BI_by_CA_Suvidha_Chaplot.pdf
CA Suvidha Chaplot
 
Unlocking the Future- AI Agents Meet Oracle Database 23ai - AIOUG Yatra 2025.pdf
Sandesh Rao
 
Oracle AI Vector Search- Getting Started and what's new in 2025- AIOUG Yatra ...
Sandesh Rao
 
Using Anchore and DefectDojo to Stand Up Your DevSecOps Function
Anchore
 
How-Cloud-Computing-Impacts-Businesses-in-2025-and-Beyond.pdf
Artjoker Software Development Company
 
Smart Infrastructure and Automation through IoT Sensors
Rejig Digital
 
AI Unleashed - Shaping the Future -Starting Today - AIOUG Yatra 2025 - For Co...
Sandesh Rao
 
Comunidade Salesforce São Paulo - Desmistificando o Omnistudio (Vlocity)
Francisco Vieira Júnior
 
Automating ArcGIS Content Discovery with FME: A Real World Use Case
Safe Software
 
Coupa-Kickoff-Meeting-Template presentai
annapureddyn
 
cloud computing vai.pptx for the project
vaibhavdobariyal79
 
Security features in Dell, HP, and Lenovo PC systems: A research-based compar...
Principled Technologies
 
Building High-Performance Oracle Teams: Strategic Staffing for Database Manag...
SMACT Works
 
Advances in Ultra High Voltage (UHV) Transmission and Distribution Systems.pdf
Nabajyoti Banik
 

TorqueBox: The beauty of Ruby with the power of JBoss. Presented at Devnexus 2011.

  • 1. Bob McWhirter Presented at DevNexus 22 March 2011 Creative  Commons  BY-­SA  3.0
  • 2. Bob McWhirter • Project  lead  of  TorqueBox • JBoss  Fellow • Founder  of  The  Codehaus • Founder  of  Drools • Been  with  Red  Hat  ~4  years
  • 3. but it's a team.
  • 4. What is TorqueBox? The  mating  of  JRuby  to   JBoss AS.
  • 6. Goals • Support  Ruby  web  frameworks • Rails • Sinatra • Rack • Go  beyond  the  web • Messaging • Jobs • Services
  • 7. But... ...Java  already  supports   messaging,  jobs  and   services.
  • 9. Why Ruby? • No  compilation • Low  ceremony • Highly  expressive • Lots  of  shiny  frameworks • Few  specifications  (more  fun!) • Meta
  • 10. Expressive anything.rb teams.    collect(&:members).    flatten.uniq.each  &:promote!
  • 11. Uhh... com/foo/Anything.java Set<Person>  people  =  new  HashSet<Person>();; for  (  Team  each  :  teams  )  {    people.addAll(  each.getMembers()  );; } for  (  Person  each  :  people  )  {    each.promote();; }
  • 12. Why JRuby • Very  fast  runtime • Real  threads • Java  libraries • Java  tools • Healthy  community
  • 13. Easy Install. Even on Windows $  wget  http://torquebox.org/torquebox-­dev.zip $  unzip  torquebox-­dev.zip $  export  TORQUEBOX_HOME=$PWD/torquebox-­1* $  export  JBOSS_HOME=$TORQUEBOX_HOME/jboss $  export  JRUBY_HOME=$TORQUEBOX_HOME/jruby $  export  PATH=$JRUBY_HOME/bin:$PATH
  • 14. Easy Install. Even on Windows $ wget http://torquebox.org/torquebox-dev.zip $ unzip torquebox-dev.zip $  export  TORQUEBOX_HOME=$PWD/torquebox-­1* $  export  JBOSS_HOME=$TORQUEBOX_HOME/jboss $  export  JRUBY_HOME=$TORQUEBOX_HOME/jruby $  export  PATH=$JRUBY_HOME/bin:$PATH
  • 15. Easy Install. Even on Windows $  wget  http://torquebox.org/torquebox-­dev.zip $  unzip  torquebox-­dev.zip $ export TORQUEBOX_HOME=$PWD/torquebox-1* $ export JBOSS_HOME=$TORQUEBOX_HOME/jboss $ export JRUBY_HOME=$TORQUEBOX_HOME/jruby $  export  PATH=$JRUBY_HOME/bin:$PATH
  • 16. Easy Install. Even on Windows $  wget  http://torquebox.org/torquebox-­dev.zip $  unzip  torquebox-­dev.zip Make  sure  the  jruby   found  in  your  path  is  in   $JRUBY_HOME/bin. $  export  TORQUEBOX_HOME=$PWD/torquebox-­1* $  export  JBOSS_HOME=$TORQUEBOX_HOME/jboss $  export  JRUBY_HOME=$TORQUEBOX_HOME/jruby $ export PATH=$JRUBY_HOME/bin:$PATH
  • 17. The Details Builds  upon  and  requires   JBoss  AS  6.x.     Tight  integration  with  the   JBoss  stack.
  • 18. The Competition Warbler,  Trinidad,  Unicorn,   Thin,  Passenger... ...all  address  only  the  web   question.
  • 19. Web Run  Ruby  web-­apps  within   the  context  of  the  Servlet   container.     Without compilation.
  • 20. A rails application RAILS_ROOT/ Filename    app/        models/            person.rb        views/            person/                index.html.haml                show.html.haml        controllers/            persons_controller.rb    lib/        my-­java-­components.jar    config/        database.yml        torquebox.yml
  • 21. Deploy! Filename $  rake  torquebox:deploy
  • 22. But continue editing Deployment  does  not  create   archives  (by  default). Continue  live-­editing  of  running   app:   models,views,  controllers...
  • 24. Web (Java Integration) Filename class  SomeController    def  index        session[:password]  =  'sw0rdfish'    end end
  • 25. Web (Java Integration) Filename public  class  SomeServlet   {    public  void  doGet(HttpServletRequest  req,                                        HttpServletResponse  resp)      {        request.getSession().getValue("password");;    } }
  • 26. Clustering Ruby  applications  participate   fully  in  AS  clustering. Can  use  JBoss  mod_cluster.
  • 27. mod_cluster A  reverse  proxy  implemented  as   an  Apache  module  with  JBoss   awareness.   Constantly  gathers  load  statistics   and  deployment  availability  for   intelligent  request  distribution.
  • 29. mod_cluster • Dynamic  configuration • Server-­side  load  factor  calculation • Fine-­grained  web  app  lifecycle • AJP  (Apache  JServ  Protocol)  is   optional.  HTTP[S]  is  also  supported.
  • 32. Jobs app/jobs/newsletter_sender.rb class  NewsletterSender      def run()        subscriptions  =  Subscription.find(:all)        subscriptions.each  do  |e|            send_newsletter(  e  )        end    end   end
  • 33. Jobs config/torquebox.yml jobs:    monthly_newsletter:        description:  first  of  month        job:  NewsletterSender        cron:  ‘0  0  0  1  *  ?’    sandbox:        job:  Sandbox        cron:  ‘*/5  *  *  *  *  ?’
  • 34. Messaging, Part 1 (async tasks)
  • 35. Tasks app/tasks/email_task.rb class  EmailTask  <  TorqueBox::Messaging::Task    def  welcome(payload)        person  =  payload[:person]          person  ||=  Person.find_by_id(payload[:id])        if  person            #  send  the  email            person.welcomed  =  true            person.save!        end    end end
  • 37. Tasks Call  them  from  your   controllers,  models,  and   observers,  or  even  other   tasks.  Even  in  non-­Rails   apps!
  • 38. Messaging, Part 2 (backgroundable)
  • 39. Regular Class Filename class  Something    def  foo()    end    def  bar()    end end
  • 40. Blocking invocations Filename something  =  Something.new something.foo something.bar
  • 41. Backgroundable Filename class  Something include TorqueBox::Messaging::Backgroundable    def  foo()    end    def  bar()    end end
  • 42. Non-blocking invocations Filename something  =  Something.new something.background.foo something.background.bar
  • 43. Choices Filename class  Something    include  TorqueBox::Messaging::Backgroundable always_background :foo    def  foo()    end    def  bar()    end end
  • 44. Just do it right. Filename something  =  Something.new something.foo
  • 45. Messaging, Part 3 (low-level)
  • 46. Destinations config/torquebox.yml queues:    /queues/questions:    /queues/answers:        durable:  false topics:    /topics/new_accounts    /topics/notifications
  • 47. Processors config/torquebox.yml messaging: /topics/print: PrintHandler /queues/popular: - PopularHandler - AdultObserver: filter: "age >= 18" concurrency: 5 /queues/students: PrintHandler: config: color: true
  • 48. Processors app/models/print_handler.rb include  TorqueBox::Messaging class  PrintHandler  < MessageProcessor    def  initialize(opts)        @color  =  opts['color']    end    def  on_message(body)        puts  "Processing  #{body}  of  #{message}"    end end
  • 49. Queues example 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   puts  req.receive res.publish  Time.now
  • 50. Queues example 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   puts  req.receive res.publish  Time.now
  • 51. Queues example 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   puts  req.receive res.publish  Time.now
  • 52. Queues example 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   puts req.receive res.publish Time.now
  • 53. Queues “on the fly” include  TorqueBox queue  =  Messaging::Queue.new  '/queues/foo' queue.create    ...   queue.destroy
  • 54. Topics • behavior  is  different,  but  interface  is   the  same. • all  subscribers  of  a  topic  see  each   message,  but  only  one  subscriber   will  see  any  message  from  a  queue • use  TorqueBox::Messaging::Topic
  • 56. Services Long-­running,  non-­web   “daemons”  that  share  the   runtime  environment  and   deployment  lifecycle  of  your   app.
  • 57. Services • Represented  as  a  class  with   optional  initialize(Hash),   start()  and  stop()  methods,   which  should  each  return  quickly. • Typically  will  start  a  long-­running   loop  in  a  thread  and  respond  to   external  events.
  • 58. Services config/torquebox.yml services:    IrcBot:        server:  freenode.net        channel:  #torquebox        publish:  /topics/irc    MyMudServer:    SomeOtherService:
  • 59. Services app/{models,etc}/my_service.rb class  MyService    def  initialize  opts={}        name  =  opts[:publish]        @queue  =  Messaging::Queue.new(name)    end    def  start          Thread.new  {  run  }      end    def  stop          @done  =  true    end end
  • 60. Services app/{models,etc}/my_service.rb class  MyService def initialize opts={} name = opts[:publish] @queue = Messaging::Queue.new(name) end    def  start          Thread.new  {  run  }      end    def  stop          @done  =  true    end end
  • 61. Services app/{models,etc}/my_service.rb class  MyService    def  initialize  opts={}        name  =  opts[:publish]        @queue  =  Messaging::Queue.new(name)    end def start Thread.new { run } end    def  stop          @done  =  true    end end
  • 62. Services app/{models,etc}/my_service.rb class  MyService    def  initialize  opts={}        name  =  opts[:publish]        @queue  =  Messaging::Queue.new(name)    end    def  start          Thread.new  {  run  }      end def stop @done = true end end
  • 63. Services app/{models,etc}/my_service.rb class  MyService    def  run        until  @done            @queue.publish(Time.now)            sleep(1)          end    end end
  • 64. Services app/{models,etc}/my_service.rb class  MyService    def  run until @done @queue.publish(Time.now) sleep(1) end    end end
  • 66. Caching NoSQL Integration  with  JBoss Infinispan,  a  distributed/ replicated  object  store.
  • 67. Transparent Infinispan Easily  used  for  all  of  the   implicit  caching  within  Rails. Replace  in-­memory,  or   memcached  caches.
  • 68. Opaque Infinispan Filename include ActiveSupport::Cache myCache = TorqueBoxStore.new(:name => 'MyCache', :mode => :replicated, :sync => true)
  • 69. I N J E C T I O N (we must go deeper)
  • 70. Injection? Letting  the  container  figure   out  how  to  help  you  wire  up   complex  component  models.
  • 71. aka Inversion of Control Guice, PicoContainer, JBoss Microcontainer
  • 72. Java CDI package  com.mycorp;; Filename @ApplicationScoped class  Something  { @Inject    private  Else  elsewise;; } @ApplicationScoped class  Else  { }
  • 73. CDI Injection class  MyService    def  initialize  opts={}        @thing  =  cdi(com.mycorp.Something)    end end
  • 74. CDI Injection class  MyService    def  initialize  opts={}        @thing  =  cdi(com.mycorp.Something)    end end
  • 75. But there's more than just CDI you can inject. There's also heroin, queues, topics and other things. But not really heroin. (Drugs are bad, m'kay?)
  • 76. Destination Injection class  MyService    def  initialize  opts={}        @inbound    =  topic(  "/topics/questions"  )        @outbound  =  queue(  "/queues/answers"  )    end end
  • 77. Destination Injection class  MyService    def  initialize  opts={}        @inbound    =  topic( "/topics/questions" )        @outbound  =  queue( "/queues/answers" )    end end
  • 78. JNDI Injection class  MyService    def  initialize  opts={}        @factory  =  naming("java:comp/env/jdbc/myDS")    end end
  • 79. JNDI Injection class  MyService    def  initialize  opts={}        @factory  =  naming("java:comp/env/jdbc/myDS")    end end
  • 80. JBossMC Injection class  MyService    def  initialize  opts={}        @heroin  =  mc(  "SomeMCBean"  )    end end
  • 81. JBossMC Injection class  MyService    def  initialize  opts={}        @heroin  =  mc( "SomeMCBean" )    end end
  • 82. Why MC Beans? All  internal  plumbing  of   JBoss AS  is  stitched   together  using  MC.     Grab  the  WebServer,  the   CacheManager,  whatevs.
  • 84. BackStage Dashboard  to  inspect  and   control  Ruby  components. And  a  RESTful  API.
  • 88. But how does it perform?
  • 89. BENchmarks Real-world Rail application: Redmine Comparisons: TorqueBox,  Trinidad,  Passenger,   Unicorn,  Glassfish,  Thin Runtimes: JRuby,  MRI,  RubyEE
  • 92. Roadmap May - 1.0.0.Final Then...    AS7    Authentication    Transactions    Drools/jBPM/etc    Mobicents
  • 93. Resources • http://torquebox.org/ • http://github.com/torquebox • #torquebox  on  FreeNode • @torquebox
  • 94. Thanks, and don't forget to pick up some stickers.