【问题标题】:Initialization hook for Clojure Noir WAR/Servlet (CloudFoundry)Clojure Noir WAR/Servlet (CloudFoundry) 的初始化挂钩
【发布时间】:2012-02-01 23:51:25
【问题描述】:

我正在构建一个 Clojure Noir Web 应用程序,以在 CloudFoundry 中作为 WAR 文件运行。

在我的 project.clj 我有:

:ring {:handler appname.server/handler}

在 server.clj 中,我使用 Noir 创建了一个处理程序:

(def handler (noir.server/gen-handler {:ns 'appname}))

我使用 lein ring 插件构建 WAR 文件:

lein ring uberwar

然后使用以下命令推送到 CloudFoundry:

vmc push appname

请求处理程序工作正常,我可以很好地浏览到应用程序的 URL。

那么问题来了:应用启动时进行初始化的正确方法是什么?

我可以在 server.clj 中执行以下操作:

(when (System/getenv "VCAP_APPLICATION")
  (init-func))

但这有几个问题。首先,似乎是在错误的时间进行初始化(当代码被读取/评估而不是在应用程序启动时)。其次,保护器是 CloudFoundry 特有的,我确信有一种适当的通用 WAR 方法可以做到这一点。

我认为这是 ServletContextListener 上 contextInitialized 方法的目的,但我如何将它与 Noir/ring 挂钩?

【问题讨论】:

    标签: java clojure war leiningen


    【解决方案1】:

    ring source for WAR handling就知道了

    project.clj :ring 映射采用 :init 关键字,如下所示:

    :ring {:init appname.server/my-init
           :handler appname.server/handler}
    

    my-init 函数将在应用程序启动时被调用。

    警告:这显然会增加应用程序初始启动所需的内存量。没有初始化128M就足够了。使用初始化代码,应用程序启动失败,所以我不得不将内存增加到 256M。我怀疑使用初始化代码,JVM 在编译/执行 Clojure 代码之前没有时间进行垃圾收集。

    【讨论】:

      猜你喜欢
      • 2014-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-01
      • 2016-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多