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
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
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
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
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
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
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