在单个JVM实例中部署Clojure应用程序

时间:2012-10-31 11:32:46

标签: servlets clojure jvm osgi application-server

假设我使用ZeroMQ和BSON作为协议在Clojure中开发了两个或更多不同的服务器应用程序。如何使用单个JVM实例部署它们,同时还共享公共依赖项?

对每个独立应用程序使用JVM实例似乎是浪费内存。我计划在未来开发几种Clojure应用程序,而VPS内存并不便宜。

虽然没有明确说明,但在应用程序服务器(Jetty,Glassfish)中运行的应用程序似乎共享同一个JVM,同时隔离了它们的状态。但是,它们需要一个容器,Servlet或Enterprise JavaBeans都没有可以轻松适应我的自定义协议的实现。

我一直在考虑使用Servlet并实现虚拟服务()方法,尽管我不喜欢有无意义的HTTP服务器开销的想法。至于EJB容器,我甚至无法弄清楚它的实现。

拥有一个只需要init()和destroy()方法的容器会很好,但我找不到提供它的应用程序服务器。

也许有办法或我甚至不需要应用程序服务器。有人能指出我正确的方向吗?

4 个答案:

答案 0 :(得分:2)

因此,您有两个共享相同依赖关系的应用程序,并且都希望在消息总线上响应和/或生成事件。

如果我理解你在说什么,这应该就像启动JVM一样简单,可以访问类路径中的所有代码,并从main方法初始化你的消息总线和你的代码。

如果你想使用一个容器,你可以创建一些虚拟消息驱动的bean,它们位于你的clojure代码和消息总线之间,假设你的消息总线有一个JMS适配器。使用netbeans / glassfish,这可能不是那么糟糕。你可能会在监控方面获得一些,但我不确定你还能获得什么。

答案 1 :(得分:2)

听起来您可以使用EJB容器,但前提是它更容易或更简单。你看过Immutant了吗?它基本上是围绕JBossAS for Clojure的包装器,由Red Hat(也是JBossAS)的人员编写。

除了作为应用服务器之外,这些人还围绕Clojure包装了JMS和其他Java-EE功能,以便在应用appears pretty simple之间发送消息:

此外,他们还有DaemonsJobs,可能会提供类似于您所描述的init()destroy()简单服务的内容。

话虽如此,我还没有使用它,所以我无法保证它的真实性/可怕性。

答案 2 :(得分:1)

我一直在搜索并发现实现OSGi服务平台的一些应用程序服务器具有比Java EE提供的容器更简单的轻量级容器。

例如,

Apache Karaf可以直接从JAR文件加载POJO应用程序。

答案 3 :(得分:0)

我不确定DD是什么,但任何JAR都是有效的捆绑包。由于clojure不是类型安全的,你需要桥接clojure世界和OSGi / Java世界,但OSGi API是这种桥梁的梦想。

在OSGi包中不会自动提供其内容,在OSGi中,默认情况下捆绑包是私有的。但是,API允许您在任何地方打孔。