Очередь почты ColdFusion останавливает обработку - PullRequest
13 голосов
/ 18 сентября 2008

Наш CF-сервер иногда останавливает обработку почты. Это проблематично, так как многие наши клиенты зависят от этого.

Мы нашли предложения в Интернете, в которых упоминаются нулевые байтовые файлы в папке невозможности доставки, поэтому я создал задачу, которая удаляет их каждые три минуты. Однако остановка произошла снова.

Я ищу предложения по диагностике и устранению этой проблемы.

  • CF 8 стандарт
  • Win2k3

Добавлено:

  • В почтовом журнале нет ошибок в момент сбоя очереди
  • Мы не пытались запустить это без использования очереди, из-за большого количества отправляемых нами писем

Добавлено 2:

  • Похоже, что это не проблема ни с одним из файлов в папке спула. Когда мы перезапускаем почтовую очередь, кажется, что все они обрабатываются правильно.

Добавлено 3:

  • Мы не используем вложения.

Ответы [ 7 ]

13 голосов
/ 09 февраля 2009

Что мы в итоге сделали:

Я написал две запланированные задачи. Сначала проверяется, есть ли в папке очереди какие-либо сообщения старше 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>
5 голосов
/ 26 сентября 2008

Мы не пытались запустить это без использования очереди, из-за большого количества отправляемых нами писем

Независимо от того, пытались ли вы 1006 * отключить буферизацию? Я видел, как почта отправлялась со скоростью 500-600 сообщений за полсекунды, и это на каком-то дерьмовом сервере. При стандартном таймауте страницы в 60 секунд это будет ~ 72 000 электронных писем, которые вы можете отправить до истечения срока ожидания страницы. Вы отправляете более 72 000 одновременно?

Альтернативой, которую я использовал до CFMail, было быстрое создание собственного спулера. Вместо отправки электронных писем на лету сохраните их в таблицу базы данных. Затем настройте запланированное задание, чтобы отправить несколько сотен сообщений и перенастроить себя на несколько минут, пока таблица не станет пустой.

Мы запланировали запуск задания один раз в день; и он может перепланировать себя на повторный запуск через пару минут, если таблица не пуста. Никогда не было проблем с этим.

3 голосов
/ 21 сентября 2008

У меня иногда возникает такая же проблема, и это не связано с нулевым байтовым файлом, хотя эта проблема возникла в прошлом. Похоже, что один или два файла (самые старые в папке) будут препятствовать обработке очереди. Что я делаю, так это перемещаю все сообщения в папку хранения, перезапускаю почтовую очередь и копирую сообщения обратно в чанке за раз в обратном хронологическом порядке, ожидаю, пока они выйдут, и перенесем еще немного. Сообщения, которые удерживали очередь, помещаются в отдельную папку для последующего изучения.

Вероятно, вы можете программно сделать это, остановив очередь , переместив самый старый файл в другую папку, затем запустите почтовую очередь и посмотрите, успешно ли начинается отправка, проверив количество файлов в папке и даты. Если удаление самого старого файла не работает, повторяйте предыдущий процесс до тех пор, пока не будут перемещены все поврежденные почтовые файлы и отправка продолжится успешно.

Надеюсь, поможет.

3 голосов
/ 18 сентября 2008

Вы пытались просто обойти очередь вообще? (В CF Admin в настройках Mail Spool снимите флажок «Буферизовать почтовые сообщения для доставки».)

2 голосов
/ 11 мая 2012

У нас фактически идентичная установка, 32-битный CF8 на Win2K3.

Мы использовали решение Бена около года назад, и это определенно помогло автоматически перезаписывать застрявшие электронные письма.

Однако в последнее время без особой причины один из наших 7 веб-серверов решил переходить в это состояние при каждой попытке электронной почты.

Исключительная ситуация при настройке параметров почтового сервера. Это исключение было вызвано: coldfusion.mail.MailSessionException: Возникла исключительная ситуация при настройке почтового сервера параметры ..

Каждый из наших веб-серверов является идентичным клоном друг друга, поэтому почему это происходит только с этим, странно.

Еще один момент, на который следует обратить внимание, это то, что у нас был скрипт, который перезагружал машину посреди ночи из-за проблем с управлением памятью в JRUN. Акт перезагрузки, казалось, инициировал проблему. Последующий перезапуск службы CF затем очистит ее, и с машиной все будет в порядке, пока она снова не перезагрузится.

Мы обнаружили, что проблема связана со сканером вирусов McAfee, после обновления для исключения каталога c: \ ColdFusion8 проблема исчезла.

Надеюсь, это поможет.

0 голосов
/ 26 апреля 2014

В коде Бена Дума есть ошибка. В любом случае, спасибо, код отличный, и теперь мы используем его на одном из наших серверов с установленным CF8, но: если каталог (\ spool) пуст, код завершается ошибкой (ошибка: значение Date, переданное в функцию date, DateDiff не указан или недействителен.) Это потому, что если буфер объекта запроса пуст (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 голосов
/ 25 сентября 2008

Существует / была проблема с диспетчером очереди почты и сообщениями с вложениями в CFMX 8, которая была исправлена ​​с одним из исправлений. По крайней мере, версия 8.0.1 должна была это исправить.

...