18 June 2013
Living the Dream with JRuby
I got into Ruby through JRuby. I was doing Java for about 10 years before I
started doing Ruby. What got me interested, like so many others, was Rails. I
was blown away by Ruby and Rails, but the surrounding ecosystem (native
libraries that needed to be compiled on each platform) made me sad. My initial
reaction was to attempt bring the awesomeness I saw in Rails to Java by
attempting to build a Rails-esque framework in Java.
Though I had some success, it quickly became apparent that what really made
Rails such a joy to build with is the Ruby language itself. I discovered JRuby
at about this same time, and there was a huge momentum around the project. Sun
Microsystems, the inventor of Java, hired the two leaders of the project,
Charles Nutter and Tom Enebo to work on it full time and it quickly progressed
to the point where it could run Rails. All of a sudden we had all the amazing
developer productivity of the Ruby language combined with the mature, platform
independent ecosystem and solid engineering of the JVM. I was convinced we
were about to enter a bright and shiny future for the legions of developers
laboring in the Java mines writing EJBHome interfaces and hand-editing their
struts-config.xml files. Turns out my timing on this was a wee bit off ;)
Fast forward about 8 years to 2013. We at Gaslight are starting to see a
pickup in Ruby adoption in the enterprise. It’s common knowledge that the
enterprise tends to be more risk-averse in it’s technology adoption. What
is now old news in the startup community, is just coming onto the enterprise
scene. But at this point, Ruby and Rails are no longer new and scary: it’s
a mature tech stack with lots of success stories to back it up.
However, in many corners, the word still doesn’t seem to have gotten
out there about JRuby. It seems like there’s almost a disbelief that it could
possibly be so easy and seamless to take a vanilla Rails application and
deploy it to an existing Java infrastructure. Well, I’m here to tell you, it
really, really works. By adding the warbler gem, you can take a Rails app and
run a single command to produce a war file that you can drop into any app
server. JRuby automatically leverages Java standards like JDBC to
talk to databases. Most all of the popular Ruby gems that relied on native code
have versions ported to Java, and the right java-specific version
automatically gets installed for you by using JRuby.
It’s also worth pointing that using any Java API from JRuby is transparent and
seamless. A jar file can be required into JRuby using Ruby’s normal require
statement JRuby does a ton of automatic “rubification” to make the Java
libraries that you bring in easier to work with. Java getters and setters become
normal Ruby attributes, and Ruby blocks can be used to implement Java interfaces,
just to name a couple. All this means that when you need to use Java APIs
directly, you are still using conventional Ruby code, no extensions to the
language are necessary. We’ve taken advantage of this on application here at
Gaslight to get some huge performance gains by bypassing the Rails stack at
certain hotspots. I’ll detail this in an upcoming post.
We’re fortunate to be working with IPC, the company owned by SUBWAY®
franchises, on their first JRuby on Rails project. The reception has been
overwhelmingly positive by developers as well as customers. Developers have
by and large had the same reaction to Ruby and Rails that I had when I first saw it.
We’ve been able to leverage things like active_admin to get things in front of
our customer fast and then iterate. And we’re able to deploy our Rails app
into the existing PCI compliant environment thanks to JRuby.
This adds up to a big win for organizations that are larger and
have different needs, than the prototypical startup that would previously been
the sweet spot for Rails. We want to get the word out to large organizations
that you absolutely can have your cake and eat it too. You can deliver applications
quickly, with less code, inside the infrastructure you already have. Go JRuby!