SlideShare a Scribd company logo
TorqueBox
Mixing Java and Ruby all willy-nilly
           Bob McWhirter
            JBoss Fellow
TorqueBox
Mixing Java and Ruby all willy-nilly
           Bob McWhirter
            JBoss Fellow
Who is Bob?
• JBoss Fellow
• Chief Architect of Middleware Cloud
  Computing
• Founder of...
  • The Codehaus
  • Drools
  • TorqueBox
Basic Premise

• You can run Ruby in the JVM
 • Compliant
 • Fast
• You can wire existing enterprise Java
  features into Ruby
Why?


• Ruby has a lot of varied point solutions.
• Traditionally web-centric frameworks.
• Performance issues.
What exactly is
 TorqueBox?
TorqueBox
JBoss AS6   Deployers
                        JRuby
JBoss AS6++


Just as good as regular JBoss AS6,
plus the goodness of a Ruby platform.
Ruby Platform

• Ruby Rack (1.1.0)
• JNDI
• JMS (HornetQ)
• Quartz
• VFS
Rack for Web


All Rack applications are supported.

Rails, Sinatra, bare Rack apps.
Rack for Web

Applications can be deployed from
where-ever they sit on disk.

No bundling/jarring is required.
Rack for Web

Using Rack reloading extensions, or Rails’
own development mode, applications can
be modified while running.

Without redeploying.
Deploying Rails apps
$JBOSS_HOME/server/default/deploy/myapp-rails.yml



 ---
 application:
   RAILS_ROOT: /Users/bob/applications/my_app
   RAILS_ENV: development
 web:
   context: /
(But you can bundle)



jar cvf myapp.rails -C myapp/ .
Everything else


Due to lack of specs/standards, we’ve
invented our own APIs for bindings to
JNDI, JMS, Quartz, etc.
Messaging
queues.yml

/queues/foo:
  durable: true

/queues/bar:
  durable: false
Messaging
messaging.tq


subscribe MyConsumer,
          '/queues/foo', :filter=>'...',
          :config=>{
            :answer=>42
          }
In a Rails app...

app/                              deploy/
    processors/                       queues.yml
        my_consumer.rb                topics.yml
config/
    messaging.tq         Either
    queues.yml
    topics.yml
MyConsumer
my_consumer.rb

class MyConsumer < TorqueBox::Message::MessageProcessor

  def on_message(body)
    puts "Processing #{body}”
  end

end
MyConsumer #2
my_consumer.rb

class MyConsumer

  def process!(jms_message)
    puts "Processing #{jms_message.body}”
  end

end
MyConsumer #3
my_consumer.rb

class MyConsumer < TorqueBox::Message::MessageProcessor

  def on_message(body)
    puts "Processing #{body} of #{message}”
  end

end
A client
my_client.rb
#!/usr/bin/env jruby

require 'torquebox/messaging/client'

TorqueBox::Messaging::Client.connect( true, :auto,
                                      'localhost' ) do |session|
  queue    = session.createQueue( '/queues/foo' )
  producer = session.createProducer( queue )
  message = session.createTextMessage( "hello #{Time.now}" )
  producer.send( message )
  session.commit
 end
A client
my_client.rb
#!/usr/bin/env jruby

require 'torquebox/messaging/client'

TorqueBox::Messaging::Client.connect( true, :auto,
                                      'localhost' ) do |session|
  queue    = session.createQueue( '/queues/foo' )
  producer = session.createProducer( queue )
  message = session.createTextMessage( "hello #{Time.now}" )
  producer.send( message )
  session.commit
 end
A client
my_client.rb
#!/usr/bin/env jruby

require 'torquebox/messaging/client'

TorqueBox::Messaging::Client.connect( true, :auto,
                                      'localhost' ) do |session|
  queue    = session.createQueue( '/queues/foo' )
  producer = session.createProducer( queue )
  message = session.createTextMessage( "hello #{Time.now}" )
  producer.send( message )
  session.commit
 end
A client
my_client.rb
#!/usr/bin/env jruby

require 'torquebox/messaging/client'

TorqueBox::Messaging::Client.connect( true, :auto,
                                      'localhost' ) do |session|
  queue    = session.createQueue( '/queues/foo' )
  producer = session.createProducer( queue )
  message = session.createTextMessage( "hello #{Time.now}" )
  producer.send( message )
  session.commit
 end
A client
my_client.rb
#!/usr/bin/env jruby

require 'torquebox/messaging/client'

TorqueBox::Messaging::Client.connect( true, :auto,
                                      'localhost' ) do |session|
  queue    = session.createQueue( '/queues/foo' )
  producer = session.createProducer( queue )
  message = session.createTextMessage( "hello #{Time.now}" )
  producer.send( message )
  session.commit
 end
