标签: coldfusion-9

添加大型查询时,如何修复SpreadSheetAddRows函数崩溃?

编辑3:感谢@Leigh的帮助我将问题缩小到了查询中的日期列.使用原始代码集和POI时,当SpreadSheetAddRows()尝试添加包含类似日期的单元格的非常大的查询时,页面崩溃.我在这里做了一个错误报告:https://bugbase.adobe.com/index.cfm?event = bug &id = 3432184.


我有一个查询,我添加到一个spreadhseet对象,当查询具有非常多的行(在此示例中为18583)时似乎出错.确切的错误如下:

java.lang.ArrayIndexOutOfBoundsException: -32735
at java.util.ArrayList.get(ArrayList.java:324)
at org.apache.poi.hssf.model.WorkbookRecordList.get(WorkbookRecordList.j ava:50)
at org.apache.poi.hssf.model.Workbook.getExFormatAt(Workbook.java:787)
at org.apache.poi.hssf.usermodel.HSSFCell.getCellStyle(HSSFCell.java:901 )
at org.apache.poi.hssf.usermodel.HSSFSheet.autoSizeColumn(HSSFSheet.java :1727)
at coldfusion.excel.Excel.autoResize(Excel.java:1246)
at coldfusion.excel.Excel.autoResize(Excel.java:1240)
at coldfusion.excel.Excel.addRows(Excel.java:1214)
at coldfusion.runtime.CFPage.SpreadSheetAddRows(CFPage.java:7089) at coldfusion.runtime.CFPage.SpreadSheetAddRows(CFPage.java:7076)
Run Code Online (Sandbox Code Playgroud)

这是相关的代码:

<cfset xls = spreadsheetNew()>
<cfset spreadsheetAddRow(xls, arrayToList( qryTest.getMeta().getColumnLabels() ))>
<cfset SpreadsheetFormatRow(xls, {bold=true,fgcolor="brown",color="white"}, 1)>
<cfset SpreadsheetAddRows(xls, qryTest)>
<cfheader name="Content-Disposition" value="attachment; filename=#filename#">
<cfcontent variable="#spreadsheetReadBinary(xls)#" reset="yes" type="application/vnd.ms-excel">
Run Code Online (Sandbox Code Playgroud)

编辑:我之前成功使用过cfspreadsheet,但它没有生成带有标题的电子表格(并且它还有需要创建临时文件以供服务的缺点.)


EDIT2:关注@Leigh建议我更新了CF9/lib文件夹中的POI.现在错误已更改为以下内容:

<cfset SpreadsheetFormatRow(xls, {bold=true,fgcolor="brown",color="white"}, 1)> 给出以下消息:org.apache.poi.hssf.util.HSSFColor.getIndexHash()Ljava/util/Hashtable;

错误代码:

java.lang.NoSuchMethodError:
org.apache.poi.hssf.util.HSSFColor.getIndexHash()Ljava/util/Hashtable;
at coldfusion.excel.Excel.getHSSFColor(Excel.java:2094)
at coldfusion.excel.Excel.findFont(Excel.java:2237)
at coldfusion.excel.Excel.getCellStyle(Excel.java:2318)
at coldfusion.excel.Excel.formatRow(Excel.java:2948)
at …
Run Code Online (Sandbox Code Playgroud)

java arrays coldfusion apache-poi coldfusion-9

7
推荐指数
1
解决办法
7211
查看次数

实现onCFCRequest()时,公共函数可以远程访问

一些背景:

我正在使用onCFCRequest()与常规CFM页面请求分开处理远程CFC调用.这允许我捕获错误并为所有远程请求干净地设置MIME类型.

问题:

我不小心设置了一些远程CFC功能,public而不是remote在远程调用时意识到它们仍在工作.

正如您在下面所看到的,我的实现onCFCRequest()为我的整个应用程序创建了一个巨大的安全漏洞,其中HTTP请求可用于public在任何HTTP可访问的CFC上调用任何方法.

REPRO CODE:

在Application.cfc中:

    public any function onCFCRequest(string cfc, string method, struct args){
        cfc = createObject('component', cfc);
        return evaluate('cfc.#method#(argumentCollection=args)');
    }
Run Code Online (Sandbox Code Playgroud)

在远程调用的CFC中:

    public any function publicFunction(){
        return 'Public function called remotely!';
    }
Run Code Online (Sandbox Code Playgroud)

题:

我知道我可以在调用方法之前检查组件的元数据,以验证它是否允许远程访问,但还有其他方法可以解决这个问题吗?

coldfusion coldfusion-9

7
推荐指数
1
解决办法
649
查看次数

