gpt4 book ai didi

java - Clojure Noir WAR/Servlet (CloudFoundry) 的初始化 Hook

转载 作者:搜寻专家 更新时间:2023-10-31 19:57:35 26 4
gpt4 key购买 nike

我正在构建一个 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 Hook ?

最佳答案

通过查看 ring source for WAR handling 弄明白了

project.clj :ring 映射需要一个 :init 关键字,如下所示:

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

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

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

关于java - Clojure Noir WAR/Servlet (CloudFoundry) 的初始化 Hook ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9105173/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com