jaoo michael neale 09

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

Post on 12-Sep-2014

2.483 views

Category:

Technology


3 download

DESCRIPTION

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

TRANSCRIPT

Page 1: Jaoo Michael Neale 09

1

JBoss Rules, RailsJAOO, Australia, 2009Sydney, Brisbane

Michael NealeJBoss R&DRed Hat Middleware

Page 2: Jaoo Michael Neale 09

2

Michael NealeR&D on Drools (rule engine).Open source history (user -> fulltime

developer).Contribute to other jboss and non jboss

projectsme on the web:

www.michaelneale.net, twitter.com/michaelneale, michaelneale.blogspot.com

Page 3: Jaoo Michael Neale 09

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

Page 4: Jaoo Michael Neale 09

4

More, with lessDoes any one need to:

Build apps of growing complexityDo it quicker and cheaperCope with people changing their mindAll the timeAt runtime

If not – you can go !

Page 5: Jaoo Michael Neale 09

5

Drools:Logic and declarative programming for

developersUser friendly GUIs and management

tools for the restAllows controlled changes to business

logic (even at runtime)

Page 6: Jaoo Michael Neale 09

6

RailsPopular RESTful web-app framework

(full stack)Runs just fine on the JVMFamous for productivity

Page 7: Jaoo Michael Neale 09

7

Why the JVM?

Page 8: Jaoo Michael Neale 09

8

Its the platform..Not the language !

Page 9: Jaoo Michael Neale 09

9

Page 10: Jaoo Michael Neale 09

10

A fan...

Oh that reminds me, twitter?

Page 11: Jaoo Michael Neale 09

11

Languages

RubyScala **GroovyClojureJava7????

Page 12: Jaoo Michael Neale 09

12

So not necessarily...Big heavy and bloatedBut it is a platform...

Page 13: Jaoo Michael Neale 09

13

Introduction to Ruby-on-Rails

Page 14: Jaoo Michael Neale 09

14

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

Page 15: Jaoo Michael Neale 09

15

Rails MVC

•ActiveRecord for the models

•ERb templates for the view

•Simple ruby classes for the controllers

Page 16: Jaoo Michael Neale 09

16

ActiveRecord

Definitely is not Hibernate, but works well-enough.

Page 17: Jaoo Michael Neale 09

17

ActiveRecordclass Comment < ActiveRecord::Base

belongs_to :post belongs_to :user

validate_presence_of :text ...

end

Page 18: Jaoo Michael Neale 09

18

ERb Templates

ERb allows snippets of Ruby to be embedded within HTML or other templates.

Page 19: Jaoo Michael Neale 09

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

Page 20: Jaoo Michael Neale 09

20

ActionControllerYour ActionController sub-classes provides the logic behind the pages and forms.

Page 21: Jaoo Michael Neale 09

21

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

Page 22: Jaoo Michael Neale 09

22

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

Actions

Page 23: Jaoo Michael Neale 09

23

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

Filters

Page 24: Jaoo Michael Neale 09

24

Where’s the Java?JRuby is a full and fast Ruby interpreter built on top of the Java Virtual Machine.

Page 25: Jaoo Michael Neale 09

25

JRubyJRuby is actively developed by Charlie Nutter, Thomas Enebo, and others.

Page 26: Jaoo Michael Neale 09

26

Run Rails in the JVMAfter solving a few issues, Rails runs easily within most any servlet container.

Page 27: Jaoo Michael Neale 09

27

Why JBoss, then?

•JBoss provides a perfectly nice servlet container.

•JBoss provides a whole lot more, too:

•JMS•Transactions•Rules-Engine•Telecom

Page 28: Jaoo Michael Neale 09

28

Rails is not enoughRails is a great solution...

for the web.

Page 29: Jaoo Michael Neale 09

29

Beyond RailsApply the Ruby and Rails philosophies to enterprise-grade services.

Page 30: Jaoo Michael Neale 09

30

Ruby is just a syntaxApproach Ruby as just another syntax for driving JEE/JVM technologies.

Page 31: Jaoo Michael Neale 09

31

Let’s get started.

Page 32: Jaoo Michael Neale 09

32

IngredientsJDK6JBoss AS5JRubyRailsJBoss-Rails

Page 33: Jaoo Michael Neale 09

33

JDK6

•OpenJDK is very nice.

•Apple’s JDK6 works just fine.

Page 34: Jaoo Michael Neale 09

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

Page 35: Jaoo Michael Neale 09

35

Set $JBOSS_HOME

$ cd jboss-5.0.1.GA

$ export JBOSS_HOME=$PWD

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

Page 36: Jaoo Michael Neale 09

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

Page 37: Jaoo Michael Neale 09

37

