تتوقف قائمة انتظار بريد ColdFusion عن المعالجة

StackOverflow https://stackoverflow.com/questions/94932

  •  01-07-2019
  •  | 
  •  

سؤال

يتوقف خادم CF الخاص بنا أحيانًا عن معالجة البريد.وهذا يمثل مشكلة لأن العديد من عملائنا يعتمدون عليه.

لقد وجدنا اقتراحات عبر الإنترنت تشير إلى وجود ملفات صفر بايت في المجلد غير القابل للتسليم، لذلك قمت بإنشاء مهمة تقوم بإزالتها كل ثلاث دقائق.ومع ذلك، حدث التوقف مرة أخرى.

أنا أبحث عن اقتراحات لتشخيص هذه المشكلة وإصلاحها.

  • معيار سي إف 8
  • Win2k3

تمت الإضافة:

  • لا توجد أية أخطاء في سجل البريد في الوقت الذي تفشل فيه قائمة الانتظار
  • لم نحاول تشغيل هذا دون استخدام قائمة الانتظار، نظرًا للكمية الكبيرة من البريد الذي نرسله

تمت الإضافة 2:

  • لا يبدو أن هناك مشكلة في أي من الملفات الموجودة في مجلد التخزين المؤقت.عندما نعيد تشغيل قائمة انتظار البريد، يبدو أن جميعها تتم معالجتها بشكل صحيح.

تمت الإضافة 3:

  • نحن لا نستخدم المرفقات.
هل كانت مفيدة؟

المحلول

ما انتهينا من القيام به:

لقد كتبت مهمتين مجدولة.تم التحقق أولاً لمعرفة ما إذا كانت هناك أية رسائل في مجلد قائمة الانتظار أقدم من ذلك ن دقيقة (المضبوطة حاليًا على 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 ثانية، سيكون هذا ما يقرب من 72000 رسالة بريد إلكتروني يمكنك إرسالها قبل انتهاء مهلة الصفحة.هل ترسل أكثر من 72000 مرة واحدة؟

كان البديل الذي استخدمته قبل CFMail بهذه السرعة هو إنشاء مخزن مؤقت مخصص.بدلاً من إرسال رسائل البريد الإلكتروني بسرعة، احفظها في جدول قاعدة البيانات.ثم قم بإعداد مهمة مجدولة لإرسال بضع مئات من الرسائل وإعادة جدولة نفسها لبضع دقائق لاحقًا، حتى يصبح الجدول فارغًا.

لقد قمنا بجدولة المهمة ليتم تشغيلها مرة واحدة يوميًا؛ويمكنه إعادة جدولة نفسه للتشغيل مرة أخرى خلال بضع دقائق إذا لم يكن الجدول فارغًا.لم يكن لدي مشكلة في ذلك.

هل حاولت تجاوز قائمة الانتظار تمامًا؟(في CF Admin، ضمن إعدادات Mail Spool، قم بإلغاء تحديد "التخزين المؤقت لرسائل البريد للتسليم.")

أواجه نفس المشكلة في بعض الأحيان وليس بسبب ملف صفر بايت على الرغم من ظهور هذه المشكلة في الماضي.يبدو أن ملفًا أو ملفين (الأقدم في المجلد) سيمنعان قائمة الانتظار من المعالجة.ما أفعله هو نقل كافة الرسائل إلى مجلد الاحتفاظ، وإعادة تشغيل قائمة انتظار البريد، ونسخ الرسائل مرة أخرى في مجموعة في كل مرة بترتيب زمني عكسي، والانتظار حتى خروجها ونقل المزيد منها.يتم وضع الرسائل التي كانت تعوق قائمة الانتظار في مجلد منفصل ليتم فحصها لاحقًا.

ربما يمكنك القيام بذلك برمجياً عن طريق وقف قائمة الانتظار, ، قم بنقل الملف الأقدم إلى مجلد آخر، ثم بدء قائمة انتظار البريد ومعرفة ما إذا كان الإرسال يبدأ بنجاح عن طريق التحقق من عدد ملفات المجلد وتواريخها.إذا لم تنجح إزالة الملف الأقدم، كرر العملية السابقة حتى يتم نقل كافة ملفات البريد المخالفة ويستمر الإرسال بنجاح.

آمل أن يساعد.

لدينا بالفعل إعداد مماثل، 32 بت CF8 على Win2K3.

لقد استخدمنا الحل الذي قدمه Ben منذ عام تقريبًا، وقد ساعد ذلك بالتأكيد في إعادة وضع رسائل البريد الإلكتروني المتوقفة في قائمة الانتظار تلقائيًا.

ولكن في الآونة الأخيرة، وبدون سبب محدد، قرر أحد خوادم الويب السبعة لدينا الوصول إلى هذه الحالة مع كل محاولة بريد إلكتروني.

حدث استثناء عند إعداد معلمات خادم البريد.سبب هذا الاستثناء هو:Coldfusion.mail.MailSessionException:حدث استثناء عند إعداد معلمات خادم البريد ..

كل خادم من خوادم الويب لدينا عبارة عن نسخ متطابقة لبعضها البعض، لذا فإن سبب حدوث ذلك لهذا الخادم فقط هو أمر غريب.

هناك عنصر آخر يجب ملاحظته وهو أن لدينا برنامجًا نصيًا يعيد تشغيل الجهاز في منتصف الليل بسبب مشكلات إدارة الذاكرة في JRUN.يبدو أن عملية إعادة التشغيل هي التي بدأت المشكلة.ستؤدي إعادة تشغيل خدمة CF لاحقًا إلى مسحها، وسيكون الجهاز على ما يرام حتى يتم إعادة تشغيله مرة أخرى.

وجدنا أن المشكلة متعلقة ببرنامج فحص الفيروسات McAfee، وبعد تحديثه لاستبعاد دليل c:\ColdFusion8 اختفت المشكلة.

امل ان يساعد.

توجد/كانت هناك مشكلة في التخزين المؤقت للبريد والرسائل ذات المرفقات في CFMX 8 والتي تم إصلاحها باستخدام أحد الإصلاحات العاجلة.الإصدار 8.0.1، على الأقل، كان ينبغي أن يتم إصلاح ذلك.

يوجد خطأ في كود Ben Doom.شكرًا لك على أي حال يا بن، الكود رائع، ونحن نستخدمه الآن على أحد خوادمنا المثبت عليها CF8، ولكن:إذا كان الدليل (\spool) فارغًا، فسيفشل الرمز (خطأ:قيمة التاريخ التي تم تمريرها إلى دالة التاريخ 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>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top