• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
jRuby and TorqueBox
 

jRuby and TorqueBox

on

  • 1,906 views

 

Statistics

Views

Total Views
1,906
Views on SlideShare
1,514
Embed Views
392

Actions

Likes
4
Downloads
11
Comments
1

2 Embeds 392

http://christopherspring.com 391
https://twitter.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel

11 of 1 previous next

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    jRuby and TorqueBox jRuby and TorqueBox Presentation Transcript

    • + = Christopher SpringThursday 07 February 13
    • @autonomous chris.spring@gmail.comThursday 07 February 13
    • Thursday 07 February 13
    • Thursday 07 February 13
    • “Java is a DSL for converting large XML files into Stack Traces” @ davetron5000Thursday 07 February 13
    • ... and that’s all I have to say about thatThursday 07 February 13
    • Thursday 07 February 13
    • StructureThursday 07 February 13
    • jRuby Core Java Bytecode Parser Classes Integ JIT JVM Native Threads GC C API JIT Charles Nutter - Euroko2012Thursday 07 February 13
    • jRuby Core Java Bytecode Parser Classes Integ JIT Charles Nutter - Euroko2012Thursday 07 February 13
    • “We could stop working on jRuby and it would continue to get faster.” Charles Nutter - Euroko2012Thursday 07 February 13
    • PerformanceThursday 07 February 13
    • require benchmark def fib(n) return 1 if n < 2 fib(n - 2) + fib(n - 1) end arr = [] puts Benchmark.measure{ 40.times{ |i| arr << fib(i) } } puts arr.inspect # [1, 1, 2, 3, 5, 8, 13, 21, ... ]Thursday 07 February 13
    • Time in seconds 60 52.8 45 30 15 0Thursday 07 February 13
    • Time in seconds 60 52.8 45 30 15 10.4 0Thursday 07 February 13
    • REE - 183.8 Time in seconds 60 52.8 45 30 15 10.4 0Thursday 07 February 13
    • get / do 1_000.times do MultiJson.encode({ one: one, date: Date.today, two: 2 }) end end # ruby jsonator.rb -s PumaThursday 07 February 13
    • ab -n 1000 -c 32 http://localhost:4567/Thursday 07 February 13
    • Thursday 07 February 13
    • Time in seconds 30 24.946 22,5 15 7,5 0Thursday 07 February 13
    • Thursday 07 February 13
    • Time in seconds 30 24.946 22,5 15 8.489 7,5 0Thursday 07 February 13
    • Thursday 07 February 13
    • Time in seconds 30 24.946 22,5 15 8.489 7,5 2.892 0Thursday 07 February 13
    • Runtime optimizationsThursday 07 February 13
    • method_one method_two method_threeThursday 07 February 13
    • method_one method_two method_threeThursday 07 February 13
    • ThreadingThursday 07 February 13
    • vs.Thursday 07 February 13
    • • No GIL • Native threads • One process for all coresThursday 07 February 13
    • Concurrency threshold 100 process system vs. 100 thread systemThursday 07 February 13
    • Java LibrariesThursday 07 February 13
    • <html><head> <style type="text/css"> body{ font-family: sans-serif; text-align: center; background-color: #efefef; } h1{ color: blue; font-weight: bold;} div{ border: 4px dashed red; padding: 2em;margin: 2em; } </style> </head> <body> <h1>PDFs with Flying Saucer and jRuby</h1> <div> <p>Im a lumberjack, and Im ok...</p> <img src="flower.jpeg"></img> </div> </body> </html>Thursday 07 February 13
    • require stringio require itext require flying_saucer io = StringIO.new content = File.read(example.html) renderer = org.xhtmlrenderer.pdf.ITextRenderer.new renderer.set_document_from_string(content) renderer.layout renderer.create_pdf(io.to_outputstream) File.write(pdf_result.pdf, io.string)Thursday 07 February 13
    • htmlThursday 07 February 13
    • pdfThursday 07 February 13
    • A loads more....!!! • Choice of GC • Cross platform • GUI apps • Great tooling • Massive ecosystemThursday 07 February 13
    • Thursday 07 February 13
    • Let’s take a step back...Thursday 07 February 13
    • Your AppThursday 07 February 13
    • Your App Background JobsThursday 07 February 13
    • Your App Background JobsThursday 07 February 13
    • Your App Background Scheduled Jobs JobsThursday 07 February 13
    • Your App Background Scheduled Jobs Jobs CronThursday 07 February 13
    • Thursday 07 February 13
    • TorqueBoxThursday 07 February 13
    • TorqueBoxThursday 07 February 13
    • TorqueBox App1 App2 App3Thursday 07 February 13
    • TorqueBox App1 App2 App3Thursday 07 February 13
    • TorqueBox Background Async. App1 App2 Tasks Messages App3 Scheduled Long running Tasks servicesThursday 07 February 13
    • TorqueBox Background Async. App1 App2 Tasks Messages App3 Scheduled Long running Tasks services JBoss AS Clustering Load balancing High availabilityThursday 07 February 13
    • Some of the toys... • HornetQ • Infinispan • Quartz SchedulerThursday 07 February 13
    • Thursday 07 February 13
    • It’s still just business as usualThursday 07 February 13
    • Asynchronous StuffsThursday 07 February 13
    • class Charge < ActiveRecord::Base # id :integer not null, primary key # cents :integer default(0) # state :string(255) default("pending") endThursday 07 February 13
    • class Charge < ActiveRecord::Base # id :integer not null, primary key # cents :integer default(0) # state :string(255) default("pending") endThursday 07 February 13
    • class Charge < ActiveRecord::Base # id :integer not null, primary key # cents :integer default(0) # state :string(255) default("pending") endThursday 07 February 13
    • class Charge < ActiveRecord::Base # id :integer not null, primary key # cents :integer default(0) # state :string(255) default("pending") endThursday 07 February 13
    • class Charge < ActiveRecord::Base # id :integer not null, primary key # cents :integer default(0) # state :string(255) default("pending") endThursday 07 February 13
    • class ChargesController < ActionController::Base include TorqueBox::Injectors def create @charge = Charge.create( params[:charge] ) fetch(/queue/charges).publish( @charge.id ) msg = Slaves turtles doing thy bidding redirect_to( charges_url, notice: msg ) end endThursday 07 February 13
    • class ChargesController < ActionController::Base include TorqueBox::Injectors def create @charge = Charge.create( params[:charge] ) fetch(/queue/charges).publish( @charge.id ) msg = Slaves turtles doing thy bidding redirect_to( charges_url, notice: msg ) end endThursday 07 February 13
    • /queue/charges ChargeProcessor class ChargesController < ActionController::Base include TorqueBox::Injectors def create @charge = Charge.create( params[:charge] ) fetch(/queue/charges).publish( @charge.id ) msg = Slaves turtles doing thy bidding redirect_to( charges_url, notice: msg ) end endThursday 07 February 13
    • fetch(/queue/charges).publish( @charge.id ) # config/torquebox.rb TorqueBox.configure do queue /queue/charges do processor ChargeProcessor end endThursday 07 February 13
    • # app/processors/charge_processor.rb class ChargeProcessor < TorqueBox::Messaging::MessageProcessor def on_message( charge_id ) # ... end def on_error( exception ) # optionally deal with exception # ... end endThursday 07 February 13
    • # app/processors/charge_processor.rb class ChargeProcessor < TorqueBox::Messaging::MessageProcessor def on_message( charge_id ) @charge = Charge.find( charge_id ) result = PaymentGateway.process( @charge ) generate_receipt if result.success? broadcast_status end endThursday 07 February 13
    • # app/processors/charge_processor.rb class ChargeProcessor < TorqueBox::Messaging::MessageProcessor def on_message( charge_id ) @charge = Charge.find( charge_id ) result = PaymentGateway.process( @charge ) generate_receipt if result.success? broadcast_status end def generate_receipt fetch(queue/receipts).publish( @charge.id ) end endThursday 07 February 13
    • # app/processors/charge_processor.rb class ChargeProcessor < TorqueBox::Messaging::MessageProcessor def on_message( charge_id ) @charge = Charge.find( charge_id ) result = PaymentGateway.process( @charge ) generate_receipt if result.success? broadcast_status end def generate_receipt fetch(queue/receipts).publish( @charge.id ) end def broadcast_status fetch(topics/charge_status).publish( @charge.id ) end endThursday 07 February 13
    • Queue Processor Processor Topic Processor ProcessorThursday 07 February 13
    • # config/torquebox.rb TorqueBox.configure do queue /queue/charges do # processors/charge_processor.rb processor ChargeProcessor end topic /topic/charge_status do processor StatusProcessor processor TesterProcessor processor AlertAdminProcessor end endThursday 07 February 13
    • And WebSockets?Thursday 07 February 13
    • Hells yes!!Thursday 07 February 13
    • Stomplet Topic/Queue Client ProcessorThursday 07 February 13
    • Stomplet ‘/stomp/statuses’ Topic/Queue Client ProcessorThursday 07 February 13
    • Stomplet ‘/topics/charge_status’ ‘/stomp/statuses’ Topic/Queue Client ProcessorThursday 07 February 13
    • # config/torquebox.rb stomplet ChargeStatusStomplet do route /stomp/status endThursday 07 February 13
    • # app/stomplets/charge_status_stomplet class ChargeStatusStomplet < TorqueBox::Stomp::JmsStomplet def on_subscribe( client ) topic = destination_for(/topics/charge_status, :topic) subscribe_to( client , topic ) end # configure(config) # destroy() # on_subscribe(subscriber) # on_unsubscribe(subscriber) # on_message(message) endThursday 07 February 13
    • javascript_include_tag /stilts-stompThursday 07 February 13
    • module ApplicationHelper include TorqueBox::Injectors def stomp_url inject(stomp-endpoint) end end var stompUrl = #{stomp_url} $( function() { if (stompUrl) { var client = Stomp.client(stompUrl); client.connect( username, password, function() { client.subscribe( /stomp/status, function(msg) { alert(msg.body); }); }); } });Thursday 07 February 13
    • Thursday 07 February 13
    • Thursday 07 February 13
    • Thanks for Listening!Thursday 07 February 13
    • Questions?Thursday 07 February 13