Prefer JRuby

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

Page 38: Jaoo Michael Neale 09

38

JRuby pathThis pulls things like rake and gem from JRuby’s path instead of C-Ruby’s.

Page 39: Jaoo Michael Neale 09

39

JBoss-Rails

The first part of JBoss-Rails is the deployer.

The Deployer

Page 40: Jaoo Michael Neale 09

40

JBoss-Rails

The deployer makes JBoss AS5 Rails-aware.

The Deployer

Page 41: Jaoo Michael Neale 09

41

JBoss-Rails

Install it into the server’s deployers/ directory

The Deployer

Page 42: Jaoo Michael Neale 09

42

Pick a Profile

AS5 provides several configuration profiles.

Page 43: Jaoo Michael Neale 09

43

The default profile

$JBOSS_HOME/server/default/

Page 44: Jaoo Michael Neale 09

44

Drop in the deployer

Page 45: Jaoo Michael Neale 09

45

(or copy it)

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

Page 46: Jaoo Michael Neale 09

46

Remove ROOT.war

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

Page 47: Jaoo Michael Neale 09

47

JBoss-Rails

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

jboss-rails-support

Page 48: Jaoo Michael Neale 09

48

JBoss-Rails

It goes right into your Rails app.

So we need a Rails app.

jboss-rails-support

Page 49: Jaoo Michael Neale 09

49

Install Rails

$ gem install rails --version 2.2.2Successfully installed activesupport-2.2.2Successfully installed activerecord-2.2.2Successfully installed actionpack-2.2.2Successfully installed actionmailer-2.2.2Successfully installed activeresource-2.2.2Successfully installed rails-2.2.26 gems installed

Page 50: Jaoo Michael Neale 09

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

Page 51: Jaoo Michael Neale 09

51

Freeze Rails$ rake rails:freeze:gemsFreezing to the gems for Rails 2.2.2rm -rf vendor/railsmkdir -p vendor/railscd vendor/railsUnpacked gem: '/Users/bob/twiggl/vendor/rails/activesupport-2.2.2'mv activesupport-2.2.2 activesupportUnpacked gem: '/Users/bob/twiggl/vendor/rails/activerecord-2.2.2'mv activerecord-2.2.2 activerecordUnpacked gem: '/Users/bob/twiggl/vendor/rails/actionpack-2.2.2'mv actionpack-2.2.2 actionpackUnpacked gem: '/Users/bob/twiggl/vendor/rails/actionmailer-2.2.2'mv actionmailer-2.2.2 actionmailerUnpacked gem: '/Users/bob/twiggl/vendor/rails/activeresource-2.2.2'mv activeresource-2.2.2 activeresourceUnpacked gem: '/Users/bob/twiggl/vendor/rails/rails-2.2.2'cd -

Page 52: Jaoo Michael Neale 09

52

Why freeze?Relying on system-wide gems is a bad idea, and impossible with JBoss-Rails.

Page 53: Jaoo Michael Neale 09

53

JBoss-Rails

Now we can install the application-support library.

jboss-rails-support

Page 54: Jaoo Michael Neale 09

54

JBoss-Rails$ cd vendor/plugins/$ unzip ~/downloads/jboss-rails-support.zipArchive: /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 .....

jboss-rails-support

Page 55: Jaoo Michael Neale 09

55

Apps need a database.

Page 56: Jaoo Michael Neale 09

56

PostgresSQL

Page 57: Jaoo Michael Neale 09

57

Create the DB stuff

postgres> create user twiggl with password 'twiggl';CREATE ROLEpostgres> create database twiggl_development with owner twiggl encoding 'UTF8';CREATE DATABASE

Page 58: Jaoo Michael Neale 09

58

Set up your app

development: adapter: postgresql database: twiggl_development username: twiggl password: twiggl host: localhost encoding: UTF8

config/database.yml

Page 59: Jaoo Michael Neale 09

59

Set up your app

development: adapter: postgresql database: twiggl_development username: twiggl password: twiggl host: localhost encoding: UTF8

config/database.yml

Just likeregular Rails!

Page 60: Jaoo Michael Neale 09

60

Database access

Rails on JBoss can take advantage of JDBC drivers.

Page 61: Jaoo Michael Neale 09

61

Easy JDBCThe jboss-rails-support library makes it easy to set up your Rails app for JDBC.

Page 62: Jaoo Michael Neale 09

62

Install the JDBC gems$ rake jboss:gems:jdbc:install

Page 63: Jaoo Michael Neale 09

63

Install the JDBC gems$ rake jboss:gems:jdbc:installINFO: Installing activerecord-jdbc adapter-0.8.3

activerecord-jdbc

Page 64: Jaoo Michael Neale 09