What if I just want a farm
of processors, not lots of
    full AS instances?
TorqueBox
JBossMC + VDF   Deployers
                            JRuby
Messaging outside of AS

trq-message-broker
 • Ruby API for firing up HornetQ

trq-message-processor-host
 • Container for processors.
trq-message-broker


$ trq-message-broker -s 
    --deploy queues.yml
trq-message-processor-host


$ trq-message-processor-host 
    -N naming.foocorp.com 
    --deploy messaging.tq
What’s going on?
JBossMC and Ruby

•Andrew Lee Rubinger’s
 bootstrap-vdf-minimal
•Large-grained “enablers”
•All from Ruby
Foundation


require 'torquebox/container/foundation'

container = TorqueBox::Container::Foundation.new

container.start
Foundation jboss-beans
<deployment xmlns="urn:jboss:bean-deployer:2.0">


  <bean name="Ruby" class="org.jruby.Ruby">
    <constructor factoryClass="org.jruby.Ruby" factoryMethod="getGlobalRuntime"/>
  </bean>

  <bean name="JRubyClassLoader">
    <constructor factoryMethod="getJRubyClassLoader">
      <factory bean="Ruby"/>
    </constructor>
  </bean>

  <bean name="RubyRuntimeFactory" class="org.torquebox.interp.core.SingletonRubyRuntimeFactory">
    <property name="ruby">
      <inject bean="Ruby"/>
    </property>
  </bean>

  <bean name="RuntimePoolDeployer" class="org.torquebox.interp.deployers.RuntimePoolDeployer"/>

</deployment>
Foundation jboss-beans
<deployment xmlns="urn:jboss:bean-deployer:2.0">


  <bean name="Ruby" class="org.jruby.Ruby">
    <constructor factoryClass="org.jruby.Ruby" factoryMethod="getGlobalRuntime"/>
  </bean>

  <bean name="JRubyClassLoader">
    <constructor factoryMethod="getJRubyClassLoader">
      <factory bean="Ruby"/>
    </constructor>
  </bean>

  <bean name="RubyRuntimeFactory" class="org.torquebox.interp.core.SingletonRubyRuntimeFactory">
    <property name="ruby">
      <inject bean="Ruby"/>
    </property>
  </bean>

  <bean name="RuntimePoolDeployer" class="org.torquebox.interp.deployers.RuntimePoolDeployer"/>

</deployment>
Foundation jboss-beans
<deployment xmlns="urn:jboss:bean-deployer:2.0">


  <bean name="Ruby" class="org.jruby.Ruby">
    <constructor factoryClass="org.jruby.Ruby" factoryMethod="getGlobalRuntime"/>
  </bean>

  <bean name="JRubyClassLoader">
    <constructor factoryMethod="getJRubyClassLoader">
      <factory bean="Ruby"/>
    </constructor>
  </bean>

  <bean name="RubyRuntimeFactory" class="org.torquebox.interp.core.SingletonRubyRuntimeFactory">
    <property name="ruby">
      <inject bean="Ruby"/>
    </property>
  </bean>

  <bean name="RuntimePoolDeployer" class="org.torquebox.interp.deployers.RuntimePoolDeployer"/>

</deployment>
Foundation jboss-beans
<deployment xmlns="urn:jboss:bean-deployer:2.0">


  <bean name="Ruby" class="org.jruby.Ruby">
    <constructor factoryClass="org.jruby.Ruby" factoryMethod="getGlobalRuntime"/>
  </bean>

  <bean name="JRubyClassLoader">
    <constructor factoryMethod="getJRubyClassLoader">
      <factory bean="Ruby"/>
    </constructor>
  </bean>

  <bean name="RubyRuntimeFactory" class="org.torquebox.interp.core.SingletonRubyRuntimeFactory">
    <property name="ruby">
      <inject bean="Ruby"/>
    </property>
  </bean>

  <bean name="RuntimePoolDeployer" class="org.torquebox.interp.deployers.RuntimePoolDeployer"/>

</deployment>
Message-Processor Host

require 'torquebox/container/foundation'

container = TorqueBox::Container::Foundation.new

container.enable( TorqueBox::Messaging::MessageProcessorHost )

container.start
MPH jboss-beans.xml

<deployment xmlns="urn:jboss:bean-deployer:2.0">

  <classloader><inject bean="JRubyClassLoader"/></classloader>

  <bean name="MessageProcessorDeployer"
        class="org.torquebox.messaging.deployers.MessageProcessorDeployer"/>

  <bean name="MessagingRuntimePoolDeployer"
        class="org.torquebox.messaging.deployers.MessagingRuntimePoolDeployer">
    <property name="instanceFactoryName">RubyRuntimeFactory</property>
  </bean>

