【问题标题】:ColdBox: The method _actionExists was not found in componentColdBox:在组件中找不到方法 _actionExists
【发布时间】:2017-05-11 03:58:42
【问题描述】:

运行 ColdBox 4.2 我们在重新初始化后看到此错误,但仅在一个特定的处理程序 cfc 上。如果我们重新初始化几次,它最终会消失,这听起来像是一种竞争条件。

我们想直接做extends="coldbox.system.EventHandler",而不是让框架混合处理程序方法,但后来我们开始看到另一个错误:

错误构建:myApp.handlers.admin.report -> 控制器 init 函数的参数是必需的,但没有传入。 with 构造函数参数:{}

类似地,如果我们重新初始化几次,直到我们得到一个在请求在初始化过程中到达之前完成烘焙的错误,这个错误就会消失。

我们无法在非产品系统上重现这一点,可能是由于负载大大降低。

有没有人遇到过类似的事情并想出了一种在负载下优雅地重新初始化框架的方法?

【问题讨论】:

    标签: coldfusion coldbox


    【解决方案1】:

    我实际上设法在重新初始化期间合理可靠地重现竞争条件错误并将其发布为问题COLDBOX-307,几乎响应是不要在生产中使用 fwreinit 这是正确的,我们切换到使用我们自己的调用方法applicationStop 在 application.cfc 中,它解决了我们在使用 fwreinit 时看到的问题。

    使用 applicationStop 时需要注意的一点,它不是线程安全的(也许不是正确的术语),这意味着 所有当前正在运行的请求的应用程序范围将在调用时再见,因此您可以以这种方式重新启动时会出现一些奇怪的错误。

    【讨论】:

    • 它会杀死会话本身吗?我不想让每个人都退出,只是为了部署需要重新初始化的新代码。
    • @jinglesthula 我实际上不确定这一点,因为我们使用会话存储,因此会话会在完全重启后持续存在,我想当仅在内存会话中使用时,它基本上与重新启动coldfusion服务器服务,但速度更快,如果它不作为会话范围可能包含来自先前应用程序的对象,导致它们永远不会被垃圾收集,那么您将面临内存不足的风险。
    • @jinglesthula 实际上答案是否定的。调用 applicationStop 不会结束现有会话。
    • 您可以通过锁定 onRequestStart 来强制 ColdBox reinit 成为线程安全的,但我们默认不这样做的原因是,如果需要单个长时间运行的请求,它可能会导致严重的延迟完成或重新初始化本身需要很长时间,因为所有其他请求都在该请求后面备份,这可能导致大量排队线程并关闭您的服务器。默认行为是在提供页面时性能最高的。
    • 在这里对 CB 3.8.2 没有帮助。还有其他解决方案吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-08
    • 1970-01-01
    • 2021-01-29
    • 1970-01-01
    • 1970-01-01
    • 2019-02-28
    • 2021-10-26
    相关资源
    最近更新 更多