Заставляем ждать, пока файл не будет готов

#coldfusion

#coldfusion

Вопрос:

У меня есть функция, которая генерирует файл Excel (используя функции электронных таблиц ColdFusion) и сохраняет результат как ReportContent .

Мне нужно отправить этот отчет группе людей, использующих <cfmail> :

 <cfmail from="#From#" to="#To#" subject="#Subject#" type="html" >
    <cfmailparam content="#ReportContent#" type="application/vnd.ms-excel" file="#FileName#" >
    #Body#
</cfmail>
  

Моя проблема в том, что при тестировании я обнаружил, что <cfmail> команда часто выполнялась до того, как файл Excel был полностью отрисован, прикрепляя вместо этого непригодный .tmp файл.

Я попытался справиться с этим, приостановив выполнение на 5 секунд, давая файлу Excel время для отображения:

 <cfscript>
    thread = CreateObject("java", "java.lang.Thread");
    thread.sleep(5000);
</cfscript>
  

Это срабатывало в большинстве случаев, но не в 100% случаев. Теперь я увеличил задержку до 15 секунд — что работает для моих текущих тестов, но я не уверен, что это лучшая стратегия.

Есть ли способ подтвердить, что файл Excel в ReportContent полностью отрисован перед вызовом <cfmail> ?

Комментарии:

1. это беспокоит, у меня есть похожая вещь, но создается pdf-файл, который затем отправляется по электронной почте, хотя пока у нас не было никаких проблем…

2. Вы могли бы включить FileExists() функцию, чтобы убедиться, что cfmail команда запускается только после явной проверки ожидаемого вывода и расширения. Если он не готов, повторяйте проверку каждые 5 секунд или около того. Похоже, вы хорошо разбираетесь в потоковой обработке; если ваша единственная проблема — это время, это можно было бы исправить.

3. Вы генерируете файл и вызываете cfmail в одном и том же скрипте? Что вы используете для сохранения сгенерированного отчета в #FileName #?

4. Основываясь на моем быстром прочтении документации по параметру cfmail, я думаю, что он пытается использовать переменную в качестве вложения электронной почты, фактически не создавая файл.

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

Ответ №1:

Используйте именованную блокировку, подобную этой, и посмотрите, поможет ли это:

 <cflock name="some_preferably_unique_lock_name" type="exclusive" timeout="60">
<!--- code that creates and writes the Excel file to disk --->
</cflock>

<cflock name="same_preferably_unique_lock_name" type="exclusive" timeout="60">
<!--- code that mails the Excel file as attachment --->
</cflock>