JBoss
  Rules, Rails
JAOO, Australia, 2009
Sydney, Brisbane
Michael Neale
JBoss R&D
Red Hat Middleware




               ...
Michael Neale
R&D on Drools (rule engine).
Open source history (user -> fulltime
  developer).
Contribute to other jboss a...
Agenda
•Doing more with less...
•But isn't java hard/slow?
•Quick introduction to Rails basics
•Setting up JBoss for Rails...
More, with less
Does any one need to:
 Build apps of growing complexity
 Do it quicker and cheaper
 Cope with people chang...
Drools:
 Logic and declarative programming for
   developers
 User friendly GUIs and management
   tools for the rest
 All...
Rails
 Popular RESTful web-app framework
   (full stack)
 Runs just fine on the JVM
 Famous for productivity




          ...
Why the JVM?




        7
Its the platform..
Not the language !




                     8
9
A fan...


Oh that reminds me, twitter?




                  10
Languages

Ruby
Scala **
Groovy
Clojure
Java7????


            11
So not necessarily...
Big heavy and bloated
But it is a platform...




                     12
Introduction to
Ruby-on-Rails

       13
What is Rails?
Rails is a “lightweight”
MVC framework for
building websites in
Ruby.
           14
Rails MVC

•ActiveRecord for the models
• ERb templates for the view


•Simple ruby classes for the
  controllers

       ...
ActiveRecord

Definitely is not
Hibernate, but works
well-enough.

           16
ActiveRecord
class Comment < ActiveRecord::Base

 belongs_to :post
 belongs_to :user

 validate_presence_of :text
 ...

en...
ERb Templates
ERb allows snippets of
Ruby to be embedded
within HTML or other
templates.
             18
ERb Templates
<p>
There are <%= @post.comments.size %>
new comments since your last visit:
</p>

<% for comment in @post.c...
ActionController
Your ActionController sub-
classes provides the logic
behind the pages and
forms.
            20
ActionController
class CommentsController < ApplicationController

 before_filter :load_post

 def create
  @comment = @pos...
ActionController
                                                   Actions
class CommentsController < ApplicationControll...
ActionController
                                                   Filters
class CommentsController < ApplicationControll...
Where’s the Java?
JRuby is a full and fast
Ruby interpreter built on
top of the Java Virtual
Machine.
            24
JRuby
JRuby is actively
developed by Charlie
Nutter, Thomas Enebo,
and others.
              25
Run Rails in the
JVM
After solving a few
issues, Rails runs
easily within most any
servlet container.
           26
Why JBoss, then?
•JBoss provides a perfectly nice servlet
  container.

•JBoss provides a whole lot more, too:
 •JMS
 • Tr...
Rails is not enough
Rails is a great
solution...

    for the web.
              28
Beyond Rails
Apply the Ruby and
Rails philosophies to
enterprise-grade
services.
            29
Ruby is just a
syntax
Approach Ruby as just
another syntax for
driving JEE/JVM
technologies.
          30
Let’s get
started.



     31
Ingredients
    JDK6
    JBoss AS5
    JRuby
    Rails
    JBoss-Rails

          32
JDK6


• OpenJDK is very nice.

•Apple’s JDK6 works just
 fine.


             33
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/
  creati...
Set $JBOSS_HOME

$ cd jboss-5.0.1.GA

$ export JBOSS_HOME=$PWD

$ echo $JBOSS_HOME
/Users/mic/jboss-5.0.1.GA

            ...
Install JRuby

$ unzip jruby-bin-1.2.0RC2.zip
Archive: jruby-bin-1.2.0RC2.zip
  creating: jruby-1.2.0RC2/
  creating: jrub...
Prefer JRuby


$ cd jruby-1.2.0RC2/
$ export JRUBY_HOME=$PWD
$ export
PATH=$JRUBY_HOME/bin:$PATH




               37
JRuby path
This pulls things like
rake and gem from
JRuby’s path instead of
C-Ruby’s.
            38