</deployment>
MPH jboss-beans.xml

<deployment xmlns="urn:jboss:bean-deployer:2.0">

  <classloader><inject bean="JRubyClassLoader"/></classloader>

  <bean name="MessageProcessorDeployer"
        class="org.torquebox.messaging.deployers.MessageProcessorDeployer"/>

  <bean name="MessagingRuntimePoolDeployer"
        class="org.torquebox.messaging.deployers.MessagingRuntimePoolDeployer">
    <property name="instanceFactoryName">RubyRuntimeFactory</property>
  </bean>

</deployment>
MPH jboss-beans.xml

<deployment xmlns="urn:jboss:bean-deployer:2.0">

  <classloader><inject bean="JRubyClassLoader"/></classloader>

  <bean name="MessageProcessorDeployer"
        class="org.torquebox.messaging.deployers.MessageProcessorDeployer"/>

  <bean name="MessagingRuntimePoolDeployer"
        class="org.torquebox.messaging.deployers.MessagingRuntimePoolDeployer">
    <property name="instanceFactoryName">RubyRuntimeFactory</property>
  </bean>

</deployment>
Pathway
             MyConsumer (rb)




                               Ruby



RubyMessageListener (Java)
           JMS



                  RubyRuntimePool
Naming



A lot of things require JNDI.
Naming


In addition to enabling components,
configuration can be included.
Local Naming


container.enable( TorqueBox::Naming::NamingService ) do |config|
    config.export = false
end
Local Naming

<deployment xmlns="urn:jboss:bean-deployer:2.0">

  <bean name="LookupExecutor" class="java.util.concurrent.ThreadPoolExecutor">
    <constructor factoryMethod="newFixedThreadPool"
                 factoryClass="java.util.concurrent.Executors">
      <parameter>2</parameter>
    </constructor>
    <stop method="shutdown"/>
  </bean>

  <bean name="Naming" class="org.jnp.server.NamingBeanImpl"/>

</deployment>
Exported Naming


container.enable( TorqueBox::Naming::NamingService ) do |config|
    config.host = "my-other-host.foocorp.com"
    config.port = 10990
end
Exported Naming
<deployment xmlns="urn:jboss:bean-deployer:2.0">

  <bean name="JNDIServer" class="org.jnp.server.Main">
    <property name="namingInfo">
      <inject bean="Naming"/>
    </property>
    <property name="port">${jnp.port:1099}</property>
    <property name="bindAddress">${jnp.host:localhost}</property>
    <property name="rmiPort">${jnp.rmiPort:1098}</property>
    <property name="rmiBindAddress">${jnp.host:localhost}</property>
    <property name="lookupExector">
      <inject bean="LookupExecutor"/>
    </property>
  </bean>

</deployment>
Exported Naming
<deployment xmlns="urn:jboss:bean-deployer:2.0">

  <bean name="JNDIServer" class="org.jnp.server.Main">
    <property name="namingInfo">
      <inject bean="Naming"/>
    </property>
    <property name="port">${jnp.port:1099}</property>
    <property name="bindAddress">${jnp.host:localhost}</property>
    <property name="rmiPort">${jnp.rmiPort:1098}</property>
    <property name="rmiBindAddress">${jnp.host:localhost}</property>
    <property name="lookupExector">
      <inject bean="LookupExecutor"/>
    </property>
  </bean>

</deployment>
VDF bootstrap allows for
TorqueBox bits to be used
  in other environments.
Allows us to boot up an
absolute minimal AS,
     in 1 second.
The same code paths as AS.
JBoss VFS
FS v. VFS
Regular FS          VFS
home/              home/
  bob/               bob/
    my.jar   mount     my.jar/
                          WEB-INF/
                            lib/
                  mount       another.jar/
                                 META-INF/
                                   manifest.xml
Why do we like VFS?
Because there’s more
than just the filesystem
The problem with Ruby



__FILE__
   /path/to/this/file.rb
For Instance...



Dir[ "#{File.dirname(__FILE__)}/*.xml" ]
__FILE__



vfs:/path/to/the/current/file.rb
Making Ruby VFS-aware

Kernel
  open( "vfs:/path/to/some.jar/some/content.txt" )

Dir
  Dir[ "vfs:/path/to/some.jar/some/*.txt" ]

File
  File.exist?( "vfs:/path/to/some.jar/some/content.txt" )
  File.read( "vfs:/path/to/some.jar/some/content.txt" )
Now Ruby doesn’t care that
your filesystem is actually VFS.
Bundles


We want Ruby to be happy with
VFS for when you deploy bundles
and hope to farm.
But not warbling



