ColdFusion 邮件队列停止处理

13

我们的CF服务器偶尔会停止处理邮件。这是一个问题,因为我们的许多客户都依赖它。

我们在网上找到了一些建议,提到无法投递文件夹中的零字节文件,所以我创建了一个任务,每三分钟删除它们。然而,停滞现象又再次发生。

我正在寻求有关诊断和修复此问题的建议。

  • CF 8标准版
  • Win2k3

添加:

  • 队列失败时邮件日志中没有错误
  • 由于我们发送的邮件数量很大,因此我们尚未尝试在不使用队列的情况下运行此操作

添加2:

  • 似乎没有任何spool目录中的文件出现问题。当我们重新启动邮件队列时,它们似乎都能正常处理。

添加3:

  • 我们没有使用附件。
7个回答

12

我们最终采取的做法:

我编写了两个定时任务。第一个任务检查队列文件夹中是否有超过n分钟(当前设置为30)的消息。第二个任务在低使用期间每晚重置队列。

不幸的是,我们从未真正发现为什么队列会失控,但只有在使用Exchange时才会出现此问题,而我们尝试过的其他邮件服务器并没有此问题。

编辑: 有人要求我发布我的代码,这里是处理旧邮件时重新启动的代码:

<cfdirectory action="list" directory="c:\coldfusion8\mail\spool\" name="spool" sort="datelastmodified">
<cfset restart = 0>
<cfif datediff('n', spool.datelastmodified, now()) gt 30>
    <cfset restart = 1>
</cfif>
<cfif restart>
    <cfset sFactory = CreateObject("java","coldfusion.server.ServiceFactory")>
    <cfset MailSpoolService = sFactory.mailSpoolService>
    <cfset MailSpoolService.stop()>
    <cfset MailSpoolService.start()>
</cfif>

我曾经定期遇到这个问题,就像奇怪的"<."问题一样,我们从未找到原因...... 我们可以发送100封完全相同的邮件,第35封会被卡住... 删除最旧的解决了这个问题... 设置一个进程来监控那些奇怪的未记录的jrun故障是一个很好的解决方案。 - OhkaBaka
我们正在使用Windows Server 2003中提供的IIS SMTP服务器。该服务器已经运行了几年,然后在过去6个月左右发生了4次问题。如果您愿意,我可以开始一个新的问题,而不是继续这个问题。 - Loftx
我不介意你在这里发表评论。但我担心你可能看不到新的答案。听起来像是另一个问题。我每天看到4次掉线。 - Ben Doom
今天在CF10中看到了这个。答案中的stop()和start()代码有效。显然,这个错误和解决方法将永远存在。 - user2404501
实际上,这可能会引入一个新的错误。CF10,W2K8。我们每晚都使用它,因为队列偶尔会停止处理。现在我们收到重复的邮件,结果发现很可能现在有两个 spooler 的副本正在运行。 - Steve
显示剩余2条评论

5
我们尚未尝试在不使用队列的情况下运行此程序,因为我们发送的邮件数量很大。
但是,您是否尝试关闭邮件缓存?我曾经看到过在一个相当糟糕的服务器上以每半秒500-600封的速度发送邮件。标准页面超时设置为60秒,这意味着在页面超时之前,您可以发送大约72,000封电子邮件。您一次发送的邮件数量是否超过72,000?
在CFMail之前,我使用的另一种方法是构建自定义缓存器。不要即时发送电子邮件,而是将它们保存到数据库表中。然后设置一个定时作业来发送几百个消息,并在几分钟后重新安排自己,直到表为空为止。
我们将作业安排在每天运行一次;如果表不为空,它可以重新安排自己在几分钟后再次运行。从未遇到过任何问题。

3
你尝试过完全绕过队列吗?(在CF管理中,转到邮件备份设置,取消选中“为传递邮件消息备份”)。