JBoss-Rails
                The Deployer


The first part of JBoss-
Rails is the deployer.

           39
JBoss-Rails
               The Deployer

The deployer makes
JBoss AS5 Rails-
aware.

          40
JBoss-Rails
                 The Deployer

Install it into the
server’s deployers/
directory

            41
Pick a Profile

AS5 provides several
configuration
profiles.
           42
The default profile


 $JBOSS_HOME/server/default/




             43
Drop in the
deployer




         44
(or copy it)


$ cp jboss-rails-deployer.jar 
 $JBOSS_HOME/server/default/deployers/




                   45
Remove ROOT.war


$ rm -Rf $JBOSS_HOME/server/*/deploy/ROOT.war/




                      46
JBoss-Rails
           jboss-rails-support

The second part of
JBoss-Rails is
application-support
library.
              47
JBoss-Rails
           jboss-rails-support


It goes right into your Rails
app.

   So we need a Rails app.

             ...
Install Rails

$ gem install rails --version 2.2.2
Successfully installed   activesupport-2.2.2
Successfully installed   a...
Create an app
$ rails twiggl
  create
  create   app/controllers
  create   app/helpers
  create   app/models
  create   a...
Freeze Rails
$ rake rails:freeze:gems
Freezing to the gems for Rails 2.2.2
rm -rf vendor/rails
mkdir -p vendor/rails
cd ve...
Why freeze?
Relying on system-wide
gems is a bad idea, and
impossible with JBoss-
Rails.
           52
JBoss-Rails
           jboss-rails-support

Now we can install the
application-support
library.

              53
JBoss-Rails
                       jboss-rails-support
$ cd vendor/plugins/
$ unzip ~/downloads/jboss-rails-support.zip
Ar...
Apps need
a database.


       55
PostgresSQL




        56
Create the DB stuff
postgres> create user twiggl
       with password 'twiggl';
CREATE ROLE
postgres> create database
    ...
Set up your app
                 config/database.yml

development:
 adapter: postgresql
 database: twiggl_development
 user...
Set up your app
                 config/database.yml

development:
 adapter: postgresql
   Just like
 database: twiggl_deve...
Database access

Rails on JBoss can take
advantage of JDBC
drivers.

           60
Easy JDBC
The jboss-rails-support
library makes it easy to
set up your Rails app for
JDBC.
            61
Install the JDBC
gems
$ rake jboss:gems:jdbc:install




                 62
Install the JDBC
gems       activerecord-jdbc
$ rake jboss:gems:jdbc:install
INFO: Installing activerecord-jdbc
   adapter...
Install the JDBC
gems           the result




           64
You’re ready!
•AS5 is ready to serve Rails apps.
•A bare database is setup.
•A bare Rails app is setup.
 • Configured to ac...
Deploying a Rails
App
The jboss-rails-
support rake tasks
handle deploying and
undeploying.
           66
From your app


$ rake jboss:rails:deploy
Deployed twiggl




                  67
Deployment Descriptor
  $JBOSS_HOME/server/default/deploy/twiggl-
                                   rails.yml



applicat...
Wait, AS isn’t
running!

        69
Start AS
$ rake jboss:as:run
(in /Users/bob/twiggl)
JBoss-Rails server: /Users/bob/jboss-5.0.1.GA/server/default
=========...
localhost:8080/index.html




           71
Create models
$ jruby ./script/generate resource twig




                      72
Create models
$ jruby ./script/generate resource twig
  ...
  create   app/models/twig.rb




                            ...
Create models
$ jruby ./script/generate resource twig
  ...
  create   app/models/twig.rb
  ...
  create   db/migrate/2009...
Create models
$ jruby ./script/generate resource twig
  ...
  create app/models/twig.rb
  ...
  create db/migrate/20090308...
Create models
$ jruby ./script/generate resource twig
  ...
  create app/models/twig.rb
  ...
  create db/migrate/20090308...
Create models
         db/migrate/*_create_twigs.rb
class CreateTwigs < ActiveRecord::Migration
 def self.up
   create_tab...
Blow it into the DB

$ rake db:migrate
(in /Users/bob/twiggl)
== CreateTwigs: migrating
===============
-- create_table(:t...
Rough in a controller
app/controllers/twigs_controller.rb

class TwigsController < ApplicationController

 def index
  @tw...
Rough in a template
  app/views/twigs/index.html.erb
<p>
There are <%= @twigs.size %> twigs.
</p>

<% for twig in @twigs %...
Rough in a template
  app/views/twigs/index.html.erb
<p>
There are <%= @twigs.size %> twigs.
</p>

<% for twig in @twigs %...
Rough in a template
  app/views/twigs/index.html.erb
<p>
There are <%= @twigs.size %> twigs.
</p>

<% for twig in @twigs %...
Hit it!




          83
We didn’t restart
AS.
And we didn’t redeploy
our app, either. That’s
okay, we’re hacking hot
code.
           84
Twig management
app/controllers/twigs_controller.rb
class TwigsController < ApplicationController

 def new
  @twig = Twig...
Twig form
    app/views/twigs/new.html.erb


<% form_for @twig do %>
 <%= label :twig, :name %>
 <%= text_field :twig, :nam...
Twig management
app/controllers/twigs_controller.rb

class TwigsController < ApplicationController

 def show
  @twig = Tw...
Twig view
  app/views/twigs/show.html.erb



<% div_for @twig do %>
 <h1><%= @twig.name %></h1>
<% end %>




            ...
Create a twig




         89
Create a twig




         90
Back to the index




         91
It’s just like
regular Rails.

        92
Beyond Rails
But, we have the entire
freakin’ JBoss AS5
there.

         Let’s use it.
            93
Job scheduling
Sometimes you need
some code to fire on a
recurring basis, outside of
the web context.
            94
Job Scheduling

•Nightly batches
•Polling RSS
•Checking email

•Watching directories

                 95
Jobs
            app/jobs/**/*.rb




       96