Warbler builds a “normal” JavaEE .war.
So, why bother?
Threading


Unlike C-Ruby, supports
real threading.
Management



RHQ/JON, stuff you're used to.
Integration


HornetQ, Quartz, etc, already
available to your apps.
Gotchas
Native gems


Native gems are not supported,
except FFI.
Threading


While TorqueBox gives you
real threads, many existing
Ruby libraries suck.
Thanks!
Q&A
Resources
http://github.com/torquebox/   # Code
http://torquebox.org/          # Project


#torquebox                     # IRC


@torquebox                     # Twitter
@bobmcwhirter

More Related Content

What's hot

TorqueBox - Ultrapassando a fronteira entre Java e Ruby
TorqueBox - Ultrapassando a fronteira entre Java e RubyTorqueBox - Ultrapassando a fronteira entre Java e Ruby
TorqueBox - Ultrapassando a fronteira entre Java e Ruby
Bruno Oliveira
 
201904 websocket
201904 websocket201904 websocket
201904 websocket
월간 IT 슬라이드
 
DataMapper on Infinispan
DataMapper on InfinispanDataMapper on Infinispan
DataMapper on Infinispan
Lance Ball
 
The Enterprise Strikes Back
The Enterprise Strikes BackThe Enterprise Strikes Back
The Enterprise Strikes Back
Burke Libbey
 
Torquebox - O melhor dos dois mundos
Torquebox - O melhor dos dois mundosTorquebox - O melhor dos dois mundos
Torquebox - O melhor dos dois mundos
Bruno Oliveira
 
Java/Spring과 Node.js의공존
Java/Spring과 Node.js의공존Java/Spring과 Node.js의공존
Java/Spring과 Node.js의공존
동수 장
 
First Day With J Ruby
First Day With J RubyFirst Day With J Ruby
First Day With J Ruby
Praveen Kumar Sinha
 
Netty - anfix tech&beers
Netty - anfix tech&beersNetty - anfix tech&beers
Netty - anfix tech&beers
jorgecarabias
 
Java/Spring과 Node.js의 공존 시즌2
Java/Spring과 Node.js의 공존 시즌2Java/Spring과 Node.js의 공존 시즌2
Java/Spring과 Node.js의 공존 시즌2
동수 장
 
TorqueBox - Ruby Hoedown 2011
TorqueBox - Ruby Hoedown 2011TorqueBox - Ruby Hoedown 2011
TorqueBox - Ruby Hoedown 2011
Lance Ball
 
Torquebox OSCON Java 2011
Torquebox OSCON Java 2011Torquebox OSCON Java 2011
Torquebox OSCON Java 2011
tobiascrawley
 
vert.x 소개 및 개발 실습
vert.x 소개 및 개발 실습vert.x 소개 및 개발 실습
vert.x 소개 및 개발 실습
John Kim
 
Torquebox @ Raleigh.rb - April 2011
Torquebox @ Raleigh.rb - April 2011Torquebox @ Raleigh.rb - April 2011
Torquebox @ Raleigh.rb - April 2011
tobiascrawley
 
Sinatra for REST services
Sinatra for REST servicesSinatra for REST services
Sinatra for REST services
Emanuele DelBono
 
Can puppet help you run docker on a T2.Micro?
Can puppet help you run docker on a T2.Micro?Can puppet help you run docker on a T2.Micro?
Can puppet help you run docker on a T2.Micro?
Neil Millard
 
Ruby 1.9 Fibers
Ruby 1.9 FibersRuby 1.9 Fibers
Ruby 1.9 Fibers
Kevin Ball
 
Jruby synergy-of-ruby-and-java
Jruby synergy-of-ruby-and-javaJruby synergy-of-ruby-and-java
Jruby synergy-of-ruby-and-java
Keith Bennett
 
Ruby 2.4 Internals
Ruby 2.4 InternalsRuby 2.4 Internals
Ruby 2.4 Internals
Koichi Sasada
 
Lightweight Webservices with Sinatra and RestClient
Lightweight Webservices with Sinatra and RestClientLightweight Webservices with Sinatra and RestClient
Lightweight Webservices with Sinatra and RestClient
Adam Wiggins
 
Scaling Ruby with Evented I/O - Ruby underground
Scaling Ruby with Evented I/O - Ruby undergroundScaling Ruby with Evented I/O - Ruby underground
Scaling Ruby with Evented I/O - Ruby underground
Omer Gazit
 

What's hot (20)

TorqueBox - Ultrapassando a fronteira entre Java e Ruby
TorqueBox - Ultrapassando a fronteira entre Java e RubyTorqueBox - Ultrapassando a fronteira entre Java e Ruby
TorqueBox - Ultrapassando a fronteira entre Java e Ruby
 
