5

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

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

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

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

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

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

4

4 回答 4

3

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

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

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

于 2012-10-31T13:41:44.710 回答
3

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

除了作为应用服务器之外,这些家伙还围绕 Clojure 封装了 JMS 和其他 Java-EE 功能,因此在应用程序之间发送消息看起来非常简单

此外,它们有守护进程作业,它们可能提供类似于您所描述的简单服务的内容init()destroy()

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

于 2012-11-01T15:10:41.177 回答
2

我一直在寻找,发现一些实现OSGi服务平台的应用服务器拥有比 Java EE 提供的更简单的轻量级容器。

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

于 2012-11-01T16:38:37.030 回答
0

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

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

于 2012-11-09T17:02:53.423 回答