这个问题可能与做任何高容量的事情有关,但在这种情况下,我正在尝试发送电子邮件。
我已经在一个新线程中设置了发送过程,因此用户无需等待,并将请求超时覆盖为一个小时。
问题是,一旦该过程发送了大约 2000 封电子邮件(在下面的代码中循环大约 2000 次),服务器就会耗尽内存,停止响应,并且需要重新启动。
阅读这方面的其他主题,CF 应该能够很好地处理这么多的电子邮件。
我考虑过的一件事是将所有对象调用更改为直接 DB 查询并使用 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 & attributes.emailSignature.getFooter();
var sendEmail = mailService.newMail(
from = attributes.emailSignature.getEmailAddress(),
//to = profile.getPrimaryEmail(),
to = Application.settings.testemail,
subject = attributes.rc.email.subject,
body = emailBody,
type="html");
sendEmail.addMailParam(disposition='attachment', file=attributes.email.getAttachmentWithPath());
mailService.send(sendEmail);
//log profile event
profile.saveEvent(eventType = 3,
title="Broadcast Email: #attributes.rc.email.subject#",
description="Broadcast Email Sent: Subject: <br> #attributes.rc.email.subject#",
sentContent=emailBody,
ref2=1);
sentCount++;
}
}
catch (any exception){
//log profile event
profile.saveEvent(eventType = 3,
title="FAILED Broadcast Email",
description="<br>Subject: #attributes.email.subject#<br>This email should have been sent to this profile, but the attempted send failed. The likely cause is a malformed email address.",
sentContent=emailBody,
ref2=0);
failedCount++;
}
}
emailSent = true;
}
//persist email object
if (listFind(attributes.rc.email.action,'save')){
email.setTstamp(attributes.prc.now);
email.setSent(emailSent);
email.setStatsSent(sentCount);
email.save();
}
}//end thread