ColdFusion-启用ORM会停止ApplicationStart的运行

ColdFusion-启用ORM会停止ApplicationStart的运行,orm,coldfusion,railo,application.cfc,Orm,Coldfusion,Railo,Application.cfc,谁能向我解释一下这种行为吗? 我在ApplicationStart的中设置了一系列应用程序范围的设置,其中一些设置在onSessionStart中提到。然而,当我启用ORM时,似乎onApplicationStart根本没有运行,因此我的onSessionStart方法失败 我花了一段时间才弄明白这是个问题,通常我会在开发过程中通过编程方式点击applicationstart上的进行测试。因此,只有在重新启动服务后,我才发现一个症状。最终,我将其追溯到ORM,它非常简单: THIS.ormena

谁能向我解释一下这种行为吗? 我在ApplicationStart的
中设置了一系列应用程序范围的设置,其中一些设置在
onSessionStart
中提到。然而,当我启用ORM时,似乎onApplicationStart根本没有运行,因此我的onSessionStart方法失败

我花了一段时间才弄明白这是个问题,通常我会在开发过程中通过编程方式点击applicationstart上的
进行测试。因此,只有在重新启动服务后,我才发现一个症状。最终,我将其追溯到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>


THIS.Name=“TestyMcTestable”
THIS.datasource='Test';
THIS.ormenabled=true;

My index.cfm只包含请求范围的转储。 如果我删除orm设置,它会按预期返回。但是,在设置中,应用程序启动时设置的变量完全丢失,并且应用程序启动时似乎根本没有运行

我正在通过在请求之间更改应用程序的名称进行测试,但只是为了确定我也重新启动了服务

我错过什么了吗?这是记录在案的行为吗?我在Railo上运行这个程序-我还没有在ACF上进行过广泛的测试,但是最初的问题也发生在那里,所以我认为这是相同的原因


有人能解释一下吗?

OnApplicationStart仅在应用程序首次在内存中创建时运行,并且在应用程序的生命周期内仅运行一次,除非您显式调用ApplicationStop()之类的东西;或者再次调用该方法,等等。此外,您设置的应用程序范围中的变量是一个请求范围变量,该变量仅在一个请求的生存期内存在。与onSessionStart相同,该请求变量仅在首次创建用户会话时存在

第一个请求:(ApplicationStart&SessionStart Fire)

第二个请求:(应用程序/会话启动不启动)

这是在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>

this.Name=“TestyMcTestable”;
this.ormenabled=true;
this.datasource='cfartgallery';
this.sessionManagement=true;

或者,如果您将请求变量放在OnRequestStart中,它们每次都会出现。希望这有帮助。

原来这是位置设置的问题。在最初的应用程序中,它指向了一个错误的位置。当我剥离Application.cfc进行测试时,我删除了这个设置——没有意识到默认行为是从根目录遍历文件夹以查找持久的cfc。 在这个过程中,应用程序似乎遇到了一个问题,应用程序启动失败,但继续运行Application.cfc中的其他功能


Railo小组的一名成员发现了在Hibernate引擎读取的非持久性CFC中使用伪构造函数的问题。我不确定这是否导致了这个问题,但这似乎很有可能。

您是否尝试过使用
cfset
而不是
cfscript
,您是否也尝试过提供
或msettings
结构来查看发生了什么?我认为这些都不重要,但如果它是一个bug,陌生人可以修复它。在你的
应用程序的非精简版本中。cfc
你是否启用了
会话管理
?在本例中,您不需要这样做。在非精简版本中,我启用了会话管理。不过,这两种方式似乎都没有任何区别。我尝试移动到cfset并提供一个ormsettings结构,但没有成功。谢谢你!我会在每次请求时更改应用程序的名称,以确保onApplicationStart正在启动(或者至少应该启动)。为了确保这一点,我在重启CF服务后进行了测试。如果我在设置中启用ORM,即使在第一次请求时,onApplicationStart也不会启动。我无法在ACF中复制。我会让Railo去看看我能否复制你看到的。
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
<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>