3

谁能向我解释这种行为?我在 中设置了一堆应用程序范围的设置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 上进行过广泛的测试,但最初的问题也发生在那里,所以我认为它是相同的原因。

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

4

2 回答 2

0

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

第一个请求:(ApplicationStart & 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 上测试的。

应用程序.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 中,它们每次都会在那里。希望这可以帮助。

于 2013-03-21T00:56:18.910 回答
0

原来这是 cflocation 设置的问题。在原始应用程序中,它指向的位置不正确。当我剥离 Application.cfc 进行测试时,我删除了此设置 - 没有意识到默认行为是从根目录遍历文件夹以查找持久性 CFC。然后似乎该应用程序在该过程中遇到了问题,该问题从 onApplicationStart 中被炸毁,但继续运行 Application.cfc 中的其他功能。

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

于 2013-03-26T00:31:40.667 回答