3
有时候我会遇到同样的问题,但并不是由于零字节文件引起的,虽然过去曾经出现这个问题。似乎有一两个文件(文件夹中最旧的文件)会阻止邮件队列进行处理。我的做法是将所有消息移到一个保持文件夹中,重新启动邮件队列,逆序分块复制消息,等待它们发送完毕后再移动更多的文件。那些阻止队列的邮件会被放在单独的文件夹中供以后检查。
你可以通过编程方式来实现这个操作,先通过停止邮件队列,将最老的文件移动到另一个文件夹中,然后启动邮件队列并检查文件夹文件计数和日期,看是否成功开始发送。如果删除最老的文件没有起作用,就重复上述操作,直到所有有问题的邮件文件都被移动,发送才继续成功。
希望这些能对你有所帮助。

2

我们实际上有一个相同的设置,Win2K3上的32位CF8。

大约一年前,我们采用了Ben的解决方案,这确实有助于自动重新排队被卡住的电子邮件。

然而,最近由于没有特定的原因,我们的7个Web服务器中的一个在每次尝试发送电子邮件时都会进入此状态。

设置邮件服务器参数时发生异常。 此异常是由以下原因引起的:coldfusion.mail.MailSessionException: 在设置邮件服务器参数时发生异常。

我们的每台Web服务器都是完全相同的克隆品,因此它只会发生在其中一个服务器上非常奇怪。

另一个需要注意的问题是,我们有一个脚本,可以在夜间由于JRUN的内存管理问题重启机器。重新启动似乎会引发问题。随后重新启动CF服务将清除它,机器会一直保持正常状态,直到再次重启。

我们发现该问题与McAfee病毒扫描程序有关,在更新后将其排除在c:\ColdFusion8目录之外后,问题就消失了。

希望能有所帮助。


1

本杜姆的代码存在一个bug。感谢您的努力,Ben,这段代码非常好用,我们在安装了CF8的一台服务器上使用它,但是:如果目录(\spool)为空,则代码会失败(错误:传递给日期函数DateDiff的日期值未指定或无效)。这是因为如果查询对象spool为空(spool.recordcount EQ 0),datediff函数会产生错误。

我们现在使用的是:

<!--- check if request for this page is local to prevent "webusers" to request this page over and over, only localhost (server) can get it e.g. by cf scheduled tasks--->
<cfsetting requesttimeout="30000">
<cfset who = CGI.SERVER_NAME>
<cfif find("localhost",who) LT 1>
    security restriction, access denied.
    <cfabort>
</cfif> 

<!--- get spool directory info --->
<cfdirectory action="list" directory="C:\JRun4\servers\cfusion\cfusion-ear\cfusion-war\WEB-INF\cfusion\Mail\Spool\" name="spool" sort="datelastmodified">
<cfset restart = 0>
<cfif spool.recordcount GT 0><!--- content there? --->
    <cfif datediff('n', spool.datelastmodified, now()) gt 120>
        <cfset restart = 1>
    </cfif>
</cfif>
<cfif restart><!--- restart --->
    <cfsavecontent variable="liste">
        <cfdump var="#list#">
    </cfsavecontent>    
    <!--- info --->
    <cfmail to="x@y.com" subject="cfmailqueue restarted by daemon" server="xxx" port="25"  from="xxxx" username="xxxx" password="xxx" replyto="xxxx">
    1/2 action: ...try to restart. Send another mail if succeeded!
    #now()#

    Mails:
    #liste#
    </cfmail>

    <cfset sFactory = CreateObject("java","coldfusion.server.ServiceFactory")>
    <cfset MailSpoolService = sFactory.mailSpoolService>
    <cfset MailSpoolService.stop()>
    <cfset MailSpoolService.start()>

    <!--- info --->
    <cfmail to="x@y.com" subject="cfmailqueue restarted by daemon" server="xxx" port="25"  from="xxxx" username="xxxx" password="xxx" replyto="xxxx">
    2/2 action: ...succeeded!
    #now()#
    </cfmail>

</cfif>

0

CFMX 8 中存在/曾经存在邮件 spooler 的问题,特别是带有附件的邮件,但其中一个热修补程序已经解决了这个问题。至少版本 8.0.1 应该已经修复了此问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接