任何人都可以向我解释这种行为吗?
我在onApplicationStart
中设置了一堆应用程序作用域设置,其中一些设置在onSessionStart
中引用。但是,当我启用ORM时,似乎onApplicationStart根本没有运行,因此我的onSessionStart方法失败。
我花了一段时间才弄明白这是问题,通常我会在开发过程中以编程方式命中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 :(得分:0)
OnApplicationStart仅在Application首次在内存中创建时运行,并且只在Application的生命周期内运行一次,除非您明确调用ApplicationStop();或者再次调用该方法等。此外,您设置的应用程序范围中的变量是一个请求范围变量,仅在一个请求的生命周期内存在。与onSessionStart相同,该请求变量仅在首次创建用户会话时才存在。
第一次请求:( ApplicationStart&amp; SessionStart Fire)
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中,它们每次都会在那里。希望这会有所帮助。
答案 1 :(得分:0)
原来这是cfclocation设置的问题。在原始应用程序中,它指向一个不正确的位置。当我删除Application.cfc进行测试时,我删除了这个设置 - 没有意识到默认行为是从根遍历文件夹寻找持久性CFC。 似乎应用程序在该过程中遇到问题,该过程从onApplicationStart中被轰炸,但继续运行Application.cfc中的其他功能。
Railo小组的其中一个人发现了在Hibernate引擎读取的非持久性CFC中使用伪构造函数的问题。我不确定这是否会导致这个问题,但似乎很可能。