在CF9中编写cfc的编码约定?

通过在CF9中编写CFC的新方法,CF9的一些新编码约定是什么?

以下是我能想到的一些......

coldfusion cfc coldfusion-9

6
推荐指数
1
解决办法
1056
查看次数

Coldfusion 9,如何清空"未送达的邮件队列"

我在Coldfusion 9的邮件假脱机中有大约9,000个未传送的消息.据我所知,管理这些消息的唯一方法是通过CF Admin GUI一次操作10个消息.

我正在寻找一种方法来加快这个过程.我想清除队列,或批量发送它们.

有谁知道如何做到这一点?

谢谢,

戴夫

email queue coldfusion spool coldfusion-9

6
推荐指数
1
解决办法
5421
查看次数

无法使用的标签列表ColdFusion 9脚本语法?

我正在寻找ColdFusion 9脚本语法中没有的完整标签列表.

例:

  • CFSetting:是一个在Railo中可用但在CF9中不可用于cfscript的示例
  • CFDocument:到目前为止我找不到这个.

coldfusion coldfusion-9

6
推荐指数
1
解决办法
1223
查看次数

Coldfusion“例程不能声明多次”

我们的 Application.cfc 中有以下代码:

<cffunction name="onError" returnType="void" output="false">
    <cfargument name="exception" required="true">
    <cfargument name="eventname" type="string" required="true">
    <cfset cfcatch = exception>
    <cfinclude template="standalone/errors/error.cfm">
</cffunction>
Run Code Online (Sandbox Code Playgroud)

在 error.cfm 页面中,我们有以下代码(不是我写的):

<cfscript>
        function GetCurrentURL() {
            var theURL = "http";
            if (cgi.https EQ "on" ) theURL = "#TheURL#s";
            theURL = theURL & "://#cgi.server_name#";
            if(cgi.server_port neq 80) theURL = theURL & ":#cgi.server_port#";
            theURL = theURL & "#cgi.path_info#";
            if(len(cgi.query_string)) theURL = theURL & "?#cgi.query_string#";
            return theURL;  
        }
</cfscript>
Run Code Online (Sandbox Code Playgroud)

这是脚本的一部分,该脚本将有关错误的大量详细信息放在一起并将其记录到数据库中。

发生错误时,我们会收到消息“例程 GetCurrentURL 已在不同模板中声明两次”。然而,我以几种不同的方式搜索了整个代码库,发现“GetCurrentURL”只使用了两次,两次都在 error.cfm 中。第一次是声明,第二次是实际使用。所以我不知道为什么 CF 说“在不同的模板中”。

我的下一个想法是问题是递归调用,而 error.cfm 正在出错并调用自身,因此我尝试了这两个更改,其中任何一个都应该解决问题并揭示真正的错误:

<cfif …
Run Code Online (Sandbox Code Playgroud)

coldfusion application.cfc coldfusion-9

6
推荐指数
1
解决办法
6990
查看次数

了解房产的精确度和规模

property name="poiLat" length="60" ormtype="big_decimal" persistent=true precision="16" scale="14" default="0" hint="";
Run Code Online (Sandbox Code Playgroud)

我不正确地理解精度或比例.使用上面的属性为什么'1'会出错并且'2'被接受?应该怎么做才能接受'1'

1)-118.27 =错误

2)-18.27 =好的

coldfusion coldfusion-9

6
推荐指数
1
解决办法
237
查看次数

从CFC中包含CFM时的并发和范围问题

我在我的应用程序范围中放置一个组件,以便在所有请求中共享它,它包含一个cfm模板:

<cfcomponent output="false">

    <cffunction name="run" output="false" returntype="void">

        <cfset var tmp = false/>

        <cftry>
            <cfinclude template="inc.cfm"/>
            <cfcatch>
                <cffile action="append"
                        file="#ExpandPath("error.log")#"
                        output="ERROR: #cfcatch.message#"/>
            </cfcatch>
        </cftry>

    </cffunction>

</cfcomponent>
Run Code Online (Sandbox Code Playgroud)

正在包含的模板只是创建一个数组并检查数组长度应该是什么,如果不是它写入error.log文件:

<cfset tmp = [
    "one",
    "two",
    "three"
]/>
<cfif ArrayLen(tmp) neq 3>
    <cffile action="append"
            file="#ExpandPath("error.log")#"
            output="Length = #ArrayLen(tmp)#"/>
</cfif>
Run Code Online (Sandbox Code Playgroud)

如果我然后在它上面运行一个加载(100个并发线程),我会在我的error.log文件中出现以下项目...

