Почтовая очередь ColdFusion прекращает обработку
-
01-07-2019 - |
Вопрос
Наш CF-сервер иногда перестает обрабатывать почту.Это проблематично, поскольку многие наши клиенты зависят от этого.
Мы нашли в Интернете предложения, в которых упоминаются файлы с нулевым байтом в папке "недоставленные", поэтому я создал задачу, которая удаляет их каждые три минуты.Однако остановка произошла снова.
Я ищу предложения по диагностике и устранению этой проблемы.
- Стандарт CF 8
- Win2k3
Добавлено:
- На момент сбоя очереди в почтовом журнале нет ошибок
- Мы не пытались запустить это без использования очереди из-за большого объема отправляемой нами почты
Добавлено 2:
- Похоже, это не проблема ни с одним из файлов в папке spool.Когда мы перезапускаем почтовую очередь, кажется, что все они обрабатываются правильно.
Добавлено 3:
- Мы не используем вложения.
Решение
Что мы в итоге сделали:
Я написал два запланированных задания.Первый проверил, были ли какие-либо сообщения в папке очереди старше 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>
Другие советы
Мы не пытались запустить это без использования очереди из-за большого объема отправляемой нами почты
Несмотря ни на что, есть ли у вас пытался отключаем буферизацию?Я видел, как почта отправлялась со скоростью 500-600 сообщений за полсекунды, и это на довольно дерьмовом сервере.При стандартном тайм-ауте страницы в 60 секунд это составило бы ~ 72 000 электронных писем, которые вы могли бы отправить до истечения времени ожидания страницы.Отправляете ли вы одновременно более 72 000 сообщений?
Альтернативой, которую я использовал до того, как CFMail стал таким быстрым, было создание пользовательского спулера.Вместо того чтобы отправлять электронные письма "на лету", сохраните их в таблице базы данных.Затем настройте запланированное задание на отправку нескольких сотен сообщений и перенесите его на несколько минут позже, пока таблица не опустеет.
Мы запланировали выполнение задания один раз в день;и он может перепланировать себя для повторного запуска через пару минут, если таблица не пуста.С этим никогда не было проблем.
Вы пробовали просто вообще обойти очередь?(В CF Admin в разделе Настройки почтового спула снимите флажок "Сохранять почтовые сообщения для доставки".)
Иногда у меня возникает такая же проблема, и это не из-за файла с нулевым байтом, хотя эта проблема возникала в прошлом.Похоже, что один или два файла (самые старые в папке) будут препятствовать обработке очереди.Что я делаю, так это перемещаю все сообщения в папку хранения, перезапускаю очередь почты и копирую сообщения обратно по частям в обратном хронологическом порядке, жду, пока они выйдут, и перемещаю еще несколько.Сообщения, которые задерживали очередь, помещаются в отдельную папку для проверки в последнюю очередь.
Вероятно, вы можете программно сделать это с помощью остановка очереди, перемещая самый старый файл в другую папку, затем запуск очереди отправки почты и проверьте, успешно ли началась отправка, проверив количество файлов в папке и даты.Если удаление самого старого файла не сработало, повторяйте предыдущий процесс до тех пор, пока все нежелательные почтовые файлы не будут перемещены и отправка успешно не продолжится.
Я надеюсь, что это поможет.
На самом деле у нас идентичная настройка, 32-битный CF8 на Win2K3.
Мы использовали решение Бена около года назад, и это, несомненно, помогло автоматически ставить в очередь застрявшие электронные письма.
Однако недавно без особой причины один из наших 7 веб-серверов решил переходить в это состояние при каждой попытке отправки электронной почты.
При настройке параметров почтового сервера возникло исключение.Это исключение было вызвано:исключение coldfusion.mail.MailSessionException:При настройке параметров почтового сервера возникло исключение ..
Каждый из наших веб-серверов является идентичным клоном друг друга, так что странно, почему это происходило только с этим.
Еще один момент, на который следует обратить внимание, - это то, что у нас был скрипт, который перезагружал компьютер посреди ночи из-за проблем с управлением памятью JRUN.Акт перезагрузки, по-видимому, и вызвал проблему.Последующий перезапуск службы CF очистит ее, и с машиной все будет в порядке до тех пор, пока она снова не перезагрузится.
Мы обнаружили, что проблема связана со сканером вирусов McAfee, после обновления которого для исключения каталога c:\ColdFusion8 проблема исчезла.
Надеюсь, это поможет.
В CFMX 8 есть / была проблема со спулером почты и сообщениями с вложениями, которая была исправлена с помощью одного из исправлений.В версии 8.0.1, по крайней мере, это должно было быть исправлено.
В коде Бена Дума есть ошибка.В любом случае, спасибо тебе, Бен, код отличный, и сейчас мы используем его на одном из наших серверов с установленным CF8, но:если каталог (\spool) пуст, код завершается с ошибкой (error:Значение даты, переданное функции date DateDiff, не указано или недопустимо.) Это связано с тем, что если каталог объекта запроса пуст (spool.recordcount РАВЕН 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>