Почтовая очередь ColdFusion прекращает обработку
Наш сервер CF иногда перестает обрабатывать почту. Это проблематично, так как от этого зависят многие наши клиенты.
Мы нашли предложения в Интернете, в которых упоминаются файлы с нулевым байтом в папке с недопустимыми папками, поэтому я создал задачу, которая удаляет их каждые три минуты. Однако остановка произошла снова.
Я ищу предложения для диагностики и исправления этой проблемы.
Добавлено:
- В момент отсутствия очереди в почтовом журнале ошибок нет.
- Мы не пытались запустить это без использования очереди из-за большого количества отправляемой нами почты.
Добавлено 2:
- Кажется, что это не проблема с любыми файлами в папке спула. Когда мы перезапускаем почтовую очередь, все они обрабатываются правильно.
Добавлено 3:
- Мы не используем вложения.
Ответы
Ответ 1
Что мы закончили:
Я написал две запланированные задачи. Сначала проверено, были ли какие-либо сообщения в папке очереди старше n минут (в настоящее время установлено значение 30). Вторая reset очередь каждую ночь при низком использовании.
К сожалению, мы никогда не узнали, почему очередь выйдет из рельсов, но это происходит только тогда, когда мы используем 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>
Ответ 2
Мы не пытались запустить это без использования очереди из-за большого количества отправляемой нами почты
Независимо от того, пытались ли вы отключить спулинг? Я видел, как почта отправляется со скоростью 500-600 сообщений за полсекунды, и это похоже на дрянной сервер. При стандартном таймауте страницы через 60 секунд это будет ~ 72 000 электронных писем, которые вы могли бы отправить до того, как страница будет отключена. Вы отправляете более 72 000 одновременно?
Альтернативой, которую я использовал до того, как CFMail было так быстро, было создание настраиваемого спулера. Вместо того, чтобы отправлять электронные письма "на лету", сохраните их в таблице базы данных. Затем настройте запланированное задание, чтобы отправить несколько сотен сообщений и перенести себя на несколько минут позже, пока таблица не станет пустой.
Мы назначили работу на работу один раз в день; и он может перераспределить себя, чтобы снова запустить за пару минут, если таблица не пуста. Никогда не было проблем с этим.
Ответ 3
Вы пробовали просто обходить очередь в целом? (В диспетчере CF в настройках Mail Spool снимите флажок "Письма очереди почты для доставки".)
Ответ 4
Иногда у меня такая же проблема, и это связано не с файлом с нулевым байтом, хотя эта проблема возникла в прошлом. Кажется, что один или два файла (самые старые в папке) будут препятствовать обработке очереди. То, что я делаю, - это переместить все сообщения в папку для хранения, перезапустить почтовую очередь и скопировать сообщения обратно в кусок за раз в обратном хронологическом порядке, дождаться их выхода и переместить еще немного. Сообщения, которые удерживали очередь, помещаются в отдельную папку для изучения последней.
Возможно, вы программно сделаете это с помощью остановки очереди, переместите старый файл в другую папку, затем запустите почту очереди и проверьте, успешно ли отправлена отправка, путем проверки количества файлов папок и дат. Если удаление самого старого файла не работает, повторите предыдущий процесс до тех пор, пока все повреждающие почтовые файлы не будут перемещены и передача не будет продолжена.
Я надеюсь, что это поможет.
Ответ 5
У нас есть идентичная настройка, 32-битная CF8 на Win2K3.
Мы применили решение Ben около года назад, и некоторые из них помогли автоматическим переупорядочивать электронные письма, которые застряли.
Однако недавно, без какой-либо определенной причины, один из наших 7 веб-серверов решил войти в это состояние с каждой попыткой электронной почты.
При настройке параметров почтового сервера произошло исключение. Это исключение было вызвано: coldfusion.mail.MailSessionException: Исключение произошло при настройке почтового сервера Параметры..
Каждый из наших веб-серверов - это идентичные клоны друг друга, поэтому почему это происходит только с тем, что это странно.
Еще один пункт, который следует отметить, это то, что у нас был script, который перезагружает компьютер в середине ночи из-за проблем управления памятью JRUN. Кажется, что акт перезагрузки вызвал проблему. Последующий перезапуск службы CF затем очистит ее, и машина будет в порядке, пока она не перезагрузится снова.
Мы обнаружили, что проблема связана с сканером вирусов McAfee после обновления, чтобы исключить каталог c:\ColdFusion8, проблема исчезла.
Надеюсь, что это поможет.
Ответ 6
Существует проблема с диспетчером очереди сообщений и сообщениями с вложениями в CFMX 8, которые были исправлены с одним из исправлений. Версии 8.0.1, по крайней мере, должны были быть исправлены.
Ответ 7
В коде Ben Doom есть ошибка. Спасибо, в любом случае, код отличный, и теперь мы используем его на одном из наших серверов с установленным CF8, но:
если каталог (\ spool) пуст, код не работает (ошибка: значение даты, переданное функции даты DateDiff, не указано или недействительно). Это потому что, если пул объектов запроса пуст (spool.recordcount EQ 0), функция датиффы создает ошибка.
мы использовали это сейчас:
<!--- 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="[email protected]" 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="[email protected]" subject="cfmailqueue restarted by daemon" server="xxx" port="25" from="xxxx" username="xxxx" password="xxx" replyto="xxxx">
2/2 action: ...succeeded!
#now()#
</cfmail>
</cfif>