TorqueBox - Ultrapassando a fronteira entre Java e Ruby
Upcoming SlideShare
Loading in...5
×
 

TorqueBox - Ultrapassando a fronteira entre Java e Ruby

on

  • 2,446 views

 

Statistics

Views

Total Views
2,446
Views on SlideShare
1,929
Embed Views
517

Actions

Likes
1
Downloads
4
Comments
0

6 Embeds 517

http://torquebox.org 453
http://planet.jboss.org 26
http://staging.torquebox.org 20
http://localhost 12
http://us-w1.rockmelt.com 5
http://a0.twimg.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

CC Attribution-NonCommercial LicenseCC Attribution-NonCommercial License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

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

TorqueBox - Ultrapassando a fronteira entre Java e Ruby TorqueBox - Ultrapassando a fronteira entre Java e Ruby Presentation Transcript

  • Além da fronteira entre Java & Ruby Creative  Commons  BY-­SA  3.0Friday, November 4, 2011
  • @abstractj Java há 12 anos, Ruby n00b TorqueBox Contributor DynJS Contributor Caelum & ConcreteSFriday, November 4, 2011
  • DISCLAIMERFriday, November 4, 2011
  • Java 927 JSRS! nooooooooooooooo!Friday, November 4, 2011
  • import java.util.Calendar; public class Beer { private Long beerId; private String description; private Calendar createdAt; public Long getBeerId() { return beerId; } public void setBeerId(Long beerId) {Expressiva? } this.beerId = beerId; public String getDescription() { return description; } public void setDescription(String description) this.description = description; } public Calendar getCreatedAt() { return createdAt; } public void setCreatedAt(Calendar createdAt) this.createdAt = createdAt; }Friday, November 4, 2011 }
  • ENTERPRISEFriday, November 4, 2011
  • JAXR Java-FX JAXP JSTL StAX JME JDOM JVM JAX-RPC EJB AWT JMX Swing EAR Struts JAAS JCP JavaBean NPE Spring JAX-WS ENTERPRISE RMI JSE JNI JNDI NIO SOA JSP JSF JAXB WAR JDO JAX-RS JPQL JAF POJO EJBQL JRE JEEFriday, November 4, 2011
  • Friday, November 4, 2011
  • Mas escala né?!Friday, November 4, 2011
  • Scala Clojure Jython JVM DynJS Rhino GroovyFriday, November 4, 2011
  • Ruby Mais expressiva que Java class Beer attr_accessor :beer_id, :description, :created_at endFriday, November 4, 2011
  • DRYFriday, November 4, 2011
  • JRuby Java + RubyFriday, November 4, 2011
  • JRuby require java pdf = com.itextpdf.text.Document.new para = com.itextpdf.text.Paragraph.new Brought to you by JRuby file = java.io.FileOutputStream.new pdf_demo.pdf com.itextpdf.text.pdf.PdfWriter.get_instance pdf, file pdf.open pdf.add para pdf.closeFriday, November 4, 2011
  • “You get true multithreading that can use all your computer’s cores from one process, plus a virtual machine that’s been tuned for a decade and a half.” Using JRuby - Bringing Ruby to JavaFriday, November 4, 2011
  • Server SideFriday, November 4, 2011
  • Ruby App Sinatra Rails Rack Passenger/Thin Apache/NginxFriday, November 4, 2011
  • Ruby App Sinatra Rails Rack Passenger/Thin Jobs Apache/Nginx crondFriday, November 4, 2011
  • Ruby App Sinatra Rails Rack Tasks Passenger/Thin Jobs Resque/ DelayedJob Apache/Nginx crondFriday, November 4, 2011
  • Ruby App Sinatra Rails Rack Tasks Passenger/Thin Jobs Resque/ DelayedJob Apache/Nginx crond Daemons god/monitFriday, November 4, 2011
  • JBoss TomcatFriday, November 4, 2011
  • JBoss HornetQFriday, November 4, 2011
  • JBoss QuartzFriday, November 4, 2011
  • JBoss ClusteringFriday, November 4, 2011
  • TorqueBox “The power of JBoss with the expressiveness of Ruby” Jim Crossley - MagicRuby ConferenceFriday, November 4, 2011
  • TorqueBoxFriday, November 4, 2011
  • Instalação TorqueBox do zeroFriday, November 4, 2011
  • ➜ jruby -S gem install torquebox torquebox-capistrano-supportFriday, November 4, 2011
  • ➜ wget http://torquebox.org/builds/LATEST/torquebox-dist- bin.zip ➜ unzip torquebox-dist-bin.zip ➜ export TORQUEBOX_HOME=$PWD/torquebox-2.x ➜ export JBOSS_HOME=$TORQUEBOX_HOME/jboss ➜ export JRUBY_HOME=$TORQUEBOX_HOME/jruby ➜ export PATH=$JRUBY_HOME/bin:$PATHFriday, November 4, 2011
  • Rails rails new beer -m $TORQUEBOX_HOME/share/rails/template.rbFriday, November 4, 2011
  • Estrutura Diretórios do TorqueBoxFriday, November 4, 2011
  • Rake tasks rake torquebox:deploy rake torquebox:undeploy rake torquebox:runFriday, November 4, 2011
  • Deployment Make knobs, not WAR!Friday, November 4, 2011
  • beer-knob.yml application: root: /Users/Bruno/rubyconfbr/beer environment: developmentFriday, November 4, 2011
  • Friday, November 4, 2011
  • AplicaçãoFriday, November 4, 2011
  • source "http://torquebox.org/2x/builds/584/gem- repo" source http://rubygems.org gem rails, 3.1.1 Gemfile gem activerecord-jdbcsqlite3-adapter gem jruby-openssl gem json gem jquery-rails gem "torquebox-rake-support", "2.x.incremental. 584" gem "torquebox", "2.x.incremental.584"Friday, November 4, 2011
  • Web Rack, Sinatra, RailsFriday, November 4, 2011
  • Caching class BeersController < ApplicationController caches_action :most_popular, :expires_in => 30.seconds def most_popular @popular_beers = Beer.most_popular(:limit => 25) end endFriday, November 4, 2011
  • Friday, November 4, 2011
  • Clustering ➜ torquebox run --clusteredFriday, November 4, 2011
  • Internals class TorqueBoxCommand < Thor TASK_ORDER = %w(deploy undeploy start cli env help) map "run" => "start" desc "run", "Run TorqueBox" method_option :clustered, :type => :boolean, :desc => "Run TorqueBox in clustered mode" def start setup_environment TorqueBox::DeployUtils.run_server(:clustered => options.clustered, :max_threads => options[max-threads], :bind_address => options[bind-address]) end endFriday, November 4, 2011
  • Cache distribuído!Friday, November 4, 2011
  • mod_clusterFriday, November 4, 2011
  • Infinispan CachingFriday, November 4, 2011
  • Invalidation Cache Cache Server1 Server2Friday, November 4, 2011
  • Invalidation Notificação Cache Cache Server1 Server2 NEW Cache DesatualizadoFriday, November 4, 2011
  • ../config/application.rb module Beer class Application < Rails::Application config.cache_store = :torque_box_store end endFriday, November 4, 2011
  • Replicated Cache Server2 Cache Server1 Sync Cache Sync Server2 Cache Server2Friday, November 4, 2011
  • ../config/application.rb module Beer class Application < Rails::Application config.cache_store = :torque_box_store, {:mode => replicated, :sync =>false} end endFriday, November 4, 2011
  • Scheduling Agendamento de JobsFriday, November 4, 2011
  • Internals public class RubyJobProxy implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { Ruby ruby = null; try { ruby = this.runtimePool.borrowRuntime( resolver.getComponentName() ); JobComponent job = (JobComponent)resolver.resolve( ruby ); watchDog(context); job.run(); } catch (Exception e) { throw new JobExecutionException( e ); } finally { if (ruby != null) { this.runtimePool.returnRuntime( ruby ); } } }Friday, November 4, 2011
  • Internals public class RubyJobProxy implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { Ruby ruby = null; try { ruby = this.runtimePool.borrowRuntime( resolver.getComponentName() ); JobComponent job = (JobComponent)resolver.resolve( ruby ); watchDog(context); job.run(); } catch (Exception e) { throw new JobExecutionException( e ); } finally { if (ruby != null) { this.runtimePool.returnRuntime( ruby ); } } }Friday, November 4, 2011
  • ../app/jobs class JobDemo def initialize #Codigo de inicializacao end def run # O que você quer executar end endFriday, November 4, 2011
  • ../config/torquebox.yml jobs: sync_agenda: job: JobDemo cron: 0 0 12 * * ? endFriday, November 4, 2011
  • Mensageria Java Messaging Service + HornetQFriday, November 4, 2011
  • O Ministério da Saúde adverte: NOSQL COMO MENSAGERIA PODE TRAZER DANOS A SUA SAÚDE E A DE SEUS FAMILIARESFriday, November 4, 2011
  • Greenfield REST + NoSQL Request/Responsext NoSQL RAILS APP pub/sub SINATRA APPFriday, November 4, 2011
  • Real World Nobody Cares! Request/Responsext NoSQL RAILS APP pub/sub MAINFRAMEFriday, November 4, 2011
  • ../config/torquebox.yml /topics/beerTopic /queues/queueBeer:Friday, November 4, 2011
  • Tasks class EmailerTask < TorqueBox::Messaging::Task def send_welcome(payload) to = "#{payload[:name]} <#{payload[:address]}>" # send welcome email to the user end endFriday, November 4, 2011
  • Tasks class UserController < ApplicationController def register user = User.new(params[:user]) EmailerTask.async(:send_welcome, :address => user.email, :name => user.name) end endFriday, November 4, 2011
  • Processors include TorqueBox::Messaging class PrintHandler < MessageProcessor   def on_message(body)     puts "Processing #{body} of #{message}"   end   def configure(opts)     @color = opts[color]   end endFriday, November 4, 2011
  • Queues include TorqueBox req = Messaging::Queue.new /queues/questions res = Messaging::Queue.new /queues/answers   Thread.new do   req.publish "What time is it?"   puts res.receive( :timeout => 1000 ) endFriday, November 4, 2011
  • FutureFriday, November 4, 2011
  • Future class EmailerTask def send_welcome(payload) to = "#{payload[:name]} <#{payload[:address]}>" # long running task end endFriday, November 4, 2011
  • Future class EmailerTask include TorqueBox::Messaging::Backgroundable always_background :send_welcome def send_welcome(payload) to = "#{payload[:name]} <#{payload[:address]}>" # long running task end endFriday, November 4, 2011
  • Future future = @emailTask.send_welcome(:send_welcome) future.started? future.complete? future.error? future.result future.result(10000)Friday, November 4, 2011
  • ServicesFriday, November 4, 2011
  • Services class BeerService def initialize @queue = Messaging::Queue.new(“beer”) end def start @queue.publish “Testing” end def stop # O que fazer quando o serviço receber um stop end endFriday, November 4, 2011
  • Singleton Services Clustered Server1 Server2 BeerService BeerServiceFriday, November 4, 2011
  • Singleton Services Clustered Server1 Server2 BeerService BeerServiceFriday, November 4, 2011
  • Services ➜ torquebox run --clustered ../config/torquebox.yml services: BeerService: singleton: true endFriday, November 4, 2011
  • CDI Injeção de dependênciasFriday, November 4, 2011
  • Pra quê?Friday, November 4, 2011
  • Java package br.com.rubyconf; public class Beer { //gets e sets public void say(String message) { // Execução do método } } Deploy do jar na aplicação app/ models/ views/ controllers/ lib/beer.jarFriday, November 4, 2011
  • Ruby class BeerController < ApplicationController include TorqueBox::Injectors def create beer = inject(br.com.rubyconf.Beer ) beer.say “Ruby is for Java” end endFriday, November 4, 2011
  • JNDI class MyService include TorqueBox::Injectors def initialize opts={} @factory = inject("java:comp/env/jdbc/myDB") end endFriday, November 4, 2011
  • Destinations class MyService include TorqueBox::Injectors def initialize opts={} @inbound = inject("/topic/beerpub") @outbound = inject("/queue/beer") end endFriday, November 4, 2011
  • Outras features Autenticação + Websockets + XA (2PC)Friday, November 4, 2011
  • BackStageFriday, November 4, 2011
  • Stomp Box TorqueBox deployment supportFriday, November 4, 2011
  • Friday, November 4, 2011
  • Comunidade irc.freenode.net #torquebox http://torquebox.org http://github.com/torquebox twitter: @torqueboxFriday, November 4, 2011
  • Obrigado! @abstractj http://github.com/abstractj Creative  Commons  BY-­SA  3.0Friday, November 4, 2011