64

Install the JDBC gems the result

Page 65: Jaoo Michael Neale 09

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.

Page 66: Jaoo Michael Neale 09

66

Deploying a Rails AppThe jboss-rails-support rake tasks handle deploying and undeploying.

Page 67: Jaoo Michael Neale 09

67

From your app

$ rake jboss:rails:deployDeployed twiggl

Page 68: Jaoo Michael Neale 09

68

Deployment Descriptor

application: RAILS_ENV: development RAILS_ROOT: /Users/bob/twigglweb: context: /

$JBOSS_HOME/server/default/deploy/twiggl-rails.yml

Page 69: Jaoo Michael Neale 09

69

Wait, AS isn’t running!

Page 70: Jaoo Michael Neale 09

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: null13:44:45,283 INFO [ServerImpl] Home Dir: /Users/bob/jboss-5.0.1.GA13:44:45,283 INFO [ServerImpl] Home URL: file:/Users/bob/jboss-5.0.1.GA/13:44:45,287 INFO [ServerImpl] Library URL: file:/Users/bob/jboss-5.0.1.GA/lib/13:44:45,288 INFO [ServerImpl] Patch URL: null13: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: default13:44:45,289 INFO [ServerImpl] Server Base Dir: /Users/bob/jboss-5.0.1.GA/server13:44:45,289 INFO [ServerImpl] Server Base URL: file:/Users/bob/jboss-5.0.1.GA/server/13:44:45,289 INFO [ServerImpl] Server Config 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/default13:44:45,289 INFO [ServerImpl] Server Home URL: file:/Users/bob/jboss-5.0.1.GA/server/default/

Page 71: Jaoo Michael Neale 09

71

localhost:8080/index.html

Page 72: Jaoo Michael Neale 09

72

Create models$ jruby ./script/generate resource twig

Page 73: Jaoo Michael Neale 09

73

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

Page 74: Jaoo Michael Neale 09

74

Create models$ jruby ./script/generate resource twig ... create app/models/twig.rb ... create db/migrate/20090308180254_create_twigs.rb

Page 75: Jaoo Michael Neale 09

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

Page 76: Jaoo Michael Neale 09

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

Page 77: Jaoo Michael Neale 09

77

Create models

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 endend

db/migrate/*_create_twigs.rb

Page 78: Jaoo Michael Neale 09

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

Page 79: Jaoo Michael Neale 09

79

Rough in a controller

class TwigsController < ApplicationController

def index @twigs = Twig.find( :all ) end end

app/controllers/twigs_controller.rb

Page 80: Jaoo Michael Neale 09

80

Rough in a template

<p>There are <%= @twigs.size %> twigs.</p>

<% for twig in @twigs %> <% div_for( twig ) do %> <%= twig.name %> <% end %><% end %>

app/views/twigs/index.html.erb

Page 81: Jaoo Michael Neale 09

81

Rough in a template<p>There are <%= @twigs.size %> twigs.</p>

<% for twig in @twigs %> <% div_for( twig ) do %> <%= twig.name %> <% end %><% end %>

app/views/twigs/index.html.erb

Page 82: Jaoo Michael Neale 09

82

Rough in a template<p>There are <%= @twigs.size %> twigs.</p>

<% for twig in @twigs %> <% div_for( twig ) do %> <%= twig.name %> <% end %><% end %>

app/views/twigs/index.html.erb

Page 83: Jaoo Michael Neale 09

83

Hit it!

Page 84: Jaoo Michael Neale 09

84

We didn’t restart AS.And we didn’t redeploy our app, either. That’s okay, we’re hacking hot code.

Page 85: Jaoo Michael Neale 09

85

Twig managementclass TwigsController < ApplicationController

def new @twig = Twig.new end

def create @twig = Twig.create( params[:twig] ) redirect_to @twig end end

app/controllers/twigs_controller.rb

Page 86: Jaoo Michael Neale 09

86

Twig form

<% form_for @twig do %> <%= label :twig, :name %> <%= text_field :twig, :name %> <%= submit_tag 'Create twig!' %><% end %>

app/views/twigs/new.html.erb

Page 87: Jaoo Michael Neale 09

87

Twig management

class TwigsController < ApplicationController

def show @twig = Twig.find_by_id( params[:id] ) redirect_to twigs_url unless @twig end end

app/controllers/twigs_controller.rb

Page 88: Jaoo Michael Neale 09

88

Twig view

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

app/views/twigs/show.html.erb

Page 89: Jaoo Michael Neale 09

89

Create a twig

Page 90: Jaoo Michael Neale 09

90

Create a twig

Page 91: Jaoo Michael Neale 09

91

Back to the index

Page 92: Jaoo Michael Neale 09

92

It’s just like regular Rails.

Page 93: Jaoo Michael Neale 09

93

Beyond RailsBut, we have the entire freakin’ JBoss AS5 there.

Let’s use it.

Page 94: Jaoo Michael Neale 09

94

Job schedulingSometimes you need some code to fire on a recurring basis, outside of the web context.

Page 95: Jaoo Michael Neale 09

95

Job Scheduling

•Nightly batches

•Polling RSS

•Checking email

•Watching directories

Page 96: Jaoo Michael Neale 09

96

Jobsapp/jobs/**/*.rb

