代码之家  ›  专栏  ›  技术社区  ›  Ciaran Archer

OnApplicationEnd-CF是否正在关闭?

  •  5
  • Ciaran Archer  · 技术社区  · 17 年前

    我需要使用 onApplicationEnd() 作为 Application.cfc 执行对第三方Java对象的调用,以关闭与网络上的另一设备的连接。

    如果我将其称为普通请求,那么代码就可以很好地工作,但是当我将其放入 应用程序和() 方法我遇到了一些错误。这些错误表明,CF实际上可能已经关闭到无法访问这第三方Java类的点。

    代码:

        <cffunction name="onApplicationEnd" returnType="void">
        <cfargument name="appScope" required="true" />
    
        <cfset var logLocation = "test" />
    
        <cflog file="#logLocation#" text="*** [Application.cfc]  - **** START RUN ****" />
        <cflog file="#logLocation#" text="*** [Application.cfc]  - #timeformat(now(),'HH:mm:ss' )# - onApplicationEnd() called " />
    
    
        <cftry>
    
            <cfif structKeyExists(ARGUMENTS, "appScope")>
                <cflog file="#logLocation#" text="*** [Application.cfc]  - #timeformat(now(),'HH:mm:ss' )# - ARGUMENTS.appScope is defined" />
            <cfelse>
                <cflog file="#logLocation#" text="*** [Application.cfc]  - #timeformat(now(),'HH:mm:ss' )# - ARGUMENTS.appScope is undefined! " />
            </cfif>
    
            <!--- Check if we have a test crypto object in scope, and if so close it's connection --->
            <cfif structKeyExists(ARGUMENTS.appScope, "testCrypto")>
    
                <cflog file="#logLocation#" text="*** [Application.cfc]  - #timeformat(now(),'HH:mm:ss' )# - onApplicationEnd() - crypto object exists in app scope" />
    
                <cfset ARGUMENTS.appScope.testCrypto.closeConnection() />
                <<cflog file="#logLocation#" text="*** [Application.cfc]  - #timeformat(now(),'HH:mm:ss' )# - onApplicationEnd() - closed crypto server connection" />
    
            <cfelse>
                <cflog file="#logLocation#" text="*** [Application.cfc]  - #timeformat(now(),'HH:mm:ss' )# - onApplicationEnd() - NO crypto server connection present to close" />
            </cfif>
    
                <cfcatch type="any">
    
                    <cflog file="#logLocation#" text="*** [Application.cfc]  - #timeformat(now(),'HH:mm:ss' )# - onApplicationEnd() - Error - #cfcatch.message#" />
    
                </cfcatch>
    
            </cftry>
        <cflog file="#logLocation#" text="*** [Application.cfc]  - #timeformat(now(),'HH:mm:ss' )# - onApplicationEnd() ended " />
    
    </cffunction>
    

    关闭对象上连接的行失败,并显示消息:“java.lang.IllegalstateException:Shutdown in progress”。

    以下是一次运行的完整日志:

    "Information","Thread-8","10/23/09","09:05:54",,"*** [Application.cfc]  - **** START RUN 
    
    "Information","Thread-8","10/23/09","09:05:54",,"*** [Application.cfc]  - 09:05:54 - onApplicationEnd() called "
    
    "Information","Thread-8","10/23/09","09:05:54",,"*** [Application.cfc]  - 09:05:54 - ARGUMENTS.appScope is defined"
    
    "Information","Thread-8","10/23/09","09:05:54",,"*** [Application.cfc]  - 09:05:54 - onApplicationEnd() - crypto object exists in app scope"
    
    "Information","Thread-8","10/23/09","09:05:54",,"*** [Application.cfc]  - 09:05:54 - onApplicationEnd() - Error - Shutdown in progress"
    
    "Information","Thread-8","10/23/09","09:05:55",,"*** [Application.cfc]  - 09:05:55 - onApplicationEnd() ended "
    

    我能做什么有限制吗 应用程序和() 如果有的话,还有什么工作要做吗?

    我正在Windows XP计算机上使用CF 8(8,0,1195765)Developer Edition。

    另外,如果我在控制台窗口中运行cf并按ctrl-c,我会看到这个,但是如果我运行,我也会看到这个行为。 cfstop .

    非常感谢!

    编辑:有些人有这个问题 here ,但没有解决方案。

    编辑:删除了线程示例,因为它可能会使问题变得模糊。已发布的代码和日志。

    3 回复  |  直到 17 年前
        1
  •  3
  •   Leigh josh poley    17 年前

    听起来这可能是由于 服务器 正在关闭,而不仅仅是CF应用程序。我猜想,如果JVM已经处于关闭的过程中,那么Java类使用的资源可能在那时不可用。因此,OnApplicationAnd可能不是该代码的正确位置。

    您可能希望查找添加 ShutdownHook . 我不是100%积极的,但我认为把清理代码放在那里,而不是在OnAppultEntEnter中可能允许Java对象在JVM进入其死亡阵痛阶段之前进行清理。

    但是,尽管如此,一旦服务器关闭,“与网络上其他设备的连接”不会自动关闭吗?

        2
  •  2
  •   ryber    17 年前

    根据文档,“您不能使用此方法在用户页面上显示数据,因为它与请求没有关联。”

    我认为“与请求无关”是关键。可能是Java对象只存在于请求线程中,而不存在于应用程序实例中。

    也许你应该尝试使用onrequestend

    http://livedocs.adobe.com/coldfusion/8/AppEvents_09.html

        3
  •  1
  •   Isaac Dealey    17 年前

    我的第一个想法是,当应用程序停止时,服务器不会真正停止…应用程序将停止,但服务器很容易继续运行。如果您有一个目录中有一个旧的application.cfm,并且该目录中只有一些平面的.cfm文件,那么人们可以请求这些cf页,并且它们不能与任何类型的应用程序上下文相关联。因此,实际上您没有运行任何应用程序,仍然可以提供大量的CF页面。当然,这不是人们通常设置CF服务器的方式,但他们是这样工作的。虽然我不知道他们是否已经在CF9中实现了它,但在未来的版本中有一些关于创建类似server.cfc的application.cfc的讨论。

    我的第二个想法是,OnAppulalEntEnter方法导致特定错误“JavaLang.ILLalalStaseExp:Outlook正在进行中的关闭”的唯一方法是,如果您引用的Java对象是Java对象,这些Java对象在某种程度上与应用程序上下文有内在联系,例如您可能通过无文件C访问的对象。OldFusion.Server.ServiceFactory。但是你发布的代码看起来并不是这样的。

    这是一个很长的过程,但是您可以尝试将testcrocrypto对象放在onApplicationEnd方法内的本地/temp变量中,然后从那里执行它。

    很抱歉,我不能再这样了。