ERROR: element at position 3 of array variable &quot;___IMPLICITARRYSTRUCTVAR0&quot; cannot be found.
Length = 0
Length = 2
Run Code Online (Sandbox Code Playgroud)

注意我在Java 1.7.0_09上使用ColdFusion 9.0.1.274733.我在相同的JRE上测试过Railo并且工作正常.


附加以下还会导致问题,将tmp变量更改为结构并在variables范围中添加随机项,而不是在任何地方引用...

<cfcomponent output="false"> …
Run Code Online (Sandbox Code Playgroud)

coldfusion cfc coldfusion-9

6
推荐指数
1
解决办法
246
查看次数

ColdFusion的Duplicate函数不会复制查询的元数据

DuplicateColdFusion 9 的功能应该返回一个变量的克隆,也称为深拷贝,而不引用原始变量.对于复杂的对象,例如结构和查询,这应该是正确的.

我正在使用一个使用APPLICATION范围内的查询对象的代码.需要在本地修改此查询以在特定页面中使用,我需要知道原始查询字符串是什么(在查询对象的元数据中).因此,在这种情况下,创建原始查询的深层副本是最明智的解决方案.

但不幸的是,看起来ColdFusion并不是克隆整个对象,而只是克服其结果集,从而丢失了所有元数据.

这不是我期望的行为Duplicate,我发现它与复制其他类型的复杂对象时发生的情况不一致.

我的问题的一个解决方案是将结果集和sql字符串作为单独的参数传递给函数.

但是,我想知道,如果你有一个更优雅的解决方案,和/或对查询重复问题略微说明.

这里有一些代码证明了查询重复的问题:

<cfquery name="qry" datasource="mydatasource">
    SELECT "blue" AS colour, "pear" as fruit
</cfquery>
<cfset qry_copy = qry>
<cfset qry_deepcopy = duplicate(qry)>

<cfdump var="#qry#" label="Original query" />
<cfdump var="#qry_copy#" label="Copy of the query (by reference)" />
<cfdump var="#qry_deepcopy#" label="Deep copy of the query (by value)" />

<cfdump var="#qry.getMetaData().getExtendedMetaData()#" label="Metadata of the original query" />
<cfdump var="#qry_copy.getMetaData().getExtendedMetaData()#" label="Metadata of the copy of the query" />
<cfdump var="#qry_deepcopy.getMetaData().getExtendedMetaData()#" label="Metadata of the deep copy …
Run Code Online (Sandbox Code Playgroud)

coldfusion pass-by-value coldfusion-9

6
推荐指数
1
解决办法
510
查看次数

使用Coldfusion发送大量电子邮件

这个问题可能与做大量的事情有关,但在这种情况下,我正在尝试发送电子邮件.

我已在新线程中设置发送过程,因此用户不会等待,并将请求超时重写为一小时.

问题是,一旦进程发送大约2000封电子邮件(通过以下代码循环约2000次),服务器就会耗尽内存,停止响应并需要重新启动.

阅读其他主题,CF应该能够很好地处理这一批电子邮件.

我考虑过的一件事是将所有对象调用更改为直接数据库查询并使用cfmail标记(我猜)删除所有对象的创建并在达到请求时构建(我猜是正在发生的事情),但我是不确定这是否会产生影响,并且如果可能的话,我真的想避免这种做法.我考虑过的其他东西是将它分成3个或4个单独的线程,但同样,不确定是否能解决问题.

有没有人遇到过这个问题,你发现什么能让处理继续进行而没有ram慢慢填满并杀死服务器?

thread name="sendBroadcastEmail" rc="#rc#" prc="#prc#" filters="#rc.filters#" email="#email#" emailSignature="#emailSignature#"{
    createObject( "java", "coldfusion.tagext.lang.SettingTag" ).setRequestTimeout(javaCast( "double", 3600 ));

        //get profiles that it will be sent to
        var sendToProfiles = profileService.getWithFilters(rc.filters);

        var mailService = getPlugin("MailService");
        var emailSent = false;
        var sentCount = 0;
        var failedCount = 0;

        //send the email (and log in profile events)
        if (listFind(attributes.rc.email.action,'send')){

            for ( i=1; i<=arrayLen(sendToProfiles);i++){
                var profile = sendToProfiles[i];
                try{

                    if (len(trim(profile.getPrimaryEmail()))){

                        var emailBody = profile.processDynamicPlaceholders(attributes.rc.email.body);
                        var emailBody = attributes.emailSignature.getHeader() & emailBody & …
Run Code Online (Sandbox Code Playgroud)

coldfusion coldbox coldfusion-9 coldfusion-10

6
推荐指数
1
解决办法
259
查看次数