Принудительный запуск почтового спула с помощью кода

#coldfusion

#coldfusion

Вопрос:

Добрый день, есть ли способ принудительно запустить диспетчер очереди почты, а не ждать периода задержки, установленного в CFAdmin?

Я просмотрел API администратора и ничего не увидел, поэтому я подозреваю, что ответ может быть «нет», но я подумал, что, возможно, кто-то знает, как вызвать базовый процесс?

Причина, по которой вы хотите это сделать, — это немного крайний случай. На нашем тестовом сервере мы настроили спулер на запуск каждые 15 секунд, что — для большинства вещей — нормально. Однако у нас растет число модульных тестов (которые выполняются на этом же тестовом сервере), которые проверяют содержимое отправленных сообщений электронной почты для различных элементов, которые нам нужны для проверки целостности. В настоящее время тесты проверяют каталог Undelivr и, если соответствующее почтовое сообщение не найдено, ожидают 2 секунды и повторяют попытку, ожидая в общей сложности 20 секунд, прежде чем решить, что тест необходимо прервать (20 секунд — это произвольное количество; 15 секунд между интервалами спула и некоторое «пространство для маневра»). Это работает нормально, но это означает, что набор модульных тестов в конечном итоге работает медленнее, чем это действительно необходимо, потому что в этих тестах проверки электронной почты есть пауза «до 20 секунд».

Это не конец света, но это то, с чем я хотел бы иметь дело, если возможно.

Я думаю, что один из подходов, который я мог бы предпринять, — это вместо этого проверить каталог спула, но я бы предпочел подождать, пока сообщение электронной почты не будет «припарковано» в каталоге Undelivr, если возможно. Я немного не решаюсь возиться с вещами в каталоге спула (без обоснованной причины, конечно).

В любом случае, все мои слова в сторону, короткая версия вопроса: «есть ли какой-нибудь способ заставить почтовый спул запускаться с помощью кода?».

Приветствия.

Ответ №1:

 <cfobject action="CREATE"
   type="JAVA"
   class="coldfusion.server.ServiceFactory"
   name="factory">

<cfset MailSpoolService = factory.getMailSpoolService()> 
<cfset MailSpoolService.restart()>
  

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

1. Не совсем понятно, почему я был отклонен, но это программный способ запуска диспетчера очереди ColdFusion — если у кого-то нет опровержения?

2. Просто примечание: это не я проголосовал против тебя, Шон; и для меня это выглядит разумным ответом. Я проверю это чуть позже. Единственное, что я могу подумать, это то, что, возможно, тому, кто жаловался, не понравился тот факт, что вы перезапускали всю службу? Не знаю. Немного невежливо и бесполезно, что они не объяснили себя.

3. Действительно ли его нужно перезапустить? Я вижу там run(), но не могу сказать, что я действительно возился со службой почтового спула раньше.

4. Шон, я только что протестировал это. Вы когда-нибудь запускали этот код и знали, что он «работает» (т. Е. Для выполнения требования моего вопроса), или вы просто предлагаете непроверенный спекулятивный код? Я спрашиваю, потому что для меня это не работает. Для буферизации почтового сообщения все равно требуется столько же времени.

5. @Snipe656: метод run() запускает совершенно новую задачу почтового спула. Поэтому, хотя кажется, что он делает то, что я хочу, в итоге у меня будет несколько задач, зависающих над почтовым каталогом, и ВСЕ они пытаются обработать почту. И, конечно, слишком многократный вызов run() в конечном итоге приведет к слишком большому количеству задач, с которыми сервер не справится, и сгладит его 🙁

Ответ №2:

Хорошо, я получил официальную реплику от одного из инженеров Adobe по этому поводу: в принципе, то, что я пытаюсь сделать, невозможно сделать в том виде, в каком оно есть в настоящее время.

Существует способ повторного запуска почтового спула, но он является частным для службы почтового спула.

Ну что ж.

Приветствую всех, кто изучил это для меня и предложил предложения.

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

1. Вы можете вызвать частный метод. Просто измените его доступность на true: method.setAccessible(true) . Независимо от того, следует ли вам это делать, это другая история.

2. Приветствия Ли: я рассмотрю это. Это только для модульного теста, поэтому я не против быть немного «непослушным».

3.Хорошо, круто. Я не знаю, какие методы являются правильными. Но refreshSpoolFiles последующий вызов, deliverStandard похоже, сделал свое дело для меня. Я опубликую свой пример кода на случай, если это поможет.

Ответ №3:

Существует способ повторного запуска почтового спула, но он является частным для службы почтового спула.

Как я упоминал в комментариях, вы можете вызвать частный метод, установив для него значение доступности true . Не то, что вы хотите делать «волей-неволей», но, вероятно, подходит для модульного теста.

Отказ от ответственности: я бы не стал клясться, что это правильные методы. Но, похоже, это запустило обработку почты в моих кратких тестах.

 <cfscript>
    // Tested with CF 9.0.1
    factory = createObject("java", "coldfusion.server.ServiceFactory");
    spoolService = factory.getMailSpoolService();
    spoolClass = spoolService.getClass();

    methodToCall = spoolClass.getDeclaredMethod("refreshSpoolFiles", []);
    methodToCall.setAccessible(true);
    methodToCall.invoke(spoolService,  []);

    methodToCall = spoolClass.getDeclaredMethod("deliverStandard", []);
    methodToCall.setAccessible(true);
    methodToCall.invoke(spoolService,  []);
</cfscript>