我可以在特定的servlet上下文中运行lein ring server-headless吗?

时间:2015-10-14 21:13:25

标签: clojure leiningen ring

我有一个Ring应用程序,可以通过from flask import Flask, Blueprint from flask_restplus import Api, Resource app = Flask('__name__') blueprint = Blueprint('v1', __name__, url_prefix='/rest/v1') api = Api(blueprint, doc='/apidoc/', version='1.0') @blueprint.route('/', endpoint='rootres') def root(): return '' ns = api.namespace('test', description='desc') @ns.route('/', endpoint='rootresource') class RootResource(Resource) def get(self): ... app.register_blueprint(blueprint) 部署到生产中; myservice.war。在生产中,WAR文件被抛入Jetty,它在名称

之后的上下文中运行
uberwar

当我通过lein ring在本地运行时,我需要它在相同的上下文中运行;为MyService。

$ curl -i -X GET http://myservice.qa1.example.com:8080/myservice/healthz
HTTP/1.1 200 OK
...

但同样的卷曲在我当地发生了所有404。

$lein ring server-headless
2015-10-14 14:04:03,457  level=INFO [main] Server:271 - jetty-7.6.13.v20130916
2015-10-14 14:04:03,482  level=INFO [main] AbstractConnector:338 - Started SelectChannelConnector@0.0.0.0:10313
Started server on port 10313

lein ring将它部署到根上下文中。

$ curl -i -X GET http://localhost:10313/myservice/healthz
HTTP/1.1 404 Not Found
...

那是什么?如何指示lein ring部署到我选择的上下文名称中?我需要$ curl -i -X GET http://localhost:10313/healthz HTTP/1.1 200 OK ... 从lein ring工作

1 个答案:

答案 0 :(得分:1)

解决此问题的一种方法是为您的应用创建第二组(独立)路由。您还为独立案例创建第二个处理程序。然后,您可以使用Leiningen配置文件为独立案例和超级战争案例指定不同的处理程序。运行独立应用程序时使用默认配置文件。创建uberwar时使用:uberjar配置文件。因此,当战争部署到容器中时,将使用与lein ring server-headless一起使用的独立处理程序和常规处理程序。

创建第二组路由所需的额外代码不多。您可以在您选择的上下文中包装现有路线。假设以下是您的路由和环处理程序:

(defroutes app-routes
  (GET "/healthz" [] "Hello World")
  (route/not-found "Not Found"))

(def app
  (wrap-defaults app-routes site-defaults))

独立案例的附加路由和处理程序如下所示:

(defroutes standalone-routes
  (context "/myservice" req app-routes)
  (route/not-found "Not Found"))

(def standalone-app
  (wrap-defaults standalone-routes site-defaults))

现在,转到lein-ring中的project.clj配置。我们希望默认的环处理程序指向standalone-app。 uberwar的环处理程序应指向app:ring中项目地图中的project.clj条目应如下所示(根据您的实际命名空间进行调整):

:ring {:handler myservice.handler/standalone-app}

此外,将以下内容合并到:profiles中的project.clj地图:

:uberjar {:ring {:handler myservice.handler/app}}

请务必使用最新版本的lein-ring插件。版本0.9.7对我有用。早期版本(如0.8.3)无法正常运行,因为它们在运行:uberjar任务时未使用uberwar配置文件。

如果你做了这一切,并假设你的war文件名为myservice.war,那么无论你的应用程序是以lein ring server-headless启动还是部署了war文件,URI的上下文部分都将是相同的在码头。

$ curl http://localhost:[port]/myservice/healthz