Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Deploying Clojure applications in a single JVM instance

Suppose I have two or more different server applications developed in Clojure using ZeroMQ and BSON as protocols. How can I deploy them using a single JVM instance while also sharing common dependencies?

It seems a waste of memory to use a JVM instance for each standalone application. I plan to develop several Clojure applications in the future and VPS memory is not cheap.

Although not explicitly said, applications running in an application server (Jetty, Glassfish) seem to share the same JVM while isolating their state. However, they require a container and neither Servlets or Enterprise JavaBeans have an implementation that I could easily adapt to my custom protocol.

I've been thinking about using Servlets and implementing a dummy service() method though I don't like the idea of having a pointless HTTP server overhead. As for the EJB container, I cannot even figure out its implementation.

It would be nice to have a container requiring only init() and destroy() methods but I can't find an application server providing it.

Maybe there is a way around or I don't even need an application server. Could somebody point me in the right direction?

like image 298
adeandrade Avatar asked Oct 31 '12 11:10

adeandrade


3 Answers

It sounds like you would be okay using an EJB container, but only if it were easier or simpler to work with. Have you looked at Immutant? It's basically a wrapper around JBossAS for Clojure, written by guys at Red Hat (who also own JBossAS).

In addition to being an application server, those guys have wrapped JMS and other Java-EE features around Clojure, such that sending messages between apps appears pretty simple:

Also, they have Daemons and Jobs, which may provide something similar to what you were describing as simple services with init() and destroy().

That being said, I haven't used it, so I'm can't vouch for it's awesomenss/awfulness.

like image 58
Nick Klauer Avatar answered Nov 15 '22 02:11

Nick Klauer


So you have two applications that both share the same dependencies and both want to respond to and/or generate events on a message bus.

If I understand what you're saying, this should be as simple as starting the JVM with access to all code in the classpath and initializing your message bus and your code from a main method.

If you wanted to use a container, you could create some dummy message driven beans that sat between your clojure code and the message bus assuming there is a JMS adapter for your message bus. Using netbeans/glassfish, this may not be that bad. You might gain some in terms of monitoring, but I'm not sure what else you would gain.

like image 33
Bill Avatar answered Nov 15 '22 03:11

Bill


I kept searching and found out that some application servers implementing the OSGi service platform have simpler lightweight containers than those offered by Java EE.

Apache Karaf for instance can load POJO applications directly from JAR files.

like image 22
adeandrade Avatar answered Nov 15 '22 03:11

adeandrade