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

Servlets 在单个JVM实例中部署Clojure应用程序,servlets,clojure,jvm,osgi,application-server,Servlets,Clojure,Jvm,Osgi,Application Server,假设我在Clojure中使用ZeroMQ和BSON作为协议开发了两个或多个不同的服务器应用程序。如何使用单个JVM实例部署它们,同时共享公共依赖项 为每个独立应用程序使用JVM实例似乎是在浪费内存。我计划在未来开发几个Clojure应用程序,VPS内存并不便宜 虽然没有明确说明,但在应用服务器(Jetty、Glassfish)中运行的应用程序在隔离状态时似乎共享同一个JVM。然而,它们需要一个容器,并且servlet和EnterpriseJavaBeans都没有一个我可以轻松适应我的定制协议的实

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

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

虽然没有明确说明,但在应用服务器(Jetty、Glassfish)中运行的应用程序在隔离状态时似乎共享同一个JVM。然而,它们需要一个容器,并且servlet和EnterpriseJavaBeans都没有一个我可以轻松适应我的定制协议的实现

我一直在考虑使用servlet并实现一个虚拟service()方法,尽管我不喜欢使用无意义的HTTP服务器开销。至于EJB容器,我甚至不能理解它的实现

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


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

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

如果我理解您的意思,这应该很简单,只要启动JVM并访问类路径中的所有代码,然后从主方法初始化消息总线和代码


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

使用EJB容器听起来不错,但前提是它更易于使用。你看过吗?它基本上是Clojure的JBossAS的包装,由Red Hat的人编写(他也拥有JBossAS)

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

此外,它们还有和,这可能提供类似于您所描述的使用
init()
destroy()
的简单服务


也就是说,我没有使用过它,所以我不能保证它是令人敬畏的。

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


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

我不确定DDs是什么,但任何JAR都是有效的捆绑包。由于clojure不是类型安全的,您需要在clojure世界和OSGi/Java世界之间架起一座桥梁,但是OSGiAPI对于这样的桥梁来说是一个梦想


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

您甚至不必去Karaf,因为Karaf已经有很多大多数人不需要的功能。任何OSGi框架(ApacheFelix,Equinox)都适用于这些应用程序。启动和使用起来非常轻量级。不需要在应用程序内部实现任何接口(servlet、EJB)?我是否可以将任何JAR文件(使用适当的DDs)加载到任何OSGi应用服务器中?