Advertisement

TorqueBox - Ultrapassando a fronteira entre Java e Ruby

Developer at Abstract Consulting
Nov. 4, 2011
Advertisement

More Related Content

Advertisement

TorqueBox - Ultrapassando a fronteira entre Java e Ruby

  1. Além da fronteira entre Java & Ruby Creative  Commons  BY-­SA  3.0 Friday, November 4, 2011
  2. @abstractj Java há 12 anos, Ruby n00b TorqueBox Contributor DynJS Contributor Caelum & ConcreteS Friday, November 4, 2011
  3. DISCLAIMER Friday, November 4, 2011
  4. Java 927 JSRS! nooooooooooooooo! Friday, November 4, 2011
  5. 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 }
  6. ENTERPRISE Friday, November 4, 2011
  7. 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 JEE Friday, November 4, 2011
  8. Friday, November 4, 2011
  9. Mas escala né?! Friday, November 4, 2011
  10. Scala Clojure Jython JVM DynJS Rhino Groovy Friday, November 4, 2011
  11. Ruby Mais expressiva que Java class Beer attr_accessor :beer_id, :description, :created_at end Friday, November 4, 2011
  12. DRY Friday, November 4, 2011
  13. JRuby Java + Ruby Friday, November 4, 2011
  14. 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.close Friday, November 4, 2011
  15. “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 Java Friday, November 4, 2011
  16. Server Side Friday, November 4, 2011
  17. Ruby App Sinatra Rails Rack Passenger/Thin Apache/Nginx Friday, November 4, 2011
  18. Ruby App Sinatra Rails Rack Passenger/Thin Jobs Apache/Nginx crond Friday, November 4, 2011
  19. Ruby App Sinatra Rails Rack Tasks Passenger/Thin Jobs Resque/ DelayedJob Apache/Nginx crond Friday, November 4, 2011
  20. Ruby App Sinatra Rails Rack Tasks Passenger/Thin Jobs Resque/ DelayedJob Apache/Nginx crond Daemons god/monit Friday, November 4, 2011
  21. JBoss Tomcat Friday, November 4, 2011
  22. JBoss HornetQ Friday, November 4, 2011
  23. JBoss Quartz Friday, November 4, 2011
  24. JBoss Clustering Friday, November 4, 2011
  25. TorqueBox “The power of JBoss with the expressiveness of Ruby” Jim Crossley - MagicRuby Conference Friday, November 4, 2011
  26. TorqueBox Friday, November 4, 2011
  27. Instalação TorqueBox do zero Friday, November 4, 2011
  28. ➜ jruby -S gem install torquebox torquebox-capistrano-support Friday, November 4, 2011
  29. ➜ 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:$PATH Friday, November 4, 2011
  30. Rails rails new beer -m $TORQUEBOX_HOME/share/rails/template.rb Friday, November 4, 2011
  31. Estrutura Diretórios do TorqueBox Friday, November 4, 2011
  32. Rake tasks rake torquebox:deploy rake torquebox:undeploy rake torquebox:run Friday, November 4, 2011
  33. Deployment Make knobs, not WAR! Friday, November 4, 2011
  34. beer-knob.yml application: root: /Users/Bruno/rubyconfbr/beer environment: development Friday, November 4, 2011
  35. Friday, November 4, 2011
  36. Aplicação Friday, November 4, 2011
  37. 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
  38. Web Rack, Sinatra, Rails Friday, November 4, 2011
  39. Caching class BeersController < ApplicationController caches_action :most_popular, :expires_in => 30.seconds def most_popular @popular_beers = Beer.most_popular(:limit => 25) end end Friday, November 4, 2011
  40. Friday, November 4, 2011
  41. Clustering ➜ torquebox run --clustered Friday, November 4, 2011
  42. 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 end Friday, November 4, 2011
  43. Cache distribuído! Friday, November 4, 2011
  44. mod_cluster Friday, November 4, 2011
  45. Infinispan Caching Friday, November 4, 2011
  46. Invalidation Cache Cache Server1 Server2 Friday, November 4, 2011
  47. Invalidation Notificação Cache Cache Server1 Server2 NEW Cache Desatualizado Friday, November 4, 2011
  48. ../config/application.rb module Beer class Application < Rails::Application config.cache_store = :torque_box_store end end Friday, November 4, 2011
  49. Replicated Cache Server2 Cache Server1 Sync Cache Sync Server2 Cache Server2 Friday, November 4, 2011
  50. ../config/application.rb module Beer class Application < Rails::Application config.cache_store = :torque_box_store, {:mode => replicated, :sync =>false} end end Friday, November 4, 2011
  51. Scheduling Agendamento de Jobs Friday, November 4, 2011
  52. 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
  53. 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
  54. ../app/jobs class JobDemo def initialize #Codigo de inicializacao end def run # O que você quer executar end end Friday, November 4, 2011
  55. ../config/torquebox.yml jobs: sync_agenda: job: JobDemo cron: '0 0 12 * * ?' end Friday, November 4, 2011
  56. Mensageria Java Messaging Service + HornetQ Friday, November 4, 2011
  57. O Ministério da Saúde adverte: NOSQL COMO MENSAGERIA PODE TRAZER DANOS A SUA SAÚDE E A DE SEUS FAMILIARES Friday, November 4, 2011
  58. Greenfield REST + NoSQL Request/Responsext NoSQL RAILS APP pub/sub SINATRA APP Friday, November 4, 2011
  59. Real World Nobody Cares! Request/Responsext NoSQL RAILS APP pub/sub MAINFRAME Friday, November 4, 2011
  60. ../config/torquebox.yml /topics/beerTopic /queues/queueBeer: Friday, November 4, 2011
  61. Tasks class EmailerTask < TorqueBox::Messaging::Task def send_welcome(payload) to = "#{payload[:name]} <#{payload[:address]}>" # send welcome email to the user end end Friday, November 4, 2011
  62. Tasks class UserController < ApplicationController def register user = User.new(params[:user]) EmailerTask.async(:send_welcome, :address => user.email, :name => user.name) end end Friday, November 4, 2011
  63. Processors include TorqueBox::Messaging class PrintHandler < MessageProcessor   def on_message(body)     puts "Processing #{body} of #{message}"   end   def configure(opts)     @color = opts['color']   end end Friday, November 4, 2011
  64. 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 ) end Friday, November 4, 2011
  65. Future Friday, November 4, 2011
  66. Future class EmailerTask def send_welcome(payload) to = "#{payload[:name]} <#{payload[:address]}>" # long running task end end Friday, November 4, 2011
  67. Future class EmailerTask include TorqueBox::Messaging::Backgroundable always_background :send_welcome def send_welcome(payload) to = "#{payload[:name]} <#{payload[:address]}>" # long running task end end Friday, November 4, 2011
  68. Future future = @emailTask.send_welcome(:send_welcome) future.started? future.complete? future.error? future.result future.result(10000) Friday, November 4, 2011
  69. Services Friday, November 4, 2011
  70. 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 end Friday, November 4, 2011
  71. Singleton Services Clustered Server1 Server2 BeerService BeerService Friday, November 4, 2011
  72. Singleton Services Clustered Server1 Server2 BeerService BeerService Friday, November 4, 2011
  73. Services ➜ torquebox run --clustered ../config/torquebox.yml services: BeerService: singleton: true end Friday, November 4, 2011
  74. CDI Injeção de dependências Friday, November 4, 2011
  75. Pra quê? Friday, November 4, 2011
  76. 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.jar Friday, November 4, 2011
  77. Ruby class BeerController < ApplicationController include TorqueBox::Injectors def create beer = inject(br.com.rubyconf.Beer ) beer.say “Ruby is for Java” end end Friday, November 4, 2011
  78. JNDI class MyService include TorqueBox::Injectors def initialize opts={} @factory = inject("java:comp/env/jdbc/myDB") end end Friday, November 4, 2011
  79. Destinations class MyService include TorqueBox::Injectors def initialize opts={} @inbound = inject("/topic/beerpub") @outbound = inject("/queue/beer") end end Friday, November 4, 2011
  80. Outras features Autenticação + Websockets + XA (2PC) Friday, November 4, 2011
  81. BackStage Friday, November 4, 2011
  82. Stomp Box TorqueBox deployment support Friday, November 4, 2011
  83. Friday, November 4, 2011
  84. Comunidade irc.freenode.net #torquebox http://torquebox.org http://github.com/torquebox twitter: @torquebox Friday, November 4, 2011
  85. Obrigado! @abstractj http://github.com/abstractj Creative  Commons  BY-­SA  3.0 Friday, November 4, 2011
Advertisement