我需要使用onApplicationEnd()
作为Application.cfc
的一部分,以便在第三方Java对象上执行呼叫以关闭与网络上其他设备的连接。onApplicationEnd - CF实际上是否关闭?
如果我将它作为普通请求调用,但我将它放在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>
线收我的对象上的连接与消息失败:“java.lang.IllegalStateException:正在关机”。
下面是一个运行完整的日志:
"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 "
是否有限制,我可以在onApplicationEnd()
做,如果是的话有没有什么解决办法?
我在Windows XP机器上使用CF 8(8,0,1,195765)Developer Edition。
此外,如果我在控制台窗口中运行CF并按下CTRL-C,我看到了这一点,但如果我运行cfstop
,我也会看到此行为。
非常感谢提前!
编辑:其他人有这个问题here,但没有解决方案。
编辑:删除线程示例,因为它可能会模糊问题。发布代码和日志。
我同意这可能是这种情况,并将使用此钩子进行调查。我正在使用CF 8,我认为9已经内置到Application.cfc中。关于您最后的评论:我必须这样做的所有原因是没有正常关闭与第三方设备的连接。 – 2009-10-24 10:58:32
@Leigh - 很抱歉,在这个问题的底部,忙于其他的事情。我需要将一个线程传递给shutdown hook方法。我决定看看Mark Mandel的JavaLoader来帮助我:http://www.compoundtheory.com/?action=displayPost&ID=422。我认为我可以创建一个实现Runnable传递给钩子方法的CFC。欢迎任何其他建议! – 2009-11-02 17:11:32
经过大量测试和更多讨论之后:http://forums.adobe.com/message/2337930#2337930我无法找到一种可以可靠地完成这项工作的方法。即使创建一个线程并将它传递给服务器运行时关闭钩子也不行,我得到一个空指针异常,尽管线程在服务器关闭上下文之外运行良好。非常感谢大家的帮助,我正在实施一个解决方法,在应用程序结束之前明确调用关闭代码,即通过正常的请求。 – 2009-11-03 11:02:51