1

当应用程序超时时,有没有办法通过Application.cfc重新启动CF服务器?根据 Adob​​e 文档,它们显示如下:

<cffunction name="onApplicationEnd">
    <cfargument name="ApplicationScope" required=true/>
    <cflog file="#This.Name#" type="Information" 
        text="Application #Arguments.ApplicationScope.applicationname# Ended" >
</cffunction>

我想做的是将<cflog>上面的内容替换<cfexecute>为以下内容:

<cfexecute name = "C:\CFRestart.bat"
    outputFile = "C:\output.txt"
    timeout = "1">
</cfexecute>

所以OnApplicationEnd会在应用程序超时时运行CFRestart.bat文件。这可能吗?

4

6 回答 6

4

除非您有一个非常安静的应用程序,否则不太可能达到onApplicationEnd,因为每次有人访问该应用程序时都会重置超时。

使用应用程序重新启动 Coldfusion 实例时,我会感到非常不舒服。我可以看到各种可怕的安全问题等迫在眉睫。老实说,如果您的应用程序结束,我不确定您为什么要重新启动服务器。

此外,根据文档 onApplicationEnd 在服务器重新启动时被调用,所以如果你确实让这个工作,当你重新启动服务器时,应用程序也会重新启动你的服务器。这会变得非常混乱。

于 2011-02-17T10:22:53.593 回答
4

不要相信你可以从 ColdFusion 调用 .bat 脚本。因为一旦它停止服务,它<cfexecute>也会终止(认为它在 CF 服务下运行),永远不会重新启动。

猜测您的服务器经常失败,因为您遇到内存不足 (OOM) 异常。为了在这些情况下克服困难,我将批处理脚本设置为Windows 计划任务(请参阅第一个答案了解如何),它会定期重启服务器,比如每 24、12 或 6 小时。选择对您的情况有意义的时间间隔。

假设OOM 是根本原因,我建议下载Java JDK,配置ColdFusion 以使用它(即jvm.config 文件中的jvmhome),并传递参数以启用JMX 连接。您可以使用此 JMX 连接来使用JDK 附带的 Visual VM 监控 ColdFusion。从那里你可以生成一个堆转储文件和/或告诉 VM 在 OOM 上生成一个。我通过Eclipse Memory Analyzer Tool运行它取得了非常好的成功,该工具有一个可疑的泄漏报告,不止一次有助于追踪服务器 OOM 崩溃的根本原因。

如果这不是您的情况,那么我建议您在使用 ColdFusion 企业时启用快照,否则 cfstat 是您的标准朋友。对于其中任何一个,您还可以设置在服务器运行缓慢时发送通知的探测器。这可以帮助您连接到有问题的服务器并在适当的时间生成转储,或者确定问题是否与负载相关。

于 2011-02-17T11:45:44.360 回答
1

这可能不是你的答案,但我经常使用它来帮助 JVM 内存中的垃圾收集。

将此设置为每 5 分钟运行一次的计划任务,我再也不会遇到 jvm 内存问题了。

<cfparam name="url.maxused" default="999">
<cfparam name="url.minfree" default="300">

<cfif NOT isDefined("runtime")>
    <Cfset runtime = CreateObject("java","java.lang.Runtime").getRuntime()>
</cfif>

<cfset fm = runtime.freememory()/>
<Cfset fm = int((fm/1024)/1024)/>
<cfset usedmem = 1270-fm/>
<cfoutput>
 #Now()#<br>
 Before<br>
 Free: #fm# megs<br>
 Used: #usedmem# megs<br>
</cfoutput>
<br>
<!--- check if we are using too much memory --->
<cfif usedmem gt url.maxused or fm lt url.minfree>
 <cfset runtime.gc()>
 Released Memory<br>
<cfelse>
 No need to release memory using the thresholds you provided<br>
</cfif>
<br>
<cfset fm = runtime.freememory()/>
<Cfset fm = int((fm/1024)/1024)/>
<cfset usedmem = 1270-fm/>
<cfoutput>
After<br>
Free: #fm# megs<br>
Used: #usedmem# megs<br>
</cfoutput>
于 2011-02-28T17:08:00.447 回答
0

这个问题一直悬而未决,所以我想我会帮助解决它。

首先,这是:“服务器错误服务器遇到内部错误,无法完成您的请求。无法连接到 JRun 服务器。”

这不是应用程序超时,这只是服务器变得无响应,或者内存不足,或者只是遇到了它不喜欢的东西。但这与应用程序超时无关。

当该站点上没有活动(即:没有页面请求......没有访问者)超过应用程序超时期限时,应用程序超时,默认情况下为两天(或您在 Application.cfc 中设置的任何时间) .

现在......我可以理解为什么如果您的服务器变得无响应,您可能想要恢复,但是您从错误的角度处理这个问题。从本质上讲,如果服务器不工作,您就不能使用该服务器做任何事情(比如治愈自己)!这里通常做的是其他一些进程检查服务器是否响应,如果该服务确定服务器没有响应,则重新启动。

所以你应该看看其他一些可以向你的 CF 服务器执行 HTTP 请求的软件,如果对 HTTP 请求的反应表明 CF 服务器没有响应,那么监控软件会告诉 CF 重新启动。

于 2011-08-26T06:41:14.433 回答
0

为了补充斯蒂芬莫雷蒂的答案,可能是您正在寻找的上述有趣问题的可能解决方案:

应用程序超时时 OnApplicationEnd 会运行 CFRestart BAT 文件吗?

直接的答案是否定的。由于OnApplicationEnd()事件是应用程序生命周期的一部分,所以当应用程序本身超时时,这里不会调用任何事件。必须清楚。

不过,直接回答您的问题,是的,您可以在应用程序超时或结束时运行自定义脚本文件(无论如何)。你将不得不处理Serve Scope这里。

于 2015-04-28T08:57:44.467 回答
-1

首先,应用程序不会超时,页面请求会。在请求超时时,不会调用onApplicationEnd() 函数。只有在应用程序关闭时才会调用它。这是有关 CF 应用程序生命周期的一些信息。

其次,根据我的经验,无论出于何种原因重新启动应用程序服务器都可能掩盖了您真正的问题。如果您的应用程序运行缓慢/崩溃等,那么我建议您查看发生这种情况的真正原因,而不是重新启动它。

但是,我想不出原则上这不起作用的原因,但是如果这确实是您想要做的,我建议您进行快速测试。

希望有帮助。

于 2011-02-17T10:06:40.200 回答