SlideShare a Scribd company logo
1 of 101
Download to read offline
The Beauty of Ruby with the Power of Java
                                 Toby Crawley
                                   OSCON Java
Creative  Commons  BY-­SA  3.0
                                      July 2011
Toby  Crawley
!
• @tcrawley
• TorqueBox  Core  Developer
• Red  Hat  Senior  Engineer  
but  it's  a  team.
What  is  TorqueBox?

 The  mating  of  JRuby  to  
 JBoss  AS.
Application  Server?
        Sinatra      Rails
              Rack
        Passenger/Thin


        Apache/Nginx
Application  Server?
              Sinatra      Rails
                    Rack
    Tasks     Passenger/Thin
  Resque/
 DelayedJob   Apache/Nginx
Application  Server?
              Sinatra      Rails
                    Rack
    Tasks     Passenger/Thin       Jobs
  Resque/
 DelayedJob   Apache/Nginx         crond
Application  Server?
              Sinatra      Rails
                    Rack
    Tasks     Passenger/Thin       Jobs
  Resque/
 DelayedJob   Apache/Nginx         crond


                 Daemons


               god/monit
TorqueBox  AS

Sinatra      Rails
      Rack            Tasks   Procs            Jobs        Daemons
      Web               Messaging        Scheduling        Services

                                JBoss AS
               Clustering     Load Balancing          HA
Goals
• Support  Ruby  web  frameworks
 • Rails
 • Sinatra
 • Rack
Goals
• Support  Ruby  web  frameworks
 • Rails
 • Sinatra
 • Rack
• Go  beyond  the  web
 • Messaging
 • Jobs
 • Services
Goals


          No  XML,  No  Java
