2

我有一个 clojure/ring 项目,它有两个不同的应用程序/处理程序在不同的端口上运行(一个用于 api,一个用于 Web 前端)。它们共享大量代码,但每个都有自己的命名空间,在其中完成特定于该接口的所有工作。现在我想将它部署为在 tomcat 或类似的东西中运行的 servlet(实际上它需要在任何 servlet 容器中工作)。不过我遇到了麻烦,因为 lein-ring 似乎假设 servlet 中只有一个处理程序。例如,在我的 project.clj 我有这一行:

:ring {:handler caribou.api/app
       :servlet-name "caribou"
       :init caribou.api/init}

这对 api 来说很棒,但是现在前端呢?我是否需要创建另一个包含这个的项目,以便它可以拥有自己的处理程序和 servlet?servlet 是否总是在一个端口上运行?

基本上有两件事我不确定:我不是来自 java 背景,所以我不确定 servlet 方法发生了什么以及它有什么限制,我不清楚 clojure 究竟是如何转化为servlet 范式足以以一般方式构建该项目。

任何帮助表示赞赏,谢谢!

4

1 回答 1

1

同一个容器中的所有 servlet 都由同一个服务器提供服务,因此是同一个端口。通常,您通过给它们不同的 URI 前缀(例如/servlet1或)来识别不同的 servlet /my/servlet

我不知道是否有任何东西阻止您使用 Ring 创建单独的 servlet,但总的来说,如果您的整个应用程序都是基于 Clojure 的,这似乎不是一个好主意。至少,正如您所指出的,lein-ring 插件强制 Web 应用程序只使用一个 servlet。

您可以做的一件事是创建一个父处理程序,该处理程序根据 URI 委托给应用程序或 API 处理程序。这实质上使您无需将逻辑委托给 Servlet API 即可进行控制。

于 2012-04-03T03:06:50.043 回答