如何在部署过程中清除ColdFusion模板缓存?

时间:2012-05-16 14:34:14

标签: caching coldfusion cfc

我在将一些文件部署到ColdFusion网站/应用程序后,今天早上遇到了一个问题。

我使用一些新代码更新了现有的CFC。 CFC有一个init()方法,它返回实例化的Object:

原始MyObject.cfc:

<cfscript>
    VARIABLES.MyParam = "";
</cfscript>

<cffunction name="init" returntype="MyObject" output="false">
    <cfargument name="MyParam" type="String" required="true" />

    <cfscript>
        VARIABLES.MyParam = ARGUMENTS.MyParam;

        return THIS;
    </cfscript>
</cffunction>

新的MyObject.cfc:

<cfscript>
    VARIABLES.MyParam = "";
</cfscript>

<cffunction name="init" returntype="MyObject" output="false">
    <cfargument name="MyParam" type="String" required="true" />

    <cfscript>
        setMyParam(ARGUMENTS.MyParam);

        return THIS;
    </cfscript>
</cffunction>

<cffunction name="setMyParam" output="false" returntype="Void">
    <cfargument name="MyParam" type="String" required="true" />

    <cfset VARIABLES.MyParam = Trim(ARGUMENTS.MyParam) />
</cffunction>

<cffunction name="getMyParam" output="false" returntype="String">
    <cfreturn VARIABLES.MyParam />
</cffunction>

任何时候扩展这个CFC的Object都称为init(),它抛出异常:

  

“从init函数返回的值不是MyObject类型。”

在部署此更改的任何其他环境中都不会发生此问题 - 仅在生产中。

解决这个问题的唯一方法是清除ColdFusion Administrator中的模板缓存。

所以,我正在寻找一种方法来防止将来发生这种情况和/或在部署文件时自动清除模板缓存的方法。

仅供参考,我目前使用Tortoise SVN部署文件。

1 个答案:

答案 0 :(得分:3)

在init()中(或者更优选地,在另一个重载样式方法中),以编程方式调用Admin API的clearTrustedCache()方法:

<cfscript>

     // Login is always required (if the administrator password 
     // is enabled in the ColdFusion Administrator). 
     // This example uses two lines of code. 

     adminObj = createObject("component","cfide.adminapi.administrator");
     adminObj.login("admin");

     // Instantiate the runtime object. 
     myObj = createObject("component","cfide.adminapi.runtime");

     // clear cache 
     myObj.clearTrustedCache();

     // Stop and restart trusted cache. However, only the clearTrustedCache function needs to be called.
     myObj.setCacheProperty("TrustedCache", 0);
     myObj.setCacheProperty("TrustedCache", 1);
</cfscript>

此功能早在CF7(Source)就位。请注意,您需要CF管理员密码。

如果您在管理员中启用了该选项,我还建议您清除组件缓存:

    myObj.clearComponentCache();