201904 websocket
201904 websocket201904 websocket
201904 websocket
 
DataMapper on Infinispan
DataMapper on InfinispanDataMapper on Infinispan
DataMapper on Infinispan
 
The Enterprise Strikes Back
The Enterprise Strikes BackThe Enterprise Strikes Back
The Enterprise Strikes Back
 
Torquebox - O melhor dos dois mundos
Torquebox - O melhor dos dois mundosTorquebox - O melhor dos dois mundos
Torquebox - O melhor dos dois mundos
 
Java/Spring과 Node.js의공존
Java/Spring과 Node.js의공존Java/Spring과 Node.js의공존
Java/Spring과 Node.js의공존
 
First Day With J Ruby
First Day With J RubyFirst Day With J Ruby
First Day With J Ruby
 
Netty - anfix tech&beers
Netty - anfix tech&beersNetty - anfix tech&beers
Netty - anfix tech&beers
 
Java/Spring과 Node.js의 공존 시즌2
Java/Spring과 Node.js의 공존 시즌2Java/Spring과 Node.js의 공존 시즌2
Java/Spring과 Node.js의 공존 시즌2
 
TorqueBox - Ruby Hoedown 2011
TorqueBox - Ruby Hoedown 2011TorqueBox - Ruby Hoedown 2011
TorqueBox - Ruby Hoedown 2011
 
Torquebox OSCON Java 2011
Torquebox OSCON Java 2011Torquebox OSCON Java 2011
Torquebox OSCON Java 2011
 
vert.x 소개 및 개발 실습
vert.x 소개 및 개발 실습vert.x 소개 및 개발 실습
vert.x 소개 및 개발 실습
 
Torquebox @ Raleigh.rb - April 2011
Torquebox @ Raleigh.rb - April 2011Torquebox @ Raleigh.rb - April 2011
Torquebox @ Raleigh.rb - April 2011
 
Sinatra for REST services
Sinatra for REST servicesSinatra for REST services
Sinatra for REST services
 
Can puppet help you run docker on a T2.Micro?
Can puppet help you run docker on a T2.Micro?Can puppet help you run docker on a T2.Micro?
Can puppet help you run docker on a T2.Micro?
 
Ruby 1.9 Fibers
Ruby 1.9 FibersRuby 1.9 Fibers
Ruby 1.9 Fibers
 
Jruby synergy-of-ruby-and-java
Jruby synergy-of-ruby-and-javaJruby synergy-of-ruby-and-java
Jruby synergy-of-ruby-and-java
 
Ruby 2.4 Internals
Ruby 2.4 InternalsRuby 2.4 Internals
Ruby 2.4 Internals
 
Lightweight Webservices with Sinatra and RestClient
Lightweight Webservices with Sinatra and RestClientLightweight Webservices with Sinatra and RestClient
Lightweight Webservices with Sinatra and RestClient
 
Scaling Ruby with Evented I/O - Ruby underground
Scaling Ruby with Evented I/O - Ruby undergroundScaling Ruby with Evented I/O - Ruby underground
Scaling Ruby with Evented I/O - Ruby underground
 

Viewers also liked

TorqueBox - moc Javy, piękno Rubiego
TorqueBox - moc Javy, piękno RubiegoTorqueBox - moc Javy, piękno Rubiego
TorqueBox - moc Javy, piękno Rubiegomarekgoldmann
 
Silesia JUG : Java Message Service
Silesia JUG : Java Message ServiceSilesia JUG : Java Message Service
Silesia JUG : Java Message Service
marekgoldmann
 
TorqueBox - Ruby na sterydach
TorqueBox - Ruby na sterydachTorqueBox - Ruby na sterydach
TorqueBox - Ruby na sterydachmarekgoldmann
 
Java Night 2010 SteamCannon
Java Night 2010 SteamCannonJava Night 2010 SteamCannon
Java Night 2010 SteamCannon
marekgoldmann
 
BoxGrinder – FUDCon 2011 Tempe
BoxGrinder – FUDCon 2011 TempeBoxGrinder – FUDCon 2011 Tempe
BoxGrinder – FUDCon 2011 Tempe
marekgoldmann
 
BoxGrinder – FOSDEM 2012
BoxGrinder – FOSDEM 2012BoxGrinder – FOSDEM 2012
BoxGrinder – FOSDEM 2012
marekgoldmann
 
13 14 SAP policy - revised for spring 2014 - final - 111413
13 14 SAP policy - revised for spring 2014 - final  - 11141313 14 SAP policy - revised for spring 2014 - final  - 111413
13 14 SAP policy - revised for spring 2014 - final - 111413
Houston Community College
 
