onApplicationEnd - CF实际上正在关闭吗?

Cia*_*her 5 java coldfusion multithreading

我需要使用onApplicationEnd()的部分的Application.cfc执行调用第三方Java对象上,关闭网络上其他设备的连接.

如果我将它称为普通请求,那么我已经完美地运行了代码,但是当我将它放在onApplicationEnd()方法中时,我遇到了一些错误.这些错误表明CF实际上可能已经关闭到我无法访问这些第三方Java类的程度.

码:

    <cffunction name="onApplicationEnd" returnType="void">
    <cfargument name="appScope" required="true" />

    <cfset var logLocation = "test" />

    <cflog file="#logLocation#" text="*** [Application.cfc]  - **** START RUN ****" />
    <cflog file="#logLocation#" text="*** [Application.cfc]  - #timeformat(now(),'HH:mm:ss' )# - onApplicationEnd() called " />


    <cftry>

        <cfif structKeyExists(ARGUMENTS, "appScope")>
            <cflog file="#logLocation#" text="*** [Application.cfc]  - #timeformat(now(),'HH:mm:ss' )# - ARGUMENTS.appScope is defined" />
        <cfelse>
            <cflog file="#logLocation#" text="*** [Application.cfc]  - #timeformat(now(),'HH:mm:ss' )# - ARGUMENTS.appScope is undefined! " />
        </cfif>

        <!--- Check if we have a test crypto object in scope, and if so close it's connection --->
        <cfif structKeyExists(ARGUMENTS.appScope, "testCrypto")>

            <cflog file="#logLocation#" text="*** [Application.cfc]  - #timeformat(now(),'HH:mm:ss' )# - onApplicationEnd() - crypto object exists in app scope" />

            <cfset ARGUMENTS.appScope.testCrypto.closeConnection() />
            <<cflog file="#logLocation#" text="*** [Application.cfc]  - #timeformat(now(),'HH:mm:ss' )# - onApplicationEnd() - closed crypto server connection" />

        <cfelse>
            <cflog file="#logLocation#" text="*** [Application.cfc]  - #timeformat(now(),'HH:mm:ss' )# - onApplicationEnd() - NO crypto server connection present to close" />
        </cfif>

            <cfcatch type="any">

                <cflog file="#logLocation#" text="*** [Application.cfc]  - #timeformat(now(),'HH:mm:ss' )# - onApplicationEnd() - Error - #cfcatch.message#" />

            </cfcatch>

        </cftry>
    <cflog file="#logLocation#" text="*** [Application.cfc]  - #timeformat(now(),'HH:mm:ss' )# - onApplicationEnd() ended " />

</cffunction>
Run Code Online (Sandbox Code Playgroud)

关闭我对象上的连接的行失败,显示消息:'java.lang.IllegalStateException:Shutdown in progress'.

以下是一次运行的完整日志:

"Information","Thread-8","10/23/09","09:05:54",,"*** [Application.cfc]  - **** START RUN 

"Information","Thread-8","10/23/09","09:05:54",,"*** [Application.cfc]  - 09:05:54 - onApplicationEnd() called "

"Information","Thread-8","10/23/09","09:05:54",,"*** [Application.cfc]  - 09:05:54 - ARGUMENTS.appScope is defined"

"Information","Thread-8","10/23/09","09:05:54",,"*** [Application.cfc]  - 09:05:54 - onApplicationEnd() - crypto object exists in app scope"

"Information","Thread-8","10/23/09","09:05:54",,"*** [Application.cfc]  - 09:05:54 - onApplicationEnd() - Error - Shutdown in progress"

"Information","Thread-8","10/23/09","09:05:55",,"*** [Application.cfc]  - 09:05:55 - onApplicationEnd() ended "
Run Code Online (Sandbox Code Playgroud)

对我能做什么有限制onApplicationEnd(),如果有,有什么工作吗?

我在Windows XP机器上使用CF 8(8,0,1,195765)Developer Edition.

此外,如果我在控制台窗口中运行CF并按CTRL-C,我会看到这一点,但如果我运行,我也会看到这种行为cfstop.

提前谢谢了!

编辑:其他一些人在这里有这个问题,但没有解决方案.

编辑:删除线程示例,因为它可能会使问题模糊.发布代码和日志.

Lei*_*igh 3

听起来这可能是由于服务器关闭而导致的,而不仅仅是CF应用程序关闭造成的。我猜测,如果 JVM 已经处于关闭过程中,那么您的 java 类使用的资源此时可能不可用。因此 onApplicationEnd 可能不是该代码的正确位置。

您可能想考虑添加ShutdownHook。我不是 100% 肯定,但我认为将清理代码放在那里,而不是放在 onApplicationEnd 中,可能会允许 java 对象在 JVM 进入其垂死挣扎阶段之前进行清理。

但话虽如此,一旦服务器关闭,“与网络上另一个设备的连接”不是会自动关闭吗?