jaoo michael neale 09

Post on 12-Sep-2014

2.493 Views

Category:

Technology

3 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

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