#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>