Мне нужно использовать 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>
Строка для закрытия соединения на моем объекте завершается с сообщением: «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()
, и если да, то есть ли какое-нибудь решение?
Я использую CF 8 (8,0,1,195765) Developer Edition на компьютере с Windows XP.
Также, если я запускаю CF в окне консоли и нажимаю CTRL-C, я вижу это, но я также вижу это поведение, если я запускаю cfstop
.
Заранее большое спасибо!
РЕДАКТИРОВАТЬ: Некоторые другие имели эту проблему здесь , но нет решений.
РЕДАКТИРОВАТЬ: Удален пример потока, так как это может затуманить проблему. Прикрепленный код и логи.