(unless  you're  into  that  sort  of  thing)
Why  Ruby?

• No  compilation
• Highly  expressive
• Lots  of  shiny  frameworks
• Few  specifications  (more  fun!)
• Meta-­programming
Expressive
com/foo/Anything.java


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

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

for  (  Person  each  :  people  )  {
    each.promote();;
}
Expressive
anything.rb




teams.collect(&:members).
  flatten.uniq.each(&:promote)
Expressive
anything.rb


all_members  =      
    teams.collect(&:members)

all_members.flatten!.uniq!

all_members.each(&:promote)
Why  JRuby?
Why  JRuby?


system  =  Java::java.lang.System

system.properties.each  do  |k,v|
    system.properties[k]  =  v.upcase
end
Why  JRuby?

• Very  fast  runtime
• Real  threads
• Java  libraries
• Java  tools
• Healthy  community
TorqueBox  Details

 Builds  upon  and  requires  
 JBoss  AS  6.x.    

 Tight  integration  with  the  
 JBoss  stack.
Easy  Install
(download  1.1  from  torquebox.org)

$  unzip  torquebox-­dist-­1.1-­bin.zip

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

$  export  PATH=$JRUBY_HOME/bin:$PATH
Easy  Install
(download  1.1  from  torquebox.org)

$  unzip  torquebox-­dist-­1.0.0-­bin.zip

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

$  export  PATH=$JRUBY_HOME/bin:$PATH
Easy  Install
(download  1.1  from  torquebox.org)

$  unzip  torquebox-­dist-­1.1-­bin.zip

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

$  export  PATH=$JRUBY_HOME/bin:$PATH
Easy  Install
(download  1.1  from  torquebox.org)

$  unzip  torquebox-­dist-­1.1-­bin.zip

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

$  export  PATH=$JRUBY_HOME/bin:$PATH
Easy  Install
(download  1.1  from  torquebox.org)

$  unzip  torquebox-­dist-­1.0.0.CR1-­bin.zip
                               Make  sure  the  jruby  
                             found  in  your  path  is  in  
$  export  TORQUEBOX_HOME=$PWD/torquebox-­1*
                              $JRUBY_HOME/bin.
$  export  JBOSS_HOME=$TORQUEBOX_HOME/jboss
$  export  JRUBY_HOME=$TORQUEBOX_HOME/jruby

$  export  PATH=$JRUBY_HOME/bin:$PATH
Easy  Install
(download  1.1  from  torquebox.org)

$  unzip  torquebox-­dist-­1.0.0.CR1-­bin.zip
                               Make  sure  the  jruby  
                             found  in  your  path  is  in  
$  export  TORQUEBOX_HOME=$PWD/torquebox-­1*
                              $JRUBY_HOME/bin.
$  export  JBOSS_HOME=$TORQUEBOX_HOME/jboss
$  export  JRUBY_HOME=$TORQUEBOX_HOME/jruby

$  export  PATH=$JRUBY_HOME/bin:$PATH
Deployment

rake  torquebox:run
        Run  TorqueBox  server

rake  torquebox:deploy[context_path]
        Deploy  the  app  in  the  current  directory

rake  torquebox:undeploy
        Undeploy  the  app  in  the  current  directory
Deployment

The  torquebox:deploy  task  
creates:

$TORQUEBOX_HOME/apps/my-­app.yml
Web

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

Without  compilation.
But  continue  editing

 Continue  live-­editing  of  running  
 app:  

 models,views,  controllers...
Non-­surprising.  
Almost  boring.
Web  (Session  Integration)


class  SomeController

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

end
Web  (Session  Integration)


public  class  SomeServlet  {
    public  void  doGet(HttpServletRequest  request,
                                        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.
Let's  go  
beyond  the  
  web...
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  *  ?’

    process_tps_reports:
        job:  TPSReportProcessor
        cron:  ‘0  0  0  0  MON  ?’
        singleton:  true
Regular  Class

class  Something

    def  foo
    end

    def  bar
    end

end
Blocking  invocations


something  =  Something.new

something.foo

something.bar
Backgroundable

class  Something

    include  TorqueBox::Messaging::Backgroundable

    def  foo
    end

    def  bar
    end

end
Explicitly  Non-­blocking  


something  =  Something.new

something.background.foo

something.background.bar
Choices

class  Something

    include  TorqueBox::Messaging::Backgroundable
    always_background  :foo

    def  foo
    end

    def  bar
    end

end
Implicitly  Non-­blocking  


something  =  Something.new

something.foo
See  The  Future


something  =  Something.new

future  =  something.foo
See  The  Future

future.started?

future.complete?

future.error?

future.result
See  The  Future

class  Something

    def  foo
        ...
        count  +=  1
        future.status  =  count
        ...
    end

end  
See  The  Future


#  on  the  'client'  side

future.status_changed?

future.status  #  =>  42
Messaging


•   JMS  behind  the  scenes
•   HornetQ  is  the  JBoss  JMS  
    implementation
Destinations
config/torquebox.yml

queues:
    /queues/questions:
    /queues/answers:
        durable:  false
topics:
    /topics/new_accounts
    /topics/notifications
Processors
app/models/print_handler.rb

include  TorqueBox::Messaging

class  PrintHandler  <  MessageProcessor
    def  initialize(opts)
        @printer  =  opts['printer']  ||  default
    end
    def  on_message(body)
        puts  "Processing  #{body}  of  #{message}"
    end
end
Processors
config/torquebox.yml

messaging:
  /topics/orders:
    - PrintHandler
    - ShoutHandler
  /queues/receipts:
    PrintHandler:
      concurrency: 5
      config:
        printer: the_little_one
Queues
contrived  example

questions  =  Queue.new('/queues/questions')
answers  =  Queue.new('/queues/answers')
  
Thread.new  do
    questions.publish(  "What  time  is  it?"  )
    puts  answers.receive(  :timeout  =>  1000  )
end
  
puts  questions.receive
answers.publish(  Time.now  )
Queues
contrived  example

questions  =  Queue.new('/queues/questions')
answers  =  Queue.new('/queues/answers')
  
Thread.new  do
    questions.publish(  "What  time  is  it?"  )
    puts  answers.receive(  :timeout  =>  1000  )
end
  
puts  questions.receive
answers.publish(  Time.now  )
Queues
contrived  example

questions  =  Queue.new('/queues/questions')
answers  =  Queue.new('/queues/answers')
  
Thread.new  do
    questions.publish(  "What  time  is  it?"  )
    puts  answers.receive(  :timeout  =>  1000  )
end
  
puts  questions.receive
answers.publish(  Time.now  )
Queues
contrived  example

questions  =  Queue.new('/queues/questions')
answers  =  Queue.new('/queues/answers')
  
Thread.new  do
    questions.publish(  "What  time  is  it?"  )
    puts  answers.receive(  :timeout  =>  1000  )
end
  
puts  questions.receive
answers.publish(  Time.now  )
Queues
“on  the  fly”



include  TorqueBox::Messaging

queue  =  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

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:
    TimeMachine:
        queue:  /queue/morris_day

    IrcBot:
        server:  freenode.net
        channel:  #torquebox
        publish:  /topics/irc
        singleton:  true
Services
 app/services/time_machine.rb

class  TimeMachine
    def  initialize(opts)
        @queue  =  Queue.new(opts['queue'])
    end

    def  start  
        Thread.new  {  run  }
    end

    def  stop
        @done  =  true  
    end
end
Services
app/services/time_machine.rb

class  TimeMachine
    def  initialize(opts)
        @queue  =  Queue.new(opts['queue'])
    end

    def  start  
        Thread.new  {  run  }
    end

    def  stop
        @done  =  true
    end
end
Services
app/services/time_machine.rb

class  TimeMachine
    def  initialize(opts)
        @queue  =  Queue.new(opts['queue'])
    end

    def  start  
        Thread.new  {  run  }
    end

    def  stop
        @done  =  true
    end
end
Services
app/services/time_machine.rb

class  TimeMachine
    def  initialize(opts)
        @queue  =  Queue.new(opts['queue'])
    end

    def  start  
        Thread.new  {  run  }
    end

    def  stop
        @done  =  true
    end
end
Services
app/services/time_machine.rb


class  TimeMachine

    def  run  
        until  @done
            @queue.publish(Time.now)
            sleep(1)  
        end
    end

end
Services
app/services/time_machine.rb


class  TimeMachine

    def  run  
        until  @done
            @queue.publish(Time.now)
            sleep(1)  
        end
    end

end
Caching

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


include ActiveSupport::Cache

myCache =
  TorqueBoxStore.new(:name => 'MyCache',
                     :mode => :replicated,
                     :sync => true)
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;;

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

@ApplicationScoped
class  SomethingElse  {

}
CDI  Injection


class  MyService
    include  TorqueBox::Injectors

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

class  MyService
    include  TorqueBox::Injectors

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


class  MyService
    include  TorqueBox::Injectors

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


class  MyService
    include  TorqueBox::Injectors

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

Grab  the  WebServer,  the  
CacheManager,  whatevs.
BENchmarks
Real-­world  Rail  application:
Redmine
Comparisons:
TorqueBox,  Trinidad,  Glassfish,  
Passenger,  Unicorn,  Thin
Runtimes:
JRuby,  MRI,  RubyEE
BackStage

Dashboard  to  inspect  and  
control  Ruby  components.

And  a  RESTful  API.
StompBox


Easy  Heroku-­esque  
git-­based  deployments.
Oh  yeah...
 It  works  on  Windows.
Roadmap

1.1  Stable
2.0  Development  (based  on
    JBoss  AS7)
???  -­  you  tell  us
Resources

•   http://torquebox.org/
•   http://github.com/torquebox
•   #torquebox  on  FreeNode
•   @torquebox
Thanks!
                                                         Questions?

                        Image  attributions:
                            Target  by  Jasper  Johns  by  nostri-­imago  http://www.flickr.com/photos/nostri-­imago/3137422976/  CC  BY  2.0
                            WEB 2.0 HAS AN API  by  raster  http://www.flickr.com/photos/raster/137506981/  CC  BY-­NC-­SA  2.0
                            Clock  by  Earls37a  http://www.flickr.com/photos/indraw/4857101224/  CC  BY-­SA  2.0
                            Sink.  by  _Fidelio_  http://www.flickr.com/photos/photogaby/4129740673/  CC  BY  2.0
                              Huge Queue 1  by  danacea  http://www.flickr.com/photos/danacea/2981199996/  CC  BY-­NC  2.0
                            Service as a Strategy Celebration at NCVS 2011  by  Be  The  Change,  Inc  http://www.flickr.com/photos/bethechangeinc/5816393052/  CC  BY-­NC  2.0
                            Cash  by  ROSS  HONG  KONG  http://www.flickr.com/photos/rossap/2716531616/  CC  BY-­NC-­SA  2.0
                            Injection  by  Dr  Case  http://www.flickr.com/photos/justin_case/3252846177/  CC  BY-­NC  2.0
                            IMG_1478  by  akshaydavis  http://www.flickr.com/photos/akshaydavis/166391476/  CC  BY-­NC-­SA  2.0
                            Rainforest  by  Chris.Gray  http://www.flickr.com/photos/chriscgray/3946304802/  CC  BY-­NC-­SA  2.0
                            Community  by  niallkennedy  http://www.flickr.com/photos/niallkennedy/40727794/  CC  BY-­NC  2.0

More Related Content

What's hot

Crank Up Your Apps With TorqueBox
Crank Up Your Apps With TorqueBoxCrank Up Your Apps With TorqueBox
Crank Up Your Apps With TorqueBoxJim Crossley
 
When Ruby Meets Java - The Power of Torquebox
When Ruby Meets Java - The Power of TorqueboxWhen Ruby Meets Java - The Power of Torquebox
When Ruby Meets Java - The Power of Torqueboxrockyjaiswal
 
DataMapper on Infinispan
DataMapper on InfinispanDataMapper on Infinispan
DataMapper on InfinispanLance Ball
 
TorqueBox - When Java meets Ruby
TorqueBox - When Java meets RubyTorqueBox - When Java meets Ruby
TorqueBox - When Java meets RubyBruno Oliveira
 
Spring into rails
Spring into railsSpring into rails
Spring into railsHiro Asari
 
Introducing Immutant
Introducing Immutant Introducing Immutant
Introducing Immutant Jim Crossley
 
Torquebox Asheville.rb April 2011
Torquebox Asheville.rb April 2011Torquebox Asheville.rb April 2011
Torquebox Asheville.rb April 2011Lance Ball
 
Apache Camel Introduction & What's in the box
Apache Camel Introduction & What's in the boxApache Camel Introduction & What's in the box
Apache Camel Introduction & What's in the boxClaus Ibsen
 
TorqueBox - Ruby Hoedown 2011
TorqueBox - Ruby Hoedown 2011TorqueBox - Ruby Hoedown 2011
TorqueBox - Ruby Hoedown 2011Lance Ball
 
Torquebox - O melhor dos dois mundos
Torquebox - O melhor dos dois mundosTorquebox - O melhor dos dois mundos
Torquebox - O melhor dos dois mundosBruno Oliveira
 
Apache Camel - FUSE community day London 2010 presentation
Apache Camel - FUSE community day London 2010 presentationApache Camel - FUSE community day London 2010 presentation
Apache Camel - FUSE community day London 2010 presentationClaus Ibsen
 
Introduction to Apache Camel
Introduction to Apache CamelIntroduction to Apache Camel
Introduction to Apache CamelClaus Ibsen
 
Taking Apache Camel For A Ride
Taking Apache Camel For A RideTaking Apache Camel For A Ride
Taking Apache Camel For A RideBruce Snyder
 
Introduction to Apache Camel
Introduction to Apache CamelIntroduction to Apache Camel
Introduction to Apache CamelFuseSource.com
 

What's hot (20)

Crank Up Your Apps With TorqueBox
Crank Up Your Apps With TorqueBoxCrank Up Your Apps With TorqueBox
Crank Up Your Apps With TorqueBox
 
Immutant
ImmutantImmutant
Immutant
 
When Ruby Meets Java - The Power of Torquebox
When Ruby Meets Java - The Power of TorqueboxWhen Ruby Meets Java - The Power of Torquebox
When Ruby Meets Java - The Power of Torquebox
 
DataMapper on Infinispan
DataMapper on InfinispanDataMapper on Infinispan
DataMapper on Infinispan
 
JRuby and You
JRuby and YouJRuby and You
JRuby and You
 
TorqueBox - When Java meets Ruby
TorqueBox - When Java meets RubyTorqueBox - When Java meets Ruby
TorqueBox - When Java meets Ruby
 
Spring into rails
Spring into railsSpring into rails
Spring into rails
 
Introducing Immutant
Introducing Immutant Introducing Immutant
Introducing Immutant
 
Torquebox Asheville.rb April 2011
Torquebox Asheville.rb April 2011Torquebox Asheville.rb April 2011
Torquebox Asheville.rb April 2011
 
Apache Camel Introduction & What's in the box
Apache Camel Introduction & What's in the boxApache Camel Introduction & What's in the box
Apache Camel Introduction & What's in the box
 
TorqueBox - Ruby Hoedown 2011
TorqueBox - Ruby Hoedown 2011TorqueBox - Ruby Hoedown 2011
TorqueBox - Ruby Hoedown 2011
 
Torquebox - O melhor dos dois mundos
Torquebox - O melhor dos dois mundosTorquebox - O melhor dos dois mundos
Torquebox - O melhor dos dois mundos
 
Apache Camel - FUSE community day London 2010 presentation
Apache Camel - FUSE community day London 2010 presentationApache Camel - FUSE community day London 2010 presentation
Apache Camel - FUSE community day London 2010 presentation
 
Intro to PSGI and Plack
Intro to PSGI and PlackIntro to PSGI and Plack
Intro to PSGI and Plack
 
First Day With J Ruby
First Day With J RubyFirst Day With J Ruby
First Day With J Ruby
 
Introduction to Apache Camel
Introduction to Apache CamelIntroduction to Apache Camel
Introduction to Apache Camel
 
Taking Apache Camel For A Ride
Taking Apache Camel For A RideTaking Apache Camel For A Ride
Taking Apache Camel For A Ride
 
Introduction to Apache Camel
Introduction to Apache CamelIntroduction to Apache Camel
Introduction to Apache Camel
 
How DSL works on Ruby
How DSL works on RubyHow DSL works on Ruby
How DSL works on Ruby
 
Perl in Teh Cloud
Perl in Teh CloudPerl in Teh Cloud
Perl in Teh Cloud
 

Similar to Torquebox OSCON Java 2011

JUDCon 2010 Boston : TorqueBox
JUDCon 2010 Boston : TorqueBoxJUDCon 2010 Boston : TorqueBox
JUDCon 2010 Boston : TorqueBoxmarekgoldmann
 
Ruby on Rails survival guide of an aged Java developer
Ruby on Rails survival guide of an aged Java developerRuby on Rails survival guide of an aged Java developer
Ruby on Rails survival guide of an aged Java developergicappa
 
Node.js: CAMTA Presentation
Node.js: CAMTA PresentationNode.js: CAMTA Presentation
Node.js: CAMTA PresentationRob Tweed
 
JRuby + Rails = Awesome Java Web Framework at Jfokus 2011
JRuby + Rails = Awesome Java Web Framework at Jfokus 2011JRuby + Rails = Awesome Java Web Framework at Jfokus 2011
JRuby + Rails = Awesome Java Web Framework at Jfokus 2011Nick Sieger
 
Reactive Web-Applications @ LambdaDays
Reactive Web-Applications @ LambdaDaysReactive Web-Applications @ LambdaDays
Reactive Web-Applications @ LambdaDaysManuel Bernhardt
 
Crossing the Bridge: Connecting Rails and your Front-end Framework
Crossing the Bridge: Connecting Rails and your Front-end FrameworkCrossing the Bridge: Connecting Rails and your Front-end Framework
Crossing the Bridge: Connecting Rails and your Front-end FrameworkDaniel Spector
 
Why scala is not my ideal language and what I can do with this
Why scala is not my ideal language and what I can do with thisWhy scala is not my ideal language and what I can do with this
Why scala is not my ideal language and what I can do with thisRuslan Shevchenko
 
Why I Love TorqueBox (And Why You Will Too)
Why I Love TorqueBox (And Why You Will Too)Why I Love TorqueBox (And Why You Will Too)
Why I Love TorqueBox (And Why You Will Too)benbrowning
 
Building web framework with Rack
Building web framework with RackBuilding web framework with Rack
Building web framework with Racksickill
 
Toolbox of a Ruby Team
Toolbox of a Ruby TeamToolbox of a Ruby Team
Toolbox of a Ruby TeamArto Artnik
 
Writing Redis in Python with asyncio
Writing Redis in Python with asyncioWriting Redis in Python with asyncio
Writing Redis in Python with asyncioJames Saryerwinnie
 
Socket applications
Socket applicationsSocket applications
Socket applicationsJoão Moura
 
Rails Presentation (Anton Dmitriyev)
Rails Presentation (Anton Dmitriyev)Rails Presentation (Anton Dmitriyev)
Rails Presentation (Anton Dmitriyev)True-Vision
 
Connecting the Worlds of Java and Ruby with JRuby
Connecting the Worlds of Java and Ruby with JRubyConnecting the Worlds of Java and Ruby with JRuby
Connecting the Worlds of Java and Ruby with JRubyNick Sieger
 

Similar to Torquebox OSCON Java 2011 (20)

JUDCon 2010 Boston : TorqueBox
JUDCon 2010 Boston : TorqueBoxJUDCon 2010 Boston : TorqueBox
JUDCon 2010 Boston : TorqueBox
 
Ruby on Rails survival guide of an aged Java developer
Ruby on Rails survival guide of an aged Java developerRuby on Rails survival guide of an aged Java developer
Ruby on Rails survival guide of an aged Java developer
 
Speedy TDD with Rails
Speedy TDD with RailsSpeedy TDD with Rails
Speedy TDD with Rails
 
Wider than rails
Wider than railsWider than rails
Wider than rails
 
Play framework
Play frameworkPlay framework
Play framework
 
Node.js: CAMTA Presentation
Node.js: CAMTA PresentationNode.js: CAMTA Presentation
Node.js: CAMTA Presentation
 
JRuby + Rails = Awesome Java Web Framework at Jfokus 2011
JRuby + Rails = Awesome Java Web Framework at Jfokus 2011JRuby + Rails = Awesome Java Web Framework at Jfokus 2011
JRuby + Rails = Awesome Java Web Framework at Jfokus 2011
 
Reactive Web-Applications @ LambdaDays
Reactive Web-Applications @ LambdaDaysReactive Web-Applications @ LambdaDays
Reactive Web-Applications @ LambdaDays
 
Crossing the Bridge: Connecting Rails and your Front-end Framework
Crossing the Bridge: Connecting Rails and your Front-end FrameworkCrossing the Bridge: Connecting Rails and your Front-end Framework
Crossing the Bridge: Connecting Rails and your Front-end Framework
 
Why scala is not my ideal language and what I can do with this
Why scala is not my ideal language and what I can do with thisWhy scala is not my ideal language and what I can do with this
Why scala is not my ideal language and what I can do with this
 
Why I Love TorqueBox (And Why You Will Too)
Why I Love TorqueBox (And Why You Will Too)Why I Love TorqueBox (And Why You Will Too)
Why I Love TorqueBox (And Why You Will Too)
 
Intro to Rack
Intro to RackIntro to Rack
Intro to Rack
 
Building web framework with Rack
Building web framework with RackBuilding web framework with Rack
Building web framework with Rack
 
Toolbox of a Ruby Team
Toolbox of a Ruby TeamToolbox of a Ruby Team
Toolbox of a Ruby Team
 
Writing Redis in Python with asyncio
Writing Redis in Python with asyncioWriting Redis in Python with asyncio
Writing Redis in Python with asyncio
 
London HUG 12/4
London HUG 12/4London HUG 12/4
London HUG 12/4
 
Rack
RackRack
Rack
 
Socket applications
Socket applicationsSocket applications
Socket applications
 
Rails Presentation (Anton Dmitriyev)
Rails Presentation (Anton Dmitriyev)Rails Presentation (Anton Dmitriyev)
Rails Presentation (Anton Dmitriyev)
 
Connecting the Worlds of Java and Ruby with JRuby
Connecting the Worlds of Java and Ruby with JRubyConnecting the Worlds of Java and Ruby with JRuby
Connecting the Worlds of Java and Ruby with JRuby
 

Recently uploaded

Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...apidays
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...apidays
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoffsammart93
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyKhushali Kathiriya
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherRemote DBA Services
 
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfOrbitshub
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingEdi Saputra
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...apidays
 
Platformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityPlatformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityWSO2
 
Vector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptxVector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptxRemote DBA Services
 
Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)Zilliz
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businesspanagenda
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...apidays
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Orbitshub
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Victor Rentea
 
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Angeliki Cooney
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...apidays
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024The Digital Insurer
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontologyjohnbeverley2021
 

Recently uploaded (20)

Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
Platformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityPlatformless Horizons for Digital Adaptability
Platformless Horizons for Digital Adaptability
 
Vector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptxVector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptx
 
Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
 
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontology
 

Torquebox OSCON Java 2011