Necesito usar onApplicationEnd()
como parte de Application.cfc
para ejecutar una llamada en un objeto de Java de un tercero para cerrar una conexión a otro dispositivo en la red.onApplicationEnd - ¿Se está cerrando CF realmente?
El código he funcionado perfectamente si lo llamo como una solicitud normal, pero cuando lo coloco en el método onApplicationEnd()
me encuentro con algunos errores. Estos errores sugieren que CF podría de hecho cerrar ya al punto en el que no puedo acceder a estas clases Java de terceros.
Código:
<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>
La línea para cerrar la conexión en mi objeto está fallando con el mensaje: 'java.lang.IllegalStateException: Apagando el sistema'.
Éstos son los registros completos para una carrera:
"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 "
¿Existe restricciones a lo que puedo hacer en onApplicationEnd()
y si es así ¿hay alguna solución?
Estoy usando CF 8 (8,0,1,195765) Developer Edition en una máquina con Windows XP.
Además, si ejecuto CF en una ventana de consola y presiono CTRL-C veo esto, pero también veo este comportamiento si ejecuto cfstop
.
¡Muchas gracias de antemano!
EDITAR: Algunos otros tenían este problema here, pero no hay soluciones.
EDITAR: Se eliminó el ejemplo de la secuencia, ya que podría estar empañando el problema. Código publicado y registros.
Acepto que este podría ser el caso e investigaré el uso de este gancho. Estoy usando CF 8, creo que 9 tiene esto integrado en Application.cfc. En cuanto a su último comentario: la razón por la que tengo que hacer esto es la falta de un cierre elegante de la conexión al dispositivo de terceros. –
@Leigh - Perdón por la deplay al llegar al fondo de esto, haber estado ocupado con otras cosas. Necesito pasar un hilo al método de enganche de cierre. He decidido mirar a JavaLoader por Mark Mandel para ayudarme: http://www.compoundtheory.com/?action=displayPost&ID=422. Creo que puedo crear un CFC que implementó Runnable para pasar al método hook. Cualquier otra sugerencia es bienvenida! –
Después de muchas pruebas y más discusión aquí: http://forums.adobe.com/message/2337930#2337930 No puedo encontrar una manera de hacer esto de manera confiable. Incluso crear un hilo y pasarlo al enganche de apagado del tiempo de ejecución del servidor no es bueno, obtengo una excepción de puntero nulo a pesar de que el hilo funciona correctamente fuera de los contextos de apagado del servidor. Muchas gracias por ayudar a todos, estoy implementando una solución para llamar al código de cierre explícitamente antes de que finalice la aplicación, es decir, a través de una solicitud normal. –