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.
提前谢谢了!
编辑:其他一些人在这里有这个问题,但没有解决方案.
编辑:删除线程示例,因为它可能会使问题模糊.发布代码和日志.
听起来这可能是由于服务器关闭而导致的,而不仅仅是CF应用程序关闭造成的。我猜测,如果 JVM 已经处于关闭过程中,那么您的 java 类使用的资源此时可能不可用。因此 onApplicationEnd 可能不是该代码的正确位置。
您可能想考虑添加ShutdownHook。我不是 100% 肯定,但我认为将清理代码放在那里,而不是放在 onApplicationEnd 中,可能会允许 java 对象在 JVM 进入其垂死挣扎阶段之前进行清理。
但话虽如此,一旦服务器关闭,“与网络上另一个设备的连接”不是会自动关闭吗?