Monday August 13, 2007
First JRuby on Rails App in GlassFish V3
In a previous screencast, I showed how a Rails application can be deployed as WAR file on GlassFish V2. In GlassFish V3, the Grizzly connector by-passes the need to bundle a Rails application as WAR. Instead it directly invokes JRuby interpreter and deploys a Rails application without any modification.
This blog entry describes the exact steps to deploy your first JRuby application in GlassFish V3 Technology Preview builds.
c:\jruby-bin-1.0' (lets say JRUBY_HOME).JRUBY_HOME\bin" in your environment PATH.jruby -S gem install rails -y --no-rdocbin" directory. The output of the command looks like:C:\jruby-bin-1.0>gem install rails -y --no-rdoc Bulk updating Gem source index for: http://gems.rubyforge.org Successfully installed rails-1.2.3 Successfully installed activesupport-1.4.2 Successfully installed activerecord-1.15.3 Successfully installed actionpack-1.13.3 Successfully installed actionmailer-1.3.3 Successfully installed actionwebservice-1.2.3 Installing ri documentation for activesupport-1.4.2... Installing ri documentation for activerecord-1.15.3... Installing ri documentation for actionpack-1.13.3... While generating documentation for actionpack-1.13.3 ... MESSAGE: java.lang.ArrayIndexOutOfBoundsException: null ... RDOC args: --ri --op C://jruby-bin-1.0/lib/ruby/gems/1.8/doc/actionpack-1.13.3/ri --quiet lib (continuing with the rest of the installation) Installing ri documentation for actionmailer-1.3.3... Installing ri documentation for actionwebservice-1.2.3...
java -jar glassfish-installer-v3-preview1-b2.jarThis will create a new directory by the name "
glassfish" in your
current directory.GLASSFISH_HOME\bin" in your environment PATH.config\asenv.bat" and add "set JRUBY_HOME=C:\jruby-bin-1.0"
as the last line. Make sure to change the directory location to match your
JRUBY_HOME.jruby -S rails helloThis creates a new directory "hello" in your current directory. The output of the command looks like:
create create app/controllers create app/helpers create app/models create app/views/layouts create config/environments create components create db create doc create lib create lib/tasks create log create public/images create public/javascripts create public/stylesheets create script/performance create script/process create test/fixtures create test/functional create test/integration create test/mocks/development create test/mocks/test create test/unit create vendor create vendor/plugins create tmp/sessions create tmp/sockets create tmp/cache create tmp/pids create Rakefile create README create app/controllers/application.rb create app/helpers/application_helper.rb create test/test_helper.rb create config/database.yml create config/routes.rb create public/.htaccess create config/boot.rb create config/environment.rb create config/environments/production.rb create config/environments/development.rb create config/environments/test.rb create script/about create script/breakpointer create script/console create script/destroy create script/generate create script/performance/benchmarker create script/performance/profiler create script/process/reaper create script/process/spawner create script/process/inspector create script/runner create script/server create script/plugin create public/dispatch.rb create public/dispatch.cgi create public/dispatch.fcgi create public/404.html create public/500.html create public/index.html create public/favicon.ico create public/robots.txt create public/images/rails.png create public/javascripts/prototype.js create public/javascripts/effects.js create public/javascripts/dragdrop.js create public/javascripts/controls.js create public/javascripts/application.js create doc/README_FOR_APP create log/server.log create log/production.log create log/development.log create log/test.log
jruby script/generate controller say helloThe output of the command looks like:
exists app/controllers/ exists app/helpers/ create app/views/say exists test/functional/ create app/controllers/say_controller.rb create test/functional/say_controller_test.rb create app/helpers/say_helper.rb create app/views/say/hello.rhtml
hello\app\views\say directory, edit "hello.rhtml" such that it looks like:<h1>Say#hello</h1> <p>Find me in app/views/say/hello.rhtml</p> <%= @hello_string %>
hello\app\controllers directory, edit "say_controller.rb"
such that it looks like:class SayController < ApplicationController def hello @hello_string = "Hello from Controller!" end end
java -jar lib\glassfish-10.0-SNAPSHOT.jarThe output of the command looks like:
[#|2007-08-10T15:00:52.551-0700|INFO|GlassFish10.0|javax.enterprise.system.core|_ThreadID=10;_ThreadName=Thread-2;|Listening on port 8080|#]
[#|2007-08-10T15:00:52.736-0700|INFO|GlassFish10.0|javax.enterprise.system.core|_ThreadID=10;_ThreadName=Thread-2;|Supported containers : phobos,web,jruby,php|#]
[#|2007-08-10T15:00:52.753-0700|INFO|GlassFish10.0|javax.enterprise.system.core|_ThreadID=10;_ThreadName=Thread-2;|Glassfish v3 started in 802 ms|#]
asadmin deploy --path hello
C:\workarea\samples\gfv3>java -jar C:\testbed\v3-p1-v2\glassfish\bin\\..\lib\admin-cli-10.0-SNAPSHOT.jar deploy --path helloThe GlassFish console shows the following entry:
SUCCESS : Application hello deployed successfully
[#|2007-08-10T15:01:53.833-0700|INFO|GlassFish10.0|GRIZZLY|_ThreadID=11;_ThreadName=httpWorkerThread-8080-0;|New Servicing page from: C:\workarea\samples\gfv3\hello\public|#]
C:/testbed/v3-p1-v2/glassfish/lib/jruby/lib/ruby/gems/1.8/gems/actionmailer-1.3.3/lib/action_mailer.rb:49 warning: already initialized constant MAX_LINE_LEN [#|2007-08-10T15:02:15.740-0700|INFO|GlassFish10.0|javax.enterprise.system.tools.deployment|_ThreadID=11;_ThreadName=httpWorkerThread-8080-0;|hello jruby application loaded in 22083 ms|#]
http://localhost:8080/hello/say/hello". The GlassFish console shows the
following entry:/hello/say/hello [#|2007-08-10T15:03:22.222-0700|INFO|GlassFish10.0|GRIZZLY|_ThreadID=12;_ThreadName=httpWorkerThread-8080-1;|The main point to notice here is that the Rails application request is served directly by the Grizzly connector.
Processing SayController#hello (for 127.0.0.1 at 2007-08-10 15:03:22) [GET] |#]
[#|2007-08-10T15:03:22.225-0700|INFO|GlassFish10.0|GRIZZLY|_ThreadID=12;_ThreadName=httpWorkerThread-8080-1;| Session ID: a78627d02071347f6fb5f0268fa47f18
|#]
[#|2007-08-10T15:03:22.227-0700|INFO|GlassFish10.0|GRIZZLY|_ThreadID=12;_ThreadName=httpWorkerThread-8080-1;| Parameters: {"action"=>"hello", "controller"=>"say"}
|#]
[#|2007-08-10T15:03:22.253-0700|INFO|GlassFish10.0|GRIZZLY|_ThreadID=12;_ThreadName=httpWorkerThread-8080-1;|Rendering say/hello |#]
[#|2007-08-10T15:03:22.295-0700|INFO|GlassFish10.0|GRIZZLY|_ThreadID=12;_ThreadName=httpWorkerThread-8080-1;|Completed in 0.06500 (15 reqs/sec) | Rendering: 0.0 6300 (96%) | 200 OK [http://localhost/hello/say/hello]
|#]
This concludes all the steps required to run a simple JRuby on Rails application on GlassFish. If you want to run the same application using the WEBrick container, then follow the additional steps given below:
jruby script/server=> Booting WEBrick...
=> Rails application started on http://0.0.0.0:3000
=> Ctrl-C to shutdown server; call with --help for options
[2007-08-10 14:14:26] INFO WEBrick 1.3.1
[2007-08-10 14:14:26] INFO ruby 1.8.5 (2007-06-07) [java]
[2007-08-10 14:14:26] INFO WEBrick::HTTPServer#start: pid=6336176 port=3000
http://localhost:3000/say/hello" in a browser window and it shows the
message:127.0.0.1 - - [10/Aug/2007:14:15:25 PDT] "GET /say/hello HTTP/1.1" 200 89
- -> /say/hello
127.0.0.1 - - [10/Aug/2007:14:15:27 PDT] "GET /favicon.ico HTTP/1.1" 200 0
- -> /favicon.ico
In the process, I found Ruby on Rails Cheatsheet very handy for a quick summary of commands.
The NetBeans IDE provides a comprehensive support for Ruby code completion, refactoring, debugging, Rails support, support for RHTML files, code templates, unit test execution, shortcuts, and much more.
Technorati: jruby ruby glassfish grizzly jrubyonglassfish netbeans rubyonrails
Posted by Arun Gupta in web2.0 | Comments[21]
|
|
|
|
|
Today's Page Hits: 1570
Total # blog entries: 994
| « November 2009 | ||||||
| Sun | Mon | Tue | Wed | Thu | Fri | Sat |
|---|---|---|---|---|---|---|
1 | 2 | 4 | 6 | 7 | ||
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | |||||
| Today | ||||||
Good stuff, but why do you start WEBrick at the end? How is it releated to the Glassfish V3 deployment? Unless I'm missing something, I think that that step is unnecessary and should be removed or explained. Otherwise it might confuse new users.
Posted by Igor on August 13, 2007 at 09:48 AM PDT #
Igor, your comment is valid. I updated the entry to show how a standard Rails
application can be "deployed".
Posted by Arun Gupta on August 13, 2007 at 01:26 PM PDT #
Three things:
1. There is no need to go to the trouble of installing another copy of jruby in the Glassfish directory.
To use an existing jruby installation (e.g., c:\jruby), simply add the following line to "asenv.bat" in directory "glassfish\config\"
set JRUBY.HOME=C:\jruby
Then use "asadmin" in the normal manner to deploy to the path of an existing application.
2. Shouldn't it be
jruby -S gem install rails ?
3. Glassfish currently suffers from a rendering problem, e.g., it mangles ActiveScaffold. This effectively limits its usability to simple demos for the time being. (N.B. jruby itself renders AS perfectly)
Posted by Raphael Gillett on August 14, 2007 at 11:40 AM PDT #
Raphael,
Thanks for your suggestions. I updated the blog entry to incorporate comments #1 & #2. For #3, can you provide more details ?
Posted by Arun Gupta on August 14, 2007 at 06:35 PM PDT #
Arun,
ActiveScaffold may be obtained from
www.activescaffold.com
It is a widely-used plugin that provides an ajax-based dynamic scaffold with a professional appearance.
Download the Demo from the above site. First, try it out with Jruby using either Webrick or Mongrel. Then try it with Jruby using Glassfish.
Webrick and Mongrel both render the Demo perfectly.
However, Glassfish fails to pick up the CSS instructions and mangles the ajax.
Posted by Raphael Gillett on August 14, 2007 at 11:49 PM PDT #
Posted by Arun Gupta's Blog on August 20, 2007 at 09:32 AM PDT #
Are you aware of plug-ins that would allow me to deploy a Django app either as a WAR or via direct invocation from the grizzly connector. If yes, any suggestion on which version of glassfish I should use? Thanks.
Posted by Sashi on September 04, 2007 at 04:18 PM PDT #
Posted by Arun Gupta's Blog on September 13, 2007 at 08:55 PM PDT #
Posted by Arun Gupta's Blog on September 13, 2007 at 08:55 PM PDT #
Posted by Arun Gupta's Blog on September 13, 2007 at 08:56 PM PDT #
Posted by Arun Gupta's Blog on September 13, 2007 at 08:57 PM PDT #
Posted by Arun Gupta's Blog on September 14, 2007 at 06:13 AM PDT #
Hi Arun,
thanks for your great article.
All works good but I'm wondering about GlassFish concurrent requests handling, simply it doesn't work.
Test:
jruby -S rails hello
cd hello
jruby script/generate controller engine home test
edit app/controlelrs/engine_controller.rb
class EngineController < ApplicationController
def home
i = 0
while i < 15000000
i += 1
end
render :text => "Game over !", :layout => false
end
def test
render :text => "Test", :layout => false
end
end
Now if I navigate to:
http://localhost:8080/hello/engine/home
and concurrently to:
http://localhost:8080/hello/engine/test
The second request is a blank page, no errors at all, only a blank page: why ?
Seems that GlassFish could'nt handle concurrent requests.
Can you try this and help me ?
Thanks in advance.
Have a nine day !
Posted by Gianluca Tessarolo (Tex) on November 21, 2007 at 12:06 AM PST #
Gianluca, This issue is now resolved with an updated version of Gem as described at:
http://blogs.sun.com/arungupta/entry/glassfish_v3_gem_updated
Let me know if it does not solve problem.
Posted by Arun Gupta on January 07, 2008 at 09:13 PM PST #
Good work but:
1. How can I configure more than 2 default Rails instances at gem glassfish startup ?
2. If I have 2 Rails instances and 4 concurrent requests the 3rd, and 4th request return a blank page, not so good... (I think that a better solution could be wait until a free Rails instance wake up...)
Many thanks for your support...
Posted by Gianluca Tessarolo (Tex) on January 09, 2008 at 07:03 AM PST #
Gianluca,
The number of Rails instance is hardcoded to 2 but I've already filed a enhancement request for this at:
https://glassfish.dev.java.net/issues/show_bug.cgi?id=3968
If you are interested, I request you to Vote for the issue :)
The 3rd & 4th request return blank page for the same reason as earlier.
-Arun
Posted by Arun Gupta on January 09, 2008 at 07:09 AM PST #
Hi Arun,
I voted right now for the issue.
For my second complain I want to say that even if I can have more than 2 Rails instances, return a blank page because there are not enough free instances is a wrong thing (I cannot accept that a 'nth' user read a blank page just beacause there are not enough free rails instances...), a better solution could be wait for a free rails instance...
Posted by Gianluca Tessarolo (Tex) on January 09, 2008 at 07:35 AM PST #
The second complain is already lodged as an issue at: https://glassfish.dev.java.net/issues/show_bug.cgi?id=3966
Posted by Arun Gupta on January 09, 2008 at 07:46 AM PST #
Ok Arun,
thank you very much.
Keep up the good work ! (I hope this is a correct english expression for "Buon lavoro !")...
Posted by Gianluca Tessarolo (Tex) on January 09, 2008 at 08:55 AM PST #
For my second complain I want to say that even if I can have more than 2 Rails instances, return a blank page because there are not enough free instances is a wrong thing (I cannot accept that a 'nth' user read a blank page just beacause there are not enough free rails instances...), a better solution could be wait for a free rails instance...
Posted by LAPTOP BATTERY on November 26, 2008 at 09:59 PM PST #
Yep, that's the approach taken by the recent release of gem. Read more at:
http://wiki.glassfish.java.net/Wiki.jsp?page=JRuby
Posted by Arun Gupta on November 28, 2008 at 07:23 AM PST #