2012-10-31 46 views
4

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

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

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

我一直在思考如何使用Servlet和实施虚拟service()方法,虽然我不喜欢无谓的HTTP服务器开销的想法。至于EJB容器,我甚至不知道它的实现。

如果只有一个容器需要init()和destroy()方法,但我找不到提供它的应用程序服务器,那就太好了。

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

回答

2

听起来你可以使用EJB容器,但前提是使用起来更容易或更简单。你看过Immutant吗?它基本上是JBossAS针对Clojure的封装,由Red Hat的人(他也拥有JBossAS)编写。

除了作为应用服务器,这些家伙都包裹JMS和其它与Java EE提供围绕着的Clojure,使得发送appears pretty simple应用程序之间的消息:

而且,他们有DaemonsJobs,可以提供的东西类似于你所描述的简单服务init()destroy()

话虽这么说,我还没有使用它,所以我不能保证它的awesomenss /这场可怕。

2

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

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

如果你想使用的容器,你可以创建一些假消息驱动Bean您的Clojure代码和消息总线假设有一个JMS适配器的消息总线之间坐下。使用netbeans/glassfish,这可能不会那么糟糕。在监控方面你可能会有所收获,但我不确定你会获得什么。

1

我一直在寻找,结果发现,实施OSGi服务平台的一些应用程序服务器具有比Java EE的所提供的简单的轻量级容器。

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

+1

你甚至不用去Karaf,已经有很多的功能,大多数人并不需要。任何OSGi框架(Apache Felix,Equinox)都可以用于这些应用程序。非常轻量级的启动和使用。 –

+0

无需在应用程序内部实现任何接口(Servlet,EJB)?我是否可以将任何JAR文件(具有适当的DD)加载到任何OSGi应用程序服务器中? – adeandrade

0

我不确定DD是什么,但是任何JAR都是有效的包。由于clojure不是类型安全的,因此您需要将clojure世界和OSGi/Java世界连接起来,但OSGi API对于这样的桥来说是一个梦想。

不是在OSGi包不会自动提供自己的内容,在OSGi的捆绑是默认专用。但是,API允许您在任何你想要的地方打洞。

相关问题