2013-03-20 68 views
3

任何人都可以向我解釋這種行爲? 我在onApplicationStart中設置了一堆應用程序範圍設置,其中一些在onSessionStart中提到。但是,當啓用ORM時,似乎onApplicationStart根本沒有運行,因此我的onSessionStart方法失敗。ColdFusion - 啓用ORM停止onApplicationStart從運行

我花了一段時間才發現這是個問題,通常我會在開發過程中以編程方式測試onApplicationStart。所以只有在服務重新啓動後,我發現了一個症狀。最後,我追查回ORM和它的那樣簡單:

THIS.ormenabled = true; // Error 
THIS.ormenabled = false; // Everything peachy 

我剝離下來的Application.cfc並把一些時間戳在不同的方法,這樣我可以看到正在執行:

<cfscript> 
    THIS.Name = "TestyMcTestable" 
    THIS.datasource = 'Test';   
    THIS.ormenabled = true; 
</cfscript>  


<cfsetting 
    requesttimeout="20" 
    showdebugoutput="false" 
    enablecfoutputonly="false" 
    /> 


<cfset request.pseudo = Now() /> 
<cfset sleep(1500)> 

<cffunction name="OnApplicationStart" access="public" returntype="boolean" output="false"> 
    <cfset request.application = Now() /> 
    <cfset sleep(1500)> 
    <!--- Return out. ---> 
    <cfreturn true /> 
</cffunction> 


<cffunction name="OnSessionStart" access="public" returntype="void" output="false"> 
    <cfset request.session = Now() /> 
    <cfset sleep(1500)> 
    <!--- Return out. ---> 
    <cfreturn /> 
</cffunction> 


<cffunction name="OnRequestStart" access="public" returntype="boolean" output="false"> 
    <cfargument name="TargetPage" type="string" required="true" /> 
    <cfset request.requeststart = Now() /> 
    <cfset sleep(1500)> 
    <!--- Return out. ---> 
    <cfreturn true /> 
</cffunction> 


<cffunction name="OnRequest" access="public" returntype="void" output="true"> 
    <cfargument name="TargetPage" type="string" required="true" /> 
    <cfset request.request = Now() /> 
    <cfset sleep(1500)> 

    <!--- Include the requested page. ---> 
    <cfinclude template="#ARGUMENTS.TargetPage#" /> 

    <!--- Return out. ---> 
    <cfreturn /> 
</cffunction> 

我index.cfm只包含請求範圍的轉儲。 如果我刪除了orm設置,它就會按預期返回。但是,在那裏設置,應用程序啓動時設置的變量完全丟失,看起來onApplicationStart根本沒有運行。

我通過更改中間請求中的應用程序名稱進行測試,但僅僅是爲了確定我已重新啓動服務。

我錯過了什麼嗎?這是記錄的行爲?我在Railo上運行這個程序 - 我沒有在ACF上進行過廣泛的測試,但最初的問題也出現在那裏,所以我認爲它是同樣的原因。

任何人都可以對此有所瞭解嗎?

+0

您是否嘗試過使用'cfset'而不是'cfscript',並且您還試圖提供'ormsettings'結構來查看會發生什麼?我認爲這些都不重要,但如果它是一個錯誤,陌生人可以修復它。 – Travis 2013-03-20 22:56:56

+0

在''application.cfc''的非剝離版本中是否啓用了'sessionmanagement'?你不在這個例子中。 – Travis 2013-03-20 23:08:07

+0

在非精簡版中,我確實啓用了sessionmanagement。它似乎沒有任何不同之處。 我試圖移動到cfset,並提供一個ormsettings結構,無濟於事。雖然謝謝! – 2013-03-20 23:14:56

回答

0

原來這是cfclocation設置的問題。在原來的應用程序中,它指向了一個不正確的位置。當我關閉Application.cfc進行測試時,我刪除了這個設置 - 沒有意識到默認行爲是從根目錄遍歷文件夾尋找持久的CFC。 似乎應用程序在onApplicationStart被轟出的過程中遇到了問題,但繼續運行Application.cfc中的其他函數。

Railo小組的成員之一發現了在Hibernate引擎讀取的非持久性CFC中使用僞構造函數的問題。我不確定這是否有助於解決這個問題,但似乎很可能。

0

OnApplicationStart僅在應用程序首次在內存中創建時運行,並且只在應用程序的整個生命週期中運行一次,除非您明確調用ApplicationStop();或者再次調用該方法等。另外,您設置的Application範圍中的變量是一個請求範圍變量,它只存在於一個請求的生命週期中。與onSessionStart相同,該請求變量僅在用戶會話第一次創建時才存在。

第一個請求:(ApplicationStart & SessionStart火)

struct: request 
application  {ts '2013-03-20 18:50:17'} 
cfdumpinited false 
pseudo {ts '2013-03-20 18:50:20'} 
session  {ts '2013-03-20 18:50:19'} 

struct: session 
cfid 5600 
cftoken  a8bf96c34c2cac7a-68400880-E1E6-ACDF-3B204DBBCD9A04A9 
session  {ts '2013-03-20 18:50:19'} 
sessionid TESTYMCTESTABLE_5600_a8bf96c34c2cac7a-68400880-E1E6-ACDF-3B204DBBCD9A04A9 
urltoken CFID=5600&CFTOKEN=a8bf96c34c2cac7a-68400880-E1E6-ACDF-3B204DBBCD9A04A9 

二次要求:(應用/ SessionStart不火)

struct: request 
cfdumpinited false 
pseudo {ts '2013-03-20 18:50:59'} 

struct: session 
cfid 5600 
cftoken  a8bf96c34c2cac7a-68400880-E1E6-ACDF-3B204DBBCD9A04A9 
session  {ts '2013-03-20 18:50:19'} 
sessionid TESTYMCTESTABLE_5600_a8bf96c34c2cac7a-68400880-E1E6-ACDF-3B204DBBCD9A04A9 
urltoken CFID=5600&CFTOKEN=a8bf96c34c2cac7a-68400880-E1E6-ACDF-3B204DBBCD9A04A9 

這是在CF9測試。

application.cfm

<cfcomponent> 
<cfscript> 
    this.Name = "TestyMcTestable"; 
    this.ormenabled = true; 
    this.datasource = 'cfartgallery'; 
    this.sessionManagement = true; 
</cfscript> 

<cfset request.pseudo = Now() /> 
<cfset sleep(1500)> 

<cffunction name="OnApplicationStart" access="public" returntype="boolean" output="false"> 
    <cfset request.application = Now() /> 
    <cfset session.application = Now() /> 
    <cfset sleep(1500)> 
    <!--- Return out. ---> 
    <cfreturn true /> 
</cffunction> 


<cffunction name="OnSessionStart" access="public" returntype="void" output="false"> 
    <cfset request.session = Now() /> 
    <cfset session.session = Now() /> 
    <cfset sleep(1500)> 
    <!--- Return out. ---> 
    <cfreturn /> 
</cffunction> 

<cffunction name="OnRequestStart"> 

</cffunction> 

</cfcomponent> 

另外,如果你把你的請求變量在OnRequestStart,他們將在那裏每次。希望這可以幫助。

+0

我正在更改每個請求上的應用程序的名稱,以確保onApplicationStart正在觸發(或至少,應該是正在觸發)。可以肯定的是,我在重新啓動CF服務後進行了測試。如果我在設置中啓用了ORM,則即使在第一個請求上,onApplicationStart也不會觸發。 – 2013-03-21 01:06:32

+0

我無法在ACF中複製它。我會讓Railo去看看我能否複製你所看到的。 – BKK 2013-03-21 01:50:30