Tutorial caesars II
Tutorial caesars IITutorial caesars II
Tutorial caesars II
manuedlf
 

Viewers also liked (8)

TorqueBox - moc Javy, piękno Rubiego
TorqueBox - moc Javy, piękno RubiegoTorqueBox - moc Javy, piękno Rubiego
TorqueBox - moc Javy, piękno Rubiego
 
Silesia JUG : Java Message Service
Silesia JUG : Java Message ServiceSilesia JUG : Java Message Service
Silesia JUG : Java Message Service
 
TorqueBox - Ruby na sterydach
TorqueBox - Ruby na sterydachTorqueBox - Ruby na sterydach
TorqueBox - Ruby na sterydach
 
Java Night 2010 SteamCannon
Java Night 2010 SteamCannonJava Night 2010 SteamCannon
Java Night 2010 SteamCannon
 
BoxGrinder – FUDCon 2011 Tempe
BoxGrinder – FUDCon 2011 TempeBoxGrinder – FUDCon 2011 Tempe
BoxGrinder – FUDCon 2011 Tempe
 
BoxGrinder – FOSDEM 2012
BoxGrinder – FOSDEM 2012BoxGrinder – FOSDEM 2012
BoxGrinder – FOSDEM 2012
 
13 14 SAP policy - revised for spring 2014 - final - 111413
13 14 SAP policy - revised for spring 2014 - final  - 11141313 14 SAP policy - revised for spring 2014 - final  - 111413
13 14 SAP policy - revised for spring 2014 - final - 111413
 
Tutorial caesars II
Tutorial caesars IITutorial caesars II
Tutorial caesars II
 

Similar to JUDCon 2010 Boston : TorqueBox

Rails Engine | Modular application
Rails Engine | Modular applicationRails Engine | Modular application
Rails Engine | Modular application
mirrec
 
Building web framework with Rack
Building web framework with RackBuilding web framework with Rack
Building web framework with Rack
sickill
 
Intro To Node.js
Intro To Node.jsIntro To Node.js
Intro To Node.js
Chris Cowan
 
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
gicappa
 
Writing robust Node.js applications
Writing robust Node.js applicationsWriting robust Node.js applications
Writing robust Node.js applications
Tom Croucher
 
Rails web api 开发
Rails web api 开发Rails web api 开发
Rails web api 开发
shaokun
 
Cooking with Chef
Cooking with ChefCooking with Chef
Cooking with Chef
Ken Robertson
 
Rack
RackRack
Intro to Node
Intro to NodeIntro to Node
Intro to Node
Aaron Stannard
 
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
Nick Sieger
 
infra-as-code
infra-as-codeinfra-as-code
infra-as-code
Itamar Hassin
 
TorqueBox at GNUnify 2012
TorqueBox at GNUnify 2012TorqueBox at GNUnify 2012
TorqueBox at GNUnify 2012
Saleem Ansari
 
Rails Presentation (Anton Dmitriyev)
Rails Presentation (Anton Dmitriyev)Rails Presentation (Anton Dmitriyev)
Rails Presentation (Anton Dmitriyev)
True-Vision
 
Intro to node and mongodb 1
Intro to node and mongodb   1Intro to node and mongodb   1
Intro to node and mongodb 1
Mohammad Qureshi
 
Play framework
Play frameworkPlay framework
Play framework
Andrew Skiba
 
Clojure and the Web
Clojure and the WebClojure and the Web
Clojure and the Web
nickmbailey
 
Intro to Rack
Intro to RackIntro to Rack
Intro to Rack
Rubyc Slides
 
Continuous Delivery with Maven, Puppet and Tomcat - ApacheCon NA 2013
Continuous Delivery with Maven, Puppet and Tomcat - ApacheCon NA 2013Continuous Delivery with Maven, Puppet and Tomcat - ApacheCon NA 2013
Continuous Delivery with Maven, Puppet and Tomcat - ApacheCon NA 2013
Carlos Sanchez
 
Node.js: The What, The How and The When
Node.js: The What, The How and The WhenNode.js: The What, The How and The When
Node.js: The What, The How and The When
FITC
 
Socket applications
Socket applicationsSocket applications
Socket applications
João Moura
 

Similar to JUDCon 2010 Boston : TorqueBox (20)

Rails Engine | Modular application
Rails Engine | Modular applicationRails Engine | Modular application
Rails Engine | Modular application
 
Building web framework with Rack
Building web framework with RackBuilding web framework with Rack
Building web framework with Rack
 
Intro To Node.js
Intro To Node.jsIntro To Node.js
Intro To Node.js
 
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
 
Writing robust Node.js applications
Writing robust Node.js applicationsWriting robust Node.js applications
Writing robust Node.js applications
 
