Jaoo Michael Neale 09

Loading...

Flash Player 9 (or above) is needed to view presentations.
We have detected that you do not have it on your computer. To install it, go here.

0 comments

Post a comment

    Post a comment
    Embed Video
    Edit your comment Cancel

    Favorites, Groups & Events

    Jaoo Michael Neale 09 - Presentation Transcript

    1. JBoss Rules, Rails JAOO, Australia, 2009 Sydney, Brisbane Michael Neale JBoss R&D Red Hat Middleware 1
    2. Michael Neale R&D on Drools (rule engine). Open source history (user -> fulltime developer). Contribute to other jboss and non jboss projects me on the web: www.michaelneale.net, twitter.com/michaelneale, michaelneale.blogspot.com 2
    3. Agenda •Doing more with less... •But isn't java hard/slow? •Quick introduction to Rails basics •Setting up JBoss for Rails •What are rules and why use them? •Drools 3
    4. More, with less Does any one need to: Build apps of growing complexity Do it quicker and cheaper Cope with people changing their mind All the time At runtime If not – you can go ! 4
    5. Drools: Logic and declarative programming for developers User friendly GUIs and management tools for the rest Allows controlled changes to business logic (even at runtime) 5
    6. Rails Popular RESTful web-app framework (full stack) Runs just fine on the JVM Famous for productivity 6
    7. Why the JVM? 7
    8. Its the platform.. Not the language ! 8
    9. 9
    10. A fan... Oh that reminds me, twitter? 10
    11. Languages Ruby Scala ** Groovy Clojure Java7???? 11
    12. So not necessarily... Big heavy and bloated But it is a platform... 12
    13. Introduction to Ruby-on-Rails 13
    14. What is Rails? Rails is a “lightweight” MVC framework for building websites in Ruby. 14
    15. Rails MVC •ActiveRecord for the models • ERb templates for the view •Simple ruby classes for the controllers 15
    16. ActiveRecord Definitely is not Hibernate, but works well-enough. 16
    17. ActiveRecord class Comment < ActiveRecord::Base belongs_to :post belongs_to :user validate_presence_of :text ... end 17
    18. ERb Templates ERb allows snippets of Ruby to be embedded within HTML or other templates. 18
    19. ERb Templates <p> There are <%= @post.comments.size %> new comments since your last visit: </p> <% for comment in @post.comments %> <% div_for( comment ) do %> <%= comment.author.full_name %> <% end %> <% end %> 19
    20. ActionController Your ActionController sub- classes provides the logic behind the pages and forms. 20
    21. ActionController class CommentsController < ApplicationController before_filter :load_post def create @comment = @post.comments.build( params[:comment] ) .... end private def load_post @post = Post.find_by_slug( params[:slug] ) redirect_to posts_url and return false unless @post end end 21
    22. ActionController Actions class CommentsController < ApplicationController before_filter :load_post def create @comment = @post.comments.build( params[:comment] ) .... end private def load_post @post = Post.find_by_slug( params[:slug] ) redirect_to posts_url and return false unless @post end end 22
    23. ActionController Filters class CommentsController < ApplicationController before_filter :load_post def create @comment = @post.comments.build( params[:comment] ) .... end private def load_post @post = Post.find_by_slug( params[:slug] ) redirect_to posts_url and return false unless @post end end 23
    24. Where’s the Java? JRuby is a full and fast Ruby interpreter built on top of the Java Virtual Machine. 24
    25. JRuby JRuby is actively developed by Charlie Nutter, Thomas Enebo, and others. 25
    26. Run Rails in the JVM After solving a few issues, Rails runs easily within most any servlet container. 26
    27. Why JBoss, then? •JBoss provides a perfectly nice servlet container. •JBoss provides a whole lot more, too: •JMS • Transactions •Rules-Engine •Telecom 27
    28. Rails is not enough Rails is a great solution... for the web. 28
    29. Beyond Rails Apply the Ruby and Rails philosophies to enterprise-grade services. 29
    30. Ruby is just a syntax Approach Ruby as just another syntax for driving JEE/JVM technologies. 30
    31. Let’s get started. 31
    32. Ingredients JDK6 JBoss AS5 JRuby Rails JBoss-Rails 32
    33. JDK6 • OpenJDK is very nice. •Apple’s JDK6 works just fine. 33
    34. Install JBoss AS5.x $ unzip jboss-5.0.1.GA-jdk6.zip Archive: jboss-5.0.1.GA-jdk6.zip creating: jboss-5.0.1.GA/ creating: jboss-5.0.1.GA/bin/ ... 34
    35. Set $JBOSS_HOME $ cd jboss-5.0.1.GA $ export JBOSS_HOME=$PWD $ echo $JBOSS_HOME /Users/mic/jboss-5.0.1.GA 35
    36. Install JRuby $ unzip jruby-bin-1.2.0RC2.zip Archive: jruby-bin-1.2.0RC2.zip creating: jruby-1.2.0RC2/ creating: jruby-1.2.0RC2/bin/ ... 36
    37. Prefer JRuby $ cd jruby-1.2.0RC2/ $ export JRUBY_HOME=$PWD $ export PATH=$JRUBY_HOME/bin:$PATH 37
    38. JRuby path This pulls things like rake and gem from JRuby’s path instead of C-Ruby’s. 38
    39. JBoss-Rails The Deployer The first part of JBoss- Rails is the deployer. 39
    40. JBoss-Rails The Deployer The deployer makes JBoss AS5 Rails- aware. 40
    41. JBoss-Rails The Deployer Install it into the server’s deployers/ directory 41
    42. Pick a Profile AS5 provides several configuration profiles. 42
    43. The default profile $JBOSS_HOME/server/default/ 43
    44. Drop in the deployer 44
    45. (or copy it) $ cp jboss-rails-deployer.jar \\ $JBOSS_HOME/server/default/deployers/ 45
    46. Remove ROOT.war $ rm -Rf $JBOSS_HOME/server/*/deploy/ROOT.war/ 46
    47. JBoss-Rails jboss-rails-support The second part of JBoss-Rails is application-support library. 47
    48. JBoss-Rails jboss-rails-support It goes right into your Rails app. So we need a Rails app. 48
    49. Install Rails $ gem install rails --version 2.2.2 Successfully installed activesupport-2.2.2 Successfully installed activerecord-2.2.2 Successfully installed actionpack-2.2.2 Successfully installed actionmailer-2.2.2 Successfully installed activeresource-2.2.2 Successfully installed rails-2.2.2 6 gems installed 49
    50. Create an app $ rails twiggl create create app/controllers create app/helpers create app/models create app/views/layouts create config/environments create config/initializers create config/locales ... 50
    51. Freeze Rails $ rake rails:freeze:gems Freezing to the gems for Rails 2.2.2 rm -rf vendor/rails mkdir -p vendor/rails cd vendor/rails Unpacked gem: '/Users/bob/twiggl/vendor/rails/activesupport-2.2.2' mv activesupport-2.2.2 activesupport Unpacked gem: '/Users/bob/twiggl/vendor/rails/activerecord-2.2.2' mv activerecord-2.2.2 activerecord Unpacked gem: '/Users/bob/twiggl/vendor/rails/actionpack-2.2.2' mv actionpack-2.2.2 actionpack Unpacked gem: '/Users/bob/twiggl/vendor/rails/actionmailer-2.2.2' mv actionmailer-2.2.2 actionmailer Unpacked gem: '/Users/bob/twiggl/vendor/rails/activeresource-2.2.2' mv activeresource-2.2.2 activeresource Unpacked gem: '/Users/bob/twiggl/vendor/rails/rails-2.2.2' cd - 51
    52. Why freeze? Relying on system-wide gems is a bad idea, and impossible with JBoss- Rails. 52
    53. JBoss-Rails jboss-rails-support Now we can install the application-support library. 53
    54. JBoss-Rails jboss-rails-support $ cd vendor/plugins/ $ unzip ~/downloads/jboss-rails-support.zip Archive: /Users/bob/downloads/jboss-rails-support.zip creating: jboss-rails-support/ creating: jboss-rails-support/lib/ creating: jboss-rails-support/lib/jboss/ creating: jboss-rails-support/lib/jboss/endpoints/ creating: jboss-rails-support/lib/jboss/jobs/ creating: jboss-rails-support/lib/recipes/ creating: jboss-rails-support/lib/tasks/ inflating: jboss-rails-support/init.rb ..... 54
    55. Apps need a database. 55
    56. PostgresSQL 56
    57. Create the DB stuff postgres> create user twiggl with password 'twiggl'; CREATE ROLE postgres> create database twiggl_development with owner twiggl encoding 'UTF8'; CREATE DATABASE 57
    58. Set up your app config/database.yml development: adapter: postgresql database: twiggl_development username: twiggl password: twiggl host: localhost encoding: UTF8 58
    59. Set up your app config/database.yml development: adapter: postgresql Just like database: twiggl_development username: twiggl regular Rails! password: twiggl host: localhost encoding: UTF8 59
    60. Database access Rails on JBoss can take advantage of JDBC drivers. 60
    61. Easy JDBC The jboss-rails-support library makes it easy to set up your Rails app for JDBC. 61
    62. Install the JDBC gems $ rake jboss:gems:jdbc:install 62
    63. Install the JDBC gems activerecord-jdbc $ rake jboss:gems:jdbc:install INFO: Installing activerecord-jdbc adapter-0.8.3 63
    64. Install the JDBC gems the result 64
    65. You’re ready! •AS5 is ready to serve Rails apps. •A bare database is setup. •A bare Rails app is setup. • Configured to access the database. •Using JDBC. •Extra JBoss goodness is installed. 65
    66. Deploying a Rails App The jboss-rails- support rake tasks handle deploying and undeploying. 66
    67. From your app $ rake jboss:rails:deploy Deployed twiggl 67
    68. Deployment Descriptor $JBOSS_HOME/server/default/deploy/twiggl- rails.yml application: RAILS_ENV: development RAILS_ROOT: /Users/bob/twiggl web: context: / 68
    69. Wait, AS isn’t running! 69
    70. Start AS $ rake jboss:as:run (in /Users/bob/twiggl) JBoss-Rails server: /Users/bob/jboss-5.0.1.GA/server/default ========================================================================= JBoss Bootstrap Environment JBOSS_HOME: /Users/bob/jboss-5.0.1.GA JAVA: /System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home//bin/java JAVA_OPTS: -Dprogram.name=run.sh -Xms128m -Xmx512m -XX:MaxPermSize=256m -Dorg.jboss. resolver.warning=true -Dsun. rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 CLASSPATH: /Users/bob/preso/jboss-5.0.1.GA/bin/run.jar ========================================================================= 13:44:45,281 INFO [ServerImpl] Starting JBoss (Microcontainer)... 13:44:45,283 INFO [ServerImpl] Release ID: JBoss [Morpheus] 5.0.1.GA (build: SVNTag=JBoss_5_0_1_GA date=200902232048) 13:44:45,283 INFO [ServerImpl] Bootstrap URL: null 13:44:45,283 INFO [ServerImpl] Home Dir: /Users/bob/j boss-5.0.1.GA 13:44:45,283 INFO [ServerImpl] Home URL: file:/Users/bob/jboss-5.0.1.GA/ 13:44:45,287 INFO [ServerImpl] Library URL: fi le:/Users/bob/jboss-5.0.1.GA/lib/ 13:44:45,288 INFO [ServerImpl] Patch URL: null 13:44:45,288 INFO [ServerImpl] Common Base URL: fi le:/Users/bob/jboss-5.0.1.GA/common/ 13:44:45,288 INFO [ServerImpl] Common Library URL: file:/Users/bob/jboss-5.0.1.GA/common/lib/ 13:44:45,288 INFO [ServerImpl] Server Name: default 13:44:45,289 INFO [ServerImpl] Server Base Dir: /Users/bob/jboss-5.0.1.GA/server 13:44:45,289 INFO [ServerImpl] Server Base URL: file:/Users/bob/jboss-5.0.1.GA/server/ 13:44:45,289 INFO [ServerImpl] Server Confi g URL: file:/Users/bob/jboss-5.0.1.GA/server/default/conf/ 13:44:45,289 INFO [ServerImpl] Server Home Dir: /Users/bob/jboss-5.0.1.GA/server/default 13:44:45,289 INFO [ServerImpl] Server Home URL: file:/Users/bob/jboss-5.0.1.GA/server/default/ 70
    71. localhost:8080/index.html 71
    72. Create models $ jruby ./script/generate resource twig 72
    73. Create models $ jruby ./script/generate resource twig ... create app/models/twig.rb 73
    74. Create models $ jruby ./script/generate resource twig ... create app/models/twig.rb ... create db/migrate/20090308180254_create_twigs.rb 74
    75. Create models $ jruby ./script/generate resource twig ... create app/models/twig.rb ... create db/migrate/20090308180254_create_twigs.rb ... create app/controllers/twigs_controller.rb 75
    76. Create models $ jruby ./script/generate resource twig ... create app/models/twig.rb ... create db/migrate/20090308180254_create_twigs.rb ... create app/controllers/twigs_controller.rb ... route map.resources :twigs 76
    77. Create models db/migrate/*_create_twigs.rb class CreateTwigs < ActiveRecord::Migration def self.up create_table :twigs do |t| t.string :name, :limit=>42, :null=>false t.timestamps end end def self.down drop_table :twigs end end 77
    78. Blow it into the DB $ rake db:migrate (in /Users/bob/twiggl) == CreateTwigs: migrating =============== -- create_table(:twigs) -> 0.0669s -> 0 rows == CreateTwigs: migrated (0.0683s) ====== 78
    79. Rough in a controller app/controllers/twigs_controller.rb class TwigsController < ApplicationController def index @twigs = Twig.find( :all ) end end 79
    80. Rough in a template app/views/twigs/index.html.erb <p> There are <%= @twigs.size %> twigs. </p> <% for twig in @twigs %> <% div_for( twig ) do %> <%= twig.name %> <% end %> <% end %> 80
    81. Rough in a template app/views/twigs/index.html.erb <p> There are <%= @twigs.size %> twigs. </p> <% for twig in @twigs %> <% div_for( twig ) do %> <%= twig.name %> <% end %> <% end %> 81
    82. Rough in a template app/views/twigs/index.html.erb <p> There are <%= @twigs.size %> twigs. </p> <% for twig in @twigs %> <% div_for( twig ) do %> <%= twig.name %> <% end %> <% end %> 82
    83. Hit it! 83
    84. We didn’t restart AS. And we didn’t redeploy our app, either. That’s okay, we’re hacking hot code. 84
    85. Twig management app/controllers/twigs_controller.rb class TwigsController < ApplicationController def new @twig = Twig.new end def create @twig = Twig.create( params[:twig] ) redirect_to @twig end end 85
    86. Twig form app/views/twigs/new.html.erb <% form_for @twig do %> <%= label :twig, :name %> <%= text_field :twig, :name %> <%= submit_tag 'Create twig!' %> <% end %> 86
    87. Twig management app/controllers/twigs_controller.rb class TwigsController < ApplicationController def show @twig = Twig.find_by_id( params[:id] ) redirect_to twigs_url unless @twig end end 87
    88. Twig view app/views/twigs/show.html.erb <% div_for @twig do %> <h1><%= @twig.name %></h1> <% end %> 88
    89. Create a twig 89
    90. Create a twig 90
    91. Back to the index 91
    92. It’s just like regular Rails. 92
    93. Beyond Rails But, we have the entire freakin’ JBoss AS5 there. Let’s use it. 93
    94. Job scheduling Sometimes you need some code to fire on a recurring basis, outside of the web context. 94
    95. Job Scheduling •Nightly batches •Polling RSS •Checking email •Watching directories 95
    96. Jobs app/jobs/**/*.rb 96
    97. Job class app/jobs/twitter_sender.rb class TwitterSender < JBoss::Jobs::BaseJob def run new_twigs = Twig.find( :all, :conditions=>[ 'created_at >= ?', Time.now - 30.minutes ] ) return if new_twigs.empty? tweet( new_twigs.size ) end def tweet(num_new_twigs) .. end end 97
    98. Job schedule config/jobs.yml twitter.sender: description: Send a tweet cron: 0 */30 * * * ? job: TwitterSender 98
    99. Job schedule config/jobs.yml twitter.sender: description: Send a tweet cron: 0 */30 * * * ? job: TwitterSender 99
    100. Job schedule config/jobs.yml twitter.sender: description: Send a tweet cron: 0 */30 * * * ? job: TwitterSender 100
    101. Job schedule config/jobs.yml twitter.sender: description: Send a tweet cron: 0 */30 * * * ? job: TwitterSender 101
    102. Job schedule config/jobs.yml twitter.sender: description: Send a tweet cron: 0 */30 * * * ? job: TwitterSender 102
    103. Redeploy the app $ rake jboss:rails:deploy 103
    104. Why redeploy? Jobs are deployed when your app is deployed. Adding a job means you need to redeploy your app. 104
    105. Ta-da! [RubyJob] Starting Ruby job: twiggl.twitter.sender ... [STDOUT] twittering [1 new twigs!] 105
    106. Hot, hot code Once your job is deployed, you can continue to edit the actual service method. 106
    107. No further redeployment is necessary, unless you add jobs or alter the schedule. 107
    108. Some More Possibilities Message Queues (MQ/JMS) Legacy/JCA integration WS style web services... 108
    109. Ruby Databinding JBoss-Rails provides automatic databinding to XMLSchema types. 109
    110. Ruby Databinding When WS deployed, the WSDL is examined and real Ruby classes are created. 110
    111. Shifting gears... 111
    112. What are rules? Business rules Declarative statements Logic/reasoning 112
    113. What are rules? Capture domain expert knowledge as statements/assertions of truth (aka: business rules) 113
    114. What are rules? An executable knowledge base 114
    115. Drools Drools provides a runtime, compiler and tools to develop and manage executable knowledge bases (all open source of course) 115
    116. For example: rule “age and history compliance” when Driver(age < 25, sex=”M”) not Accident(severity > 3) not Infringement(type==”dui”) then approveDriver(“Let this one through”) end 116
    117. For example: rule “age and history compliance” when Driver(age < 25, sex=”M”) not Accident(severity > 3) not Infringement(type==”dui”) then approveDriver(“Let this one through”) end 117
    118. For example: rule “age and history compliance” when Driver(age < 25, sex=”M”) not Accident(severity > 3) not Infringement(type==”dui”) then approveDriver(“Let this one through”) end 118
    119. For example: rule “age and history compliance” when Driver(age < 25, sex=”M”) not Accident(severity > 3) not Infringement(type==”dui”) then approveDriver(“Let this one through”) end 119
    120. For example: rule “age and history compliance” when Driver(age < 25, sex=”M”) not Accident(severity > 3) not Infringement(type==”dui”) then approveDriver(“Let this one through”) end 120
    121. For example: rule “age and history compliance” when Driver(age < 25, sex=”M”) not Accident(severity > 3) not Infringement(type==”dui”) then approveDriver(“Let this one through”) end 121
    122. For example: rule “age and history compliance” when Driver(age < 25, sex=”M”) not Accident(severity > 3) not Infringement(type==”dui”) then approveDriver(“Let this one through”) end 122
    123. Why? You have domain experts The rules change Anti-spaghetti if else if else if else ... 123
    124. 124
    125. 125
    126. 126
    127. 127
    128. The Guvnor.. Repository and Web interface 128
    129. 129
    130. 130
    131. 131
    132. 132
    133. 133
    134. 134
    135. How? In process on the JVM As a decision service 135
    136. Where? Logistics (Fedex – talk at J1) Insurance, risk, fraud etc.. All domains.. 136
    137. Questions! For more info: Contact me: http://twitter.com/michaelneale http://oddthesis.org/theses/jboss-rails/projects/jboss-rails http://jboss.org/drools 137
    SlideShare Zeitgeist 2009

    + Michael NealeMichael Neale Nominate

    custom

    916 views, 0 favs, 1 embeds more stats

    Talk about Rails + JBoss AS 5, and also an into to more

    More info about this document

    © All Rights Reserved

    Go to text version

    • Total Views 916
      • 872 on SlideShare
      • 44 from embeds
    • Comments 0
    • Favorites 0
    • Downloads 22
    Most viewed embeds
    • 44 views on http://michaelneale.blogspot.com

    more

    All embeds
    • 44 views on http://michaelneale.blogspot.com

    less

    Flagged as inappropriate Flag as inappropriate
    Flag as inappropriate

    Select your reason for flagging this presentation as inappropriate. If needed, use the feedback form to let us know more details.

    Cancel
    File a copyright complaint
    Having problems? Go to our helpdesk?

    Categories