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