Rails web api 开发
Rails web api 开发Rails web api 开发
Rails web api 开发
 
Cooking with Chef
Cooking with ChefCooking with Chef
Cooking with Chef
 
Rack
RackRack
Rack
 
Intro to Node
Intro to NodeIntro to Node
Intro to Node
 
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
 
infra-as-code
infra-as-codeinfra-as-code
infra-as-code
 
TorqueBox at GNUnify 2012
TorqueBox at GNUnify 2012TorqueBox at GNUnify 2012
TorqueBox at GNUnify 2012
 
Rails Presentation (Anton Dmitriyev)
Rails Presentation (Anton Dmitriyev)Rails Presentation (Anton Dmitriyev)
Rails Presentation (Anton Dmitriyev)
 
Intro to node and mongodb 1
Intro to node and mongodb   1Intro to node and mongodb   1
Intro to node and mongodb 1
 
Play framework
Play frameworkPlay framework
Play framework
 
Clojure and the Web
Clojure and the WebClojure and the Web
Clojure and the Web
 
Intro to Rack
Intro to RackIntro to Rack
Intro to Rack
 
Continuous Delivery with Maven, Puppet and Tomcat - ApacheCon NA 2013
Continuous Delivery with Maven, Puppet and Tomcat - ApacheCon NA 2013Continuous Delivery with Maven, Puppet and Tomcat - ApacheCon NA 2013
Continuous Delivery with Maven, Puppet and Tomcat - ApacheCon NA 2013
 
Node.js: The What, The How and The When
Node.js: The What, The How and The WhenNode.js: The What, The How and The When
Node.js: The What, The How and The When
 
Socket applications
Socket applicationsSocket applications
Socket applications
 

Recently uploaded

UiPath Test Automation using UiPath Test Suite series, part 6
UiPath Test Automation using UiPath Test Suite series, part 6UiPath Test Automation using UiPath Test Suite series, part 6
UiPath Test Automation using UiPath Test Suite series, part 6
DianaGray10
 
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Albert Hoitingh
 
Climate Impact of Software Testing at Nordic Testing Days
Climate Impact of Software Testing at Nordic Testing DaysClimate Impact of Software Testing at Nordic Testing Days
Climate Impact of Software Testing at Nordic Testing Days
Kari Kakkonen
 
Elizabeth Buie - Older adults: Are we really designing for our future selves?
Elizabeth Buie - Older adults: Are we really designing for our future selves?Elizabeth Buie - Older adults: Are we really designing for our future selves?
Elizabeth Buie - Older adults: Are we really designing for our future selves?
Nexer Digital
 
DevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA ConnectDevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA Connect
Kari Kakkonen
 
20240605 QFM017 Machine Intelligence Reading List May 2024
20240605 QFM017 Machine Intelligence Reading List May 202420240605 QFM017 Machine Intelligence Reading List May 2024
20240605 QFM017 Machine Intelligence Reading List May 2024
Matthew Sinclair
 
GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...
GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...
GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...
Neo4j
 
Enchancing adoption of Open Source Libraries. A case study on Albumentations.AI
Enchancing adoption of Open Source Libraries. A case study on Albumentations.AIEnchancing adoption of Open Source Libraries. A case study on Albumentations.AI
Enchancing adoption of Open Source Libraries. A case study on Albumentations.AI
Vladimir Iglovikov, Ph.D.
 
GraphSummit Singapore | Neo4j Product Vision & Roadmap - Q2 2024
GraphSummit Singapore | Neo4j Product Vision & Roadmap - Q2 2024GraphSummit Singapore | Neo4j Product Vision & Roadmap - Q2 2024
GraphSummit Singapore | Neo4j Product Vision & Roadmap - Q2 2024
Neo4j
 
Communications Mining Series - Zero to Hero - Session 1
Communications Mining Series - Zero to Hero - Session 1Communications Mining Series - Zero to Hero - Session 1
Communications Mining Series - Zero to Hero - Session 1
DianaGray10
 
Video Streaming: Then, Now, and in the Future
Video Streaming: Then, Now, and in the FutureVideo Streaming: Then, Now, and in the Future
Video Streaming: Then, Now, and in the Future
Alpen-Adria-Universität
 
By Design, not by Accident - Agile Venture Bolzano 2024
By Design, not by Accident - Agile Venture Bolzano 2024By Design, not by Accident - Agile Venture Bolzano 2024
By Design, not by Accident - Agile Venture Bolzano 2024
Pierluigi Pugliese
 
Generative AI Deep Dive: Advancing from Proof of Concept to Production
Generative AI Deep Dive: Advancing from Proof of Concept to ProductionGenerative AI Deep Dive: Advancing from Proof of Concept to Production
Generative AI Deep Dive: Advancing from Proof of Concept to Production
Aggregage
 
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdfObservability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Paige Cruz
 
みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...
みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...
みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...
名前 です男
 
20240607 QFM018 Elixir Reading List May 2024
20240607 QFM018 Elixir Reading List May 202420240607 QFM018 Elixir Reading List May 2024
20240607 QFM018 Elixir Reading List May 2024
Matthew Sinclair
 
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
DanBrown980551
 
Monitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR EventsMonitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR Events
Ana-Maria Mihalceanu
 
Pushing the limits of ePRTC: 100ns holdover for 100 days
Pushing the limits of ePRTC: 100ns holdover for 100 daysPushing the limits of ePRTC: 100ns holdover for 100 days
Pushing the limits of ePRTC: 100ns holdover for 100 days
Adtran
 
Introduction to CHERI technology - Cybersecurity
Introduction to CHERI technology - CybersecurityIntroduction to CHERI technology - Cybersecurity
Introduction to CHERI technology - Cybersecurity
mikeeftimakis1
 

Recently uploaded (20)

UiPath Test Automation using UiPath Test Suite series, part 6
UiPath Test Automation using UiPath Test Suite series, part 6UiPath Test Automation using UiPath Test Suite series, part 6
UiPath Test Automation using UiPath Test Suite series, part 6
 
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
 
Climate Impact of Software Testing at Nordic Testing Days
Climate Impact of Software Testing at Nordic Testing DaysClimate Impact of Software Testing at Nordic Testing Days
Climate Impact of Software Testing at Nordic Testing Days
 
Elizabeth Buie - Older adults: Are we really designing for our future selves?
Elizabeth Buie - Older adults: Are we really designing for our future selves?Elizabeth Buie - Older adults: Are we really designing for our future selves?
Elizabeth Buie - Older adults: Are we really designing for our future selves?
 
DevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA ConnectDevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA Connect
 
20240605 QFM017 Machine Intelligence Reading List May 2024
20240605 QFM017 Machine Intelligence Reading List May 202420240605 QFM017 Machine Intelligence Reading List May 2024
20240605 QFM017 Machine Intelligence Reading List May 2024
 
GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...
GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...
GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...
 
Enchancing adoption of Open Source Libraries. A case study on Albumentations.AI
Enchancing adoption of Open Source Libraries. A case study on Albumentations.AIEnchancing adoption of Open Source Libraries. A case study on Albumentations.AI
Enchancing adoption of Open Source Libraries. A case study on Albumentations.AI
 
GraphSummit Singapore | Neo4j Product Vision & Roadmap - Q2 2024
GraphSummit Singapore | Neo4j Product Vision & Roadmap - Q2 2024GraphSummit Singapore | Neo4j Product Vision & Roadmap - Q2 2024
GraphSummit Singapore | Neo4j Product Vision & Roadmap - Q2 2024
 
Communications Mining Series - Zero to Hero - Session 1
Communications Mining Series - Zero to Hero - Session 1Communications Mining Series - Zero to Hero - Session 1
Communications Mining Series - Zero to Hero - Session 1
 
Video Streaming: Then, Now, and in the Future
Video Streaming: Then, Now, and in the FutureVideo Streaming: Then, Now, and in the Future
Video Streaming: Then, Now, and in the Future
 
By Design, not by Accident - Agile Venture Bolzano 2024
By Design, not by Accident - Agile Venture Bolzano 2024By Design, not by Accident - Agile Venture Bolzano 2024
By Design, not by Accident - Agile Venture Bolzano 2024
 
Generative AI Deep Dive: Advancing from Proof of Concept to Production
Generative AI Deep Dive: Advancing from Proof of Concept to ProductionGenerative AI Deep Dive: Advancing from Proof of Concept to Production
Generative AI Deep Dive: Advancing from Proof of Concept to Production
 
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdfObservability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
 
みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...
みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...
みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...
 
20240607 QFM018 Elixir Reading List May 2024
20240607 QFM018 Elixir Reading List May 202420240607 QFM018 Elixir Reading List May 2024
20240607 QFM018 Elixir Reading List May 2024
 
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
 
Monitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR EventsMonitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR Events
 
Pushing the limits of ePRTC: 100ns holdover for 100 days
Pushing the limits of ePRTC: 100ns holdover for 100 daysPushing the limits of ePRTC: 100ns holdover for 100 days
Pushing the limits of ePRTC: 100ns holdover for 100 days
 
Introduction to CHERI technology - Cybersecurity
Introduction to CHERI technology - CybersecurityIntroduction to CHERI technology - Cybersecurity
Introduction to CHERI technology - Cybersecurity
 

JUDCon 2010 Boston : TorqueBox