Page 97: Jaoo Michael Neale 09

97

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

Job classapp/jobs/twitter_sender.rb

Page 98: Jaoo Michael Neale 09

98

Job schedule

twitter.sender: description: Send a tweet cron: 0 */30 * * * ? job: TwitterSender

config/jobs.yml

Page 99: Jaoo Michael Neale 09

99

Job schedule

twitter.sender: description: Send a tweet cron: 0 */30 * * * ? job: TwitterSender

config/jobs.yml

Page 100: Jaoo Michael Neale 09

100

Job schedule

twitter.sender: description: Send a tweet cron: 0 */30 * * * ? job: TwitterSender

config/jobs.yml

Page 101: Jaoo Michael Neale 09

101

Job schedule

twitter.sender: description: Send a tweet cron: 0 */30 * * * ? job: TwitterSender

config/jobs.yml

Page 102: Jaoo Michael Neale 09

102

Job schedule

twitter.sender: description: Send a tweet cron: 0 */30 * * * ? job: TwitterSender

config/jobs.yml

Page 103: Jaoo Michael Neale 09

103

Redeploy the app

$ rake jboss:rails:deploy

Page 104: Jaoo Michael Neale 09

104

Why redeploy?Jobs are deployed when your app is deployed. Adding a job means you need to redeploy your app.

Page 105: Jaoo Michael Neale 09

105

Ta-da!

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

...

[STDOUT] twittering [1 new twigs!]

Page 106: Jaoo Michael Neale 09

106

Hot, hot codeOnce your job is deployed, you can continue to edit the actual service method.

Page 107: Jaoo Michael Neale 09

107

No further redeployment is necessary, unless you add jobs or alter the schedule.

Page 108: Jaoo Michael Neale 09

108

Some More Possibilities Message Queues (MQ/JMS)

Legacy/JCA integration

WS style web services...

Page 109: Jaoo Michael Neale 09

109

Ruby Databinding

JBoss-Rails provides automatic databinding to XMLSchema types.

Page 110: Jaoo Michael Neale 09

110

Ruby DatabindingWhen WS deployed, the WSDL is examined and real Ruby classes are created.

Page 111: Jaoo Michael Neale 09

111

Shifting gears...

Page 112: Jaoo Michael Neale 09

112

What are rules?

Business rules

Declarative statements

Logic/reasoning

Page 113: Jaoo Michael Neale 09

113

What are rules?

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

Page 114: Jaoo Michael Neale 09

114

What are rules?

An executable knowledge base

Page 115: Jaoo Michael Neale 09

115

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

(all open source of course)

Page 116: Jaoo Michael Neale 09

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

Page 117: Jaoo Michael Neale 09

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

Page 118: Jaoo Michael Neale 09

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

Page 119: Jaoo Michael Neale 09

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

Page 120: Jaoo Michael Neale 09

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

Page 121: Jaoo Michael Neale 09

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

Page 122: Jaoo Michael Neale 09

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

Page 123: Jaoo Michael Neale 09

123

Why?You have domain experts

The rules change

Anti-spaghetti

if else if else if else ...

Page 124: Jaoo Michael Neale 09

124

Page 125: Jaoo Michael Neale 09

125

Page 126: Jaoo Michael Neale 09

126

Page 127: Jaoo Michael Neale 09

127

Page 128: Jaoo Michael Neale 09

128

The Guvnor..

Repository and Web interface

Page 129: Jaoo Michael Neale 09

129

Page 130: Jaoo Michael Neale 09

130

Page 131: Jaoo Michael Neale 09

131

Page 132: Jaoo Michael Neale 09

132

Page 133: Jaoo Michael Neale 09

133

Page 134: Jaoo Michael Neale 09

134

Page 135: Jaoo Michael Neale 09

135

How?

In process on the JVM

As a decision service

Page 136: Jaoo Michael Neale 09

136

Where?Logistics (Fedex – talk at J1)

Insurance, risk, fraud etc..

All domains..

Page 137: Jaoo Michael Neale 09

137

Questions!For more info:

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

http://oddthesis.org/theses/jboss-rails/projects/jboss-rails

http://jboss.org/drools