如何在应用程序超时时重新启动Coldfusion Application Server?

问题描述 投票:1回答:6

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

<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文件。这可能吗?

coldfusion coldfusion-8 coldfusion-9 coldfusion-6 coldfusion-7
6个回答
4
投票

onApplicationEnd是not likely to be reached,除非你有一个非常安静的应用程序,因为每次有人访问应用程序时都会重置超时。

使用应用程序重启coldfusion实例我会感到非常不舒服。我可以看到各种可怕的安全问题等等。说实话,如果你的应用程序结束,我不确定你为什么要重启服务器。

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


3
投票

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

猜测你有一台服务器经常因为你遇到Out of Memory(OOM)异常而失败。为了克服那些情况下的驼峰我设置为批处理脚本作为Windows Scheduled Task(请参见第一个答案,如何)定期重启服务器,比如每24小时,12小时或6小时。选择适合您情况的间隔。

假设OOM是根本原因,我建议下载Java JDK,配置ColdFusion以使用它(即jvm.config文件中的jvmhome),并传递参数以启用JMX连接。 You use this JMX connection to monitor ColdFusion using Visual VM,随JDK一起提供。从那里,您可以生成堆转储文件和/或告诉VM在OOM上生成一个。 Tehn我通过Eclipse Memory Analyzer Tool取得了非常好的成功,setup probes that send a notification有一个可疑的泄漏报告,不止一次帮助追踪服务器OOM崩溃的根本原因。

如果那不是您的场景,那么我建议您在使用ColdFusion企业时启用快照,否则cfstat是您的标准朋友。对于任何一个,当服务器运行缓慢时,您也可以使用<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> 。这可以帮助您连接到相关服务器并在适当的时间生成转储,或者确定问题是否与负载相关。


1
投票

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

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

Stephen Moretti

0
投票

这个时代一直悬而未决,所以我想我会帮忙把它弄清楚。

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

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

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

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

因此,您应该查看其他可以向您的CF服务器执行HTTP请求的软件,如果对HTTP请求的反应表明CF服务器没有响应,则监控软件会告知CF重新启动。


0
投票

要添加到OnApplicationEnd()的答案,可能是您正在寻找上述有趣问题的可能解决方案:

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

直接的答案是否定的。由于This事件是应用程序生命周期的一部分,因此当应用程序本身超时时,不会在此处调用任何事件。 Serve Scope必须清楚。

直接回答你的问题,是的,你可以在应用程序超时或结束时运行自定义脚本文件(无论是什么情况)。你将不得不在这里处理info


-1
投票

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

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

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

希望有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.