编辑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) 一些背景:
我正在使用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)
题:
我知道我可以在调用方法之前检查组件的元数据,以验证它是否允许远程访问,但还有其他方法可以解决这个问题吗?
通过在CF9中编写CFC的新方法,CF9的一些新编码约定是什么?
以下是我能想到的一些......
init()返回自身的方法,因为New如果找到则会调用init().init(),否则期望例外...THIS.setXXX在init()中使用XXX是属性名称,以便它可以调用隐式setter或自定义setter(如果可用).isNull(arguments.optionalArg)而不是isDefined()我在Coldfusion 9的邮件假脱机中有大约9,000个未传送的消息.据我所知,管理这些消息的唯一方法是通过CF Admin GUI一次操作10个消息.
我正在寻找一种方法来加快这个过程.我想清除队列,或批量发送它们.
有谁知道如何做到这一点?
谢谢,
戴夫
我正在寻找ColdFusion 9脚本语法中没有的完整标签列表.
例:
我们的 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) 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 =好的
我在我的应用程序范围中放置一个组件,以便在所有请求中共享它,它包含一个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 "___IMPLICITARRYSTRUCTVAR0" 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) 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) 这个问题可能与做大量的事情有关,但在这种情况下,我正在尝试发送电子邮件.
我已在新线程中设置发送过程,因此用户不会等待,并将请求超时重写为一小时.
问题是,一旦进程发送大约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 ×10
coldfusion-9 ×10
cfc ×2
apache-poi ×1
arrays ×1
coldbox ×1
email ×1
java ×1
queue ×1
spool ×1