ColdFusion - 启用ORM会停止onApplicationStart运行

时间:2013-03-20 19:30:27

标签: orm coldfusion railo application.cfc

任何人都可以向我解释这种行为吗? 我在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上进行过广泛的测试,但最初的问题也在那里发生,所以我认为这是同样的原因。

任何人都可以对此有所了解吗?

2 个答案:

答案 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中使用伪构造函数的问题。我不确定这是否会导致这个问题,但似乎很可能。