I recently read about ZeroMQ and got hooked on it. So I decided to try it out by using Scala. This is just a simple "Hello ZMQ from Scala" tutorial to be run on OS X (El Capitan). It requires the libzmq to be installed and to have either the Java binding (JZMQ) or the Scala binding installed too. I am going to use for this post the JZMQ binding.

Pre-requisites

The first thing that must be done is to make zeromq library from source code. In order to so, you must ensure you have some dependencies installed, that can be installed using Homebrew in case of not having them:

  • brew install libtool
  • brew install pkg-config
  • brew install autoconf
  • brew install automake

Make libzmq library

You should grab the source code and extract it. We are going to use the latest at the time of writing this post (v4.1.4).

    mkdir zeromq
    cd zeromq
    curl -O http://download.zeromq.org/zeromq-4.1.4.tar.gz
    tar zxf zeromq-4.1.4.tar.gz
    cd zeromq-4.1.4

Then, it should be configured. I am excluding libsodium library because I have not installed it neither I will need it for prototyping purposes:

    ./configure --without-libsodium
    make

Finally, to install it system-wide:

    sudo make install

That will install the library (libzmq.dylib) in /usr/local/lib and the header files in /usr/local/include. You can now remove the folder zeromq-4.1.4 if you like.

    cd ..
    rm -rf zeromq-4.1.4

Installing JZMQ Binding

Clone the git repo first:

    git clone https://github.com/zeromq/jzmq.git
    cd jzmq

Make the binding this way:

    ./autogen.sh
    ./configure
    make
    sudo make install

That will install the library (libjzmq.dylib) in /usr/local/lib and will copy zmq.jar file in /usr/local/share/java. You can now remove the folder jzmq if you like.

    cd ..
    rm -rf jzmq

Create the "Hello ZQM" application

We have already installed all the requisites for being able to write and run (assuming you also have JVM installed) our first Scala project on top of ZMQ. I have create a GitHub repository where you can find the project. It is a sbt project so you should have it installed. Otherwise, you can install it right now by using brew:

    brew install sbt

If you typed the commands as they appeared in the tutorial, your working folder should be zeromq. This is not important though but this way it keeps things ordered. Now, clone the git repository and run the client and server. You should open two shell sessions in order to run each of them simultaneously. I am using iTerm as the terminal application although you can use the one that Apple ships.

On a first shell script in the zeromq working dir we should clone the git repository and also run sbt:

    git clone https://github.com/oscar-martin/Hello0MQ.git
    cd Hello0MQ
    sbt -Djava.library.path=/usr/local/lib

It is important to note that we are passing a JVM property (java.library.path) to indicate where to load the library that will be requested to load when ZeroMQ is run. The location is where the command sudo make install in the libzmq step placed it.

On a second shell script, you need to point to zeromq/Hello0MQ and also launch sbt:

    cd zeromq/Hello0MQ
    sbt -Djava.library.path=/usr/local/lib

So both shell sessions are showing the sbt prompt. You can list the projects. In any of these sessions, type:

    > projects

And the output should look like this:

[info]     client
[info]   * root
[info]     server

which indicates root is current project. So you should change the current project in both shell sessions:

In the first shell session:

    > project server

In the second shell session:

    > project client

Finally, in order to run our "Hello ZMQ from Scala" application, you should just run it, this way:

In the first shell session (server):

    > run

In the second shell session (client):

    > run localhost

It will compile each project and run it. If succeeded, the output should be like this:

In the first shell session (server):

[info] Running Main
Listening on port 5555...
Received request: [Hello ZQM]
Received request: [Hello ZQM]
Received request: [Hello ZQM]
Received request: [Hello ZQM]
Received request: [Hello ZQM]
Received request: [disconnect]
Received 'disconnect' command.
Disconnected!

In the second shell session (client):

[info] Running Main
Connected to Server on localhost:5555
Sending request 1: [Hello ZQM]
Received reply 1: [from Scala!]
Sending request 2: [Hello ZQM]
Received reply 2: [from Scala!]
Sending request 3: [Hello ZQM]
Received reply 3: [from Scala!]
Sending request 4: [Hello ZQM]
Received reply 4: [from Scala!]
Sending request 5: [Hello ZQM]
Received reply 5: [from Scala!]

Once execute, you should exit the sbt project in each session in order to run it again. Otherwise, you will have an “UnsatisfiedLinkError: Native Library already loaded in another classloader error.

So I hope you have been able to launch it without any problem. I do not really like to install in the Mac a lot of different software packages just for prototyping purposes. Then, I am going to start working on an easier approach: to prepare a Docker image with all the requisites on it and to use it to run my Hello0MQ project on it.