I am exploring Samza for some of our use cases.  As we have a lot of Ruby
developers, I decided to determine if we could use JRuby with Samza.  After
some work, I've been able to write Ruby jobs. To demonstrate the details,
I've ported the Hello Samza project to JRuby.  You can find the port at
https://github.com/eliaslevy/samza-hello-samza-jruby.

The port largely straightforward once the right pieces were found.  It
makes use of an existing Maven plug-in to compile the Ruby sources to Java
sources, which are then compiled as usual.  It also makes use of an
existing Maven plugin and the Maven proxy at rubygems-proxy.torquebox.org
to enable the use of Ruby gems within tasks.

That said, there were two complications.  A bug in JRuby generated bad Java
source when a Ruby class attempted to implement more than one interface.  I
fixed this in JRuby and the fix should be included in the next release.  In
the mean time, you'll have to use JRuby 1.7.23-SNAPSHOT.  As there appears
to be no JRuby Maven repository with the snapshot artifacts, you'll have to
build them yourself from the JRuby source and place them in your local repo.

The second complication is that JRuby won't let you inherit from a class
when you use the JRuby compiler.  That means you can't
subclass BlockingEnvelopeMap to pick up its poll implementation. One could
get around this by writing a bit of Java to implement a class that inherits
from BlockingEnvelopeMap.  Instead, I abused the FileReaderSystemConsumer
class by instantiating it and proxying calls to it from my SystemConsumer
to gain access to the BlockingEnvelopeMap implementation.

The main difference between the JRuby implementation of Hello Samza and the
original is that I replaced the Java IRC library with a Ruby gem to
demonstrate their use.

I hope this helps someone.

Elias

Reply via email to