Job class
            app/jobs/twitter_sender.rb
class TwitterSender < JBoss::Jobs::BaseJob

  def run
    new_twigs = Twi...
Job schedule
                      config/jobs.yml



twitter.sender:
 description: Send a tweet
 cron: 0 */30 * * * ?
 job...
Job schedule
                      config/jobs.yml



twitter.sender:
 description: Send a tweet
 cron: 0 */30 * * * ?
 job...
Job schedule
                      config/jobs.yml



twitter.sender:
 description: Send a tweet
 cron: 0 */30 * * * ?
 job...
Job schedule
                       config/jobs.yml



twitter.sender:
 description: Send a tweet
 cron: 0 */30 * * * ?
 jo...
Job schedule
                       config/jobs.yml



twitter.sender:
 description: Send a tweet
 cron: 0 */30 * * * ?
 jo...
Redeploy the app


$ rake jboss:rails:deploy




                 103
Why redeploy?
Jobs are deployed when
your app is deployed.
Adding a job means you
need to redeploy your
app.
            1...
Ta-da!

[RubyJob] Starting Ruby job:
twiggl.twitter.sender

...

[STDOUT] twittering [1 new twigs!]



                   ...
Hot, hot code
Once your job is
deployed, you can
continue to edit the
actual service method.
           106
No further
redeployment is
necessary, unless you
add jobs or alter the
schedule.
             107
Some More Possibilities
Message Queues (MQ/JMS)

Legacy/JCA integration

WS style web services...

              108
Ruby Databinding

JBoss-Rails provides
automatic databinding
to XMLSchema types.

          109
Ruby Databinding
When WS deployed, the
WSDL is examined and
real Ruby classes are
created.
           110
Shifting gears...




          111
What are rules?

Business rules

Declarative statements

Logic/reasoning

                 112
What are rules?
Capture domain expert
knowledge as
statements/assertions of truth
(aka: business rules)

               113
What are rules?


An executable knowledge base




             114
Drools
Drools provides a runtime,
compiler and tools to develop
and manage executable
knowledge bases

(all open source of...
For example:
rule “age and history compliance”
  when
    Driver(age < 25, sex=”M”)
    not Accident(severity > 3)
    not...
For example:
rule “age and history compliance”
  when
    Driver(age < 25, sex=”M”)
    not Accident(severity > 3)
    not...
For example:
rule “age and history compliance”
  when
    Driver(age < 25, sex=”M”)
    not Accident(severity > 3)
    not...
For example:
rule “age and history compliance”
  when
    Driver(age < 25, sex=”M”)
    not Accident(severity > 3)
    not...
For example:
rule “age and history compliance”
  when
    Driver(age < 25, sex=”M”)
    not Accident(severity > 3)
    not...
For example:
rule “age and history compliance”
  when
    Driver(age < 25, sex=”M”)
    not Accident(severity > 3)
    not...
For example:
rule “age and history compliance”
  when
    Driver(age < 25, sex=”M”)
    not Accident(severity > 3)
    not...
Why?
You have domain experts

The rules change

Anti-spaghetti

if else if else if else ...

                             ...
124
125
126
127
The Guvnor..


Repository and Web interface



              128
129
130
131
132
133
134
How?

In process on the JVM

As a decision service


             135
Where?
Logistics (Fedex – talk at J1)

Insurance, risk, fraud etc..

All domains..


                136
Questions!
For more info:


Contact me: http://twitter.com/michaelneale


http://oddthesis.org/theses/jboss-rails/projects...
Upcoming SlideShare
Loading in …5
×

Jaoo Michael Neale 09

1,778 views

Published on

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

Published in: Technology
2 Comments
0 Likes
Statistics
Notes
  • Good Day, My Name is Ms Melody Turay,I Offer out a loan interest rate is 3%. Do you need an Xmas loan or any kind of loan? if yes, Email: mrs.melodybestloans@gmail.com for more information We only offer out in, Dollars, Pounce, Euro.. Full Name: Loan Amount: Duration: Country: Address: Phone Number NOTE: Make sure your response are only forwarded to this Email: mrs.melodybestloans@gmail.com God Bless. Ms Melody Turay.
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • very good
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Be the first to like this

No Downloads
Views
Total views
1,778
On SlideShare
0
From Embeds
0
Number of Embeds
51
Actions
Shares
0
Downloads
35
Comments
2
Likes
0
Embeds 0
No embeds

No notes for slide

Jaoo Michael Neale 09

  1. 1. JBoss Rules, Rails JAOO, Australia, 2009 Sydney, Brisbane Michael Neale JBoss R&D Red Hat Middleware 1
  2. 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. 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. 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. 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. 6. Rails Popular RESTful web-app framework (full stack) Runs just fine on the JVM Famous for productivity 6
  7. 7. Why the JVM? 7
  8. 8. Its the platform.. Not the language ! 8
  9. 9. 9
  10. 10. A fan... Oh that reminds me, twitter? 10
  11. 11. Languages Ruby Scala ** Groovy Clojure Java7???? 11
  12. 12. So not necessarily... Big heavy and bloated But it is a platform... 12
  13. 13. Introduction to Ruby-on-Rails 13
  14. 14. What is Rails? Rails is a “lightweight” MVC framework for building websites in Ruby. 14
  15. 15. Rails MVC •ActiveRecord for the models • ERb templates for the view •Simple ruby classes for the controllers 15
  16. 16. ActiveRecord Definitely is not Hibernate, but works well-enough. 16
  17. 17. ActiveRecord class Comment < ActiveRecord::Base belongs_to :post belongs_to :user validate_presence_of :text ... end 17
  18. 18. ERb Templates ERb allows snippets of Ruby to be embedded within HTML or other templates. 18
  19. 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. 20. ActionController Your ActionController sub- classes provides the logic behind the pages and forms. 20
  21. 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. 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. 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. 24. Where’s the Java? JRuby is a full and fast Ruby interpreter built on top of the Java Virtual Machine. 24
  25. 25. JRuby JRuby is actively developed by Charlie Nutter, Thomas Enebo, and others. 25
  26. 26. Run Rails in the JVM After solving a few issues, Rails runs easily within most any servlet container. 26
  27. 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. 28. Rails is not enough Rails is a great solution... for the web. 28
  29. 29. Beyond Rails Apply the Ruby and Rails philosophies to enterprise-grade services. 29
  30. 30. Ruby is just a syntax Approach Ruby as just another syntax for driving JEE/JVM technologies. 30
  31. 31. Let’s get started. 31
  32. 32. Ingredients JDK6 JBoss AS5 JRuby Rails JBoss-Rails 32
  33. 33. JDK6 • OpenJDK is very nice. •Apple’s JDK6 works just fine. 33
  34. 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. 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. 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. 37. Prefer JRuby $ cd jruby-1.2.0RC2/ $ export JRUBY_HOME=$PWD $ export PATH=$JRUBY_HOME/bin:$PATH 37
  38. 38. JRuby path This pulls things like rake and gem from JRuby’s path instead of C-Ruby’s. 38
  39. 39. JBoss-Rails The Deployer The first part of JBoss- Rails is the deployer. 39
  40. 40. JBoss-Rails The Deployer The deployer makes JBoss AS5 Rails- aware. 40
  41. 41. JBoss-Rails The Deployer Install it into the server’s deployers/ directory 41
  42. 42. Pick a Profile AS5 provides several configuration profiles. 42
  43. 43. The default profile $JBOSS_HOME/server/default/ 43
  44. 44. Drop in the deployer 44
  45. 45. (or copy it) $ cp jboss-rails-deployer.jar $JBOSS_HOME/server/default/deployers/ 45
  46. 46. Remove ROOT.war $ rm -Rf $JBOSS_HOME/server/*/deploy/ROOT.war/ 46
  47. 47. JBoss-Rails jboss-rails-support The second part of JBoss-Rails is application-support library. 47
  48. 48. JBoss-Rails jboss-rails-support It goes right into your Rails app. So we need a Rails app. 48
  49. 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. 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. 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. 52. Why freeze? Relying on system-wide gems is a bad idea, and impossible with JBoss- Rails. 52
  53. 53. JBoss-Rails jboss-rails-support Now we can install the application-support library. 53
  54. 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. 55. Apps need a database. 55
  56. 56. PostgresSQL 56
  57. 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. 58. Set up your app config/database.yml development: adapter: postgresql database: twiggl_development username: twiggl password: twiggl host: localhost encoding: UTF8 58
  59. 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. 60. Database access Rails on JBoss can take advantage of JDBC drivers. 60
  61. 61. Easy JDBC The jboss-rails-support library makes it easy to set up your Rails app for JDBC. 61
  62. 62. Install the JDBC gems $ rake jboss:gems:jdbc:install 62
  63. 63. Install the JDBC gems activerecord-jdbc $ rake jboss:gems:jdbc:install INFO: Installing activerecord-jdbc adapter-0.8.3 63
  64. 64. Install the JDBC gems the result 64
  65. 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. 66. Deploying a Rails App The jboss-rails- support rake tasks handle deploying and undeploying. 66
  67. 67. From your app $ rake jboss:rails:deploy Deployed twiggl 67
  68. 68. Deployment Descriptor $JBOSS_HOME/server/default/deploy/twiggl- rails.yml application: RAILS_ENV: development RAILS_ROOT: /Users/bob/twiggl web: context: / 68
  69. 69. Wait, AS isn’t running! 69
  70. 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. 71. localhost:8080/index.html 71
  72. 72. Create models $ jruby ./script/generate resource twig 72
  73. 73. Create models $ jruby ./script/generate resource twig ... create app/models/twig.rb 73
  74. 74. Create models $ jruby ./script/generate resource twig ... create app/models/twig.rb ... create db/migrate/20090308180254_create_twigs.rb 74
  75. 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. 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. 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. 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. 79. Rough in a controller app/controllers/twigs_controller.rb class TwigsController < ApplicationController def index @twigs = Twig.find( :all ) end end 79
  80. 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. 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. 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. 83. Hit it! 83
  84. 84. We didn’t restart AS. And we didn’t redeploy our app, either. That’s okay, we’re hacking hot code. 84
  85. 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. 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. 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. 88. Twig view app/views/twigs/show.html.erb <% div_for @twig do %> <h1><%= @twig.name %></h1> <% end %> 88
  89. 89. Create a twig 89
  90. 90. Create a twig 90
  91. 91. Back to the index 91
  92. 92. It’s just like regular Rails. 92
  93. 93. Beyond Rails But, we have the entire freakin’ JBoss AS5 there. Let’s use it. 93
  94. 94. Job scheduling Sometimes you need some code to fire on a recurring basis, outside of the web context. 94
  95. 95. Job Scheduling •Nightly batches •Polling RSS •Checking email •Watching directories 95
  96. 96. Jobs app/jobs/**/*.rb 96
  97. 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. 98. Job schedule config/jobs.yml twitter.sender: description: Send a tweet cron: 0 */30 * * * ? job: TwitterSender 98
  99. 99. Job schedule config/jobs.yml twitter.sender: description: Send a tweet cron: 0 */30 * * * ? job: TwitterSender 99
  100. 100. Job schedule config/jobs.yml twitter.sender: description: Send a tweet cron: 0 */30 * * * ? job: TwitterSender 100
  101. 101. Job schedule config/jobs.yml twitter.sender: description: Send a tweet cron: 0 */30 * * * ? job: TwitterSender 101
  102. 102. Job schedule config/jobs.yml twitter.sender: description: Send a tweet cron: 0 */30 * * * ? job: TwitterSender 102
  103. 103. Redeploy the app $ rake jboss:rails:deploy 103
  104. 104. Why redeploy? Jobs are deployed when your app is deployed. Adding a job means you need to redeploy your app. 104
  105. 105. Ta-da! [RubyJob] Starting Ruby job: twiggl.twitter.sender ... [STDOUT] twittering [1 new twigs!] 105
  106. 106. Hot, hot code Once your job is deployed, you can continue to edit the actual service method. 106
  107. 107. No further redeployment is necessary, unless you add jobs or alter the schedule. 107
  108. 108. Some More Possibilities Message Queues (MQ/JMS) Legacy/JCA integration WS style web services... 108
  109. 109. Ruby Databinding JBoss-Rails provides automatic databinding to XMLSchema types. 109
  110. 110. Ruby Databinding When WS deployed, the WSDL is examined and real Ruby classes are created. 110
  111. 111. Shifting gears... 111
  112. 112. What are rules? Business rules Declarative statements Logic/reasoning 112
  113. 113. What are rules? Capture domain expert knowledge as statements/assertions of truth (aka: business rules) 113
  114. 114. What are rules? An executable knowledge base 114
  115. 115. Drools Drools provides a runtime, compiler and tools to develop and manage executable knowledge bases (all open source of course) 115
  116. 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. 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. 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. 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. 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. 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. 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. 123. Why? You have domain experts The rules change Anti-spaghetti if else if else if else ... 123
  124. 124. 124
  125. 125. 125
  126. 126. 126
  127. 127. 127
  128. 128. The Guvnor.. Repository and Web interface 128
  129. 129. 129
  130. 130. 130
  131. 131. 131
  132. 132. 132
  133. 133. 133
  134. 134. 134
  135. 135. How? In process on the JVM As a decision service 135
  136. 136. Where? Logistics (Fedex – talk at J1) Insurance, risk, fraud etc.. All domains.. 136
  137. 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

×