Почтовая очередь ColdFusion прекращает обработку

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

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

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

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

Добавлено:

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

Добавлено 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>