È necessario utilizzare onApplicationEnd()
come parte di Application.cfc
per eseguire una chiamata su un oggetto Java di terze parti per chiudere una connessione a un altro dispositivo sulla rete.onApplicationEnd - CF in realtà si sta spegnendo?
Il codice ho funzionato perfettamente se lo chiamo come una richiesta normale, ma quando lo metto nel metodo onApplicationEnd()
sto correndo alcuni errori. Questi errori suggeriscono che CF potrebbe in effetti chiudersi al punto in cui non posso accedere a queste classi Java di terze parti.
Codice:
<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 linea per chiudere la connessione sul mio oggetto sta venendo a mancare con il messaggio: 'java.lang.IllegalStateException: Spegnimento in corso'.
Qui ci sono i log completi per una corsa:
"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 "
c'è restrizioni a quello che posso fare in onApplicationEnd()
e se è così c'è qualche lavoro in giro?
Utilizzo la versione per sviluppatori CF 8 (8,0,1,195765) su un computer Windows XP.
Inoltre, se eseguo CF in una finestra della console e preme CTRL-C, viene visualizzato questo, ma vedo anche questo comportamento se eseguo cfstop
.
Molte grazie in anticipo!
MODIFICA: alcuni altri hanno riscontrato questo problema here, ma nessuna soluzione.
MODIFICA: esempio di thread rimosso in quanto potrebbe appannare il problema. Codice e log inviati.
Sono d'accordo che questo potrebbe essere il caso e indagherò usando questo hook. Sto usando CF 8, penso che 9 sia integrato in Application.cfc. Per quanto riguarda il tuo ultimo commento: l'intera ragione per cui devo farlo è la mancanza di un arresto regolare della connessione al dispositivo di terze parti. –
@Leigh - Ci scusiamo per il deplay nell'approfondimento di questo, occupato da altre cose. Devo passare una discussione al metodo di hookdowndown. Ho deciso di guardare JavaLoader di Mark Mandel per aiutarmi: http://www.compoundtheory.com/?action=displayPost&ID=422. Immagino di poter creare un CFC che implementa Runnable per passare al metodo hook. Qualsiasi altro suggerimento è benvenuto! –
Dopo un sacco di test e qualche altra discussione qui: http://forums.adobe.com/message/2337930#2337930 Non riesco a trovare un modo che possa essere fatto in modo affidabile. Anche creare un thread e passarlo al hook di runtime del server non va bene, ottengo un'eccezione di puntatore nullo nonostante il thread funzioni correttamente al di fuori dei contesti di arresto del server. Molte grazie per l'aiuto di tutti, sto implementando un work-around per chiamare il codice di spegnimento esplicitamente prima della fine dell'applicazione, ad esempio tramite una normale richiesta. –