Я делаю некоторые изменения в старом приложении, написанном на классическом ASP / VbScript.
У него есть функция отправки электронной почты участникам приложения, но поскольку список участников довольно велик, сервер отклоняет новые электронные письма после того, как первая сотня или около того отправлены.
Я написал код, чтобы он отправлял по 20 писем по электронной почте, но это все еще не работает. Я думаю, что, возможно, заставить его поспать на секунду между очередями, возможно, сработает правильно.
Однако я не могу найти метод типа Thread.Sleep в VbScript.
Есть один?
Кори, нет, но все электронные письма действительны, так что я не понимаю, с чего еще.
@Corey: это известная проблема с некоторыми конфигурациями серверов.
@Jonathan: Посмотрите, поможет ли пример кода VB.





Насколько мне известно, нет. Для этого вам придется использовать какой-то внешний код, написанный в классе VB, или что-то еще.
Или занято-подожди (гак).
Можно ли установить написанный вручную компонент COM на общий сервер?
Думаю, для этого вам понадобится одобрение администратора
Тогда тебе стоит заняться-подожди в наказание! Не позволяй мне устанавливать программное обеспечение, ладно? муахахаха
Вы знаете, это один из тех случаев, когда я думаю, что создание частной очереди MSMQ может быть хорошим делом. Поместите электронные письма, которые вы хотите отправить, в очередь, и пусть недавно разработанная служба .NET выполнит отправку. Это освободит ваше приложение ASP.NET и позволит вам централизованно управлять отправкой!
Это похоже на хороший взлом:
http://www.ehow.com/how_2001270_sleep-asp-using-ado.html
Уловка состоит в том, чтобы создать объект подключения ADO, а затем попытаться подключиться к несуществующему серверу. Это будет заблокировано на время установки тайм-аута объекта подключения.
@Bruno: Мне тоже понравилось, но я снимаю с себя всякую ответственность за это. :)
@silverCORE: как и классика asp. Почему бы не сохранить ваши отрицательные голоса для чего-то действительно важного?
@MusiGenesis Я чувствую то же, что и вы, в отношении ASP, но, поскольку есть еще некоторые устаревшие приложения, которые его используют, независимо от того, как разработчики относятся к технологии, мне нужно заботиться. Кроме того, люди теряют время, нажимая на ссылку, которая не работает. Почему бы вместо этого отредактировать свой ответ и использовать для этого свое время вместо того, чтобы жаловаться на голоса против?
есть также хороший hta hack, который должен работать. Ищите здесь синтетическую функцию сна: http://www.mvps.org/scripting/rube/index.htm
Имейте в виду, что IIS по умолчанию имеет значение Тайм-аут выполнения сценария ASP, равное 90 секундам, поэтому выполнение больших скриптов, отправляющих таким образом объемы электронной почты, приведет к тайм-ауту, если вы не измените тайм-аут asp.
Извините, что этот ответ не имеет прямого отношения к вопросу, но при попытке ответить на вопрос он стал слишком большим для комментариев.
@shahka, разница в том, что когда вы пытаетесь подключиться к БД, код переходит в «состояние ожидания» (как обратный вызов), поэтому процессорное время не используется. Не имеет значения, что делает SESSION или THREAD, важно, что ДРУГОЙ делает CPU / Core.
Например, найдите старый не-многоядерный процессор. Установите образец в режим сна на 10 секунд, затем запустите в течение 2-5 секунд или около того, затем снова засыпайте 10. Сделайте это примерно 20 000 раз. Пока он работает, попробуйте использовать box, посмотрите, насколько он отзывчивый. Перемещайте окна, наблюдайте за использованием ЦП и т. д.
ЭТО дает вам пример того, что происходит с веб-сервером этого человека. Он перестает отвечать, потому что планировщик потоков имеет тенденцию «отдавать предпочтение» процессору / ядру, который НЕ «раскручивается» (как мы это называем). Таким образом, ВСЕ веб-запросы, операции ОС и т. д. Будут выполняться на ДРУГИМ ядре, что приведет к его перегрузке и появлению ощущения «раскрутки».
Теперь у вас бывают времена, когда вы можете замкнуть центральный процессор, и это не имеет значения. Но за все годы программирования я никогда не считал необходимым писать такой жесткий цикл (специально). Некоторые из них возвращаются к тому, чтобы делать что-то правильно и неправильно. Если вы сделаете что-то неправильно, это часто будет РАБОТАТЬ, но это не значит, что оно работает ПРАВИЛЬНО.
Если вам нужен хороший пример этого, выберите практически любой вирус на планете и проанализируйте его. Вы обнаружите, что для того, чтобы нанести ущерб, им (вирусописателям) часто приходится поступать «неправильно». Конечно, он выполняет свою работу, но он также ломает вирус, скажем, на другой языковой версии Windows, или он приводит к сбою всей машины, отрицая ее назначение, и т. д.
Грег Хьюгилл был одним из моих первых учителей в этом типе вещей, и, поскольку я работал с ним много лет и поддерживал, а позже проверял качество его программного обеспечения, я многому у него научился, так же как и пытаюсь чтобы рассказать вам, почему ваш образец кода не подходит. Собственно говоря, код в порядке. Оно работает. Это хорошо написано. Но он НЕ РАБОТАЕТ должным образом и имеет неблагоприятные побочные эффекты, которые другие, возможно, любознательные программисты, которые могут читать это в поисках знаний, не полностью понимают. Вот почему я не рекомендовал ваш образец.
Эта процедура ожидает любое количество времени и не использует ЦП:
Function asp_Wait(nMilliseconds)
Dim oShell
'' VBS: Set oShell= Wscript.CreateObject("WScript.Shell")
'' ASP:
Set oShell= Server.CreateObject("WScript.Shell")
Call oShell.run("ping 1.1.1.1 -n 1 -w " & nMilliseconds,1,TRUE)
'' Option TRUE: Wait until ping is complete
'' 1000 milli-second wait is 1 second
End Function
IP 1.1.1.1 теперь используется CloudFlare, поэтому он не будет ждать, а вернется через несколько мс.
var shell = Server.CreateObject("WScript.Shell");
shell.run("CHOICE /C:AB /D:A /T:1 > NUL", 1, true);
Вы используете CDO? Поскольку это помечено как классический ASP, я предполагаю, что да.
Если да, если вы можете использовать
myMail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 1 '(который отправляется с помощью самовывоза)
вместо
myMail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 '(который отправляется с использованием порта)
Это более надежно, потому что он записывает электронное письмо в файл (обычно C: \ inetpub \ mailroot \ pickup), а SMTP-сервер IIS проверяет папку на наличие новой почты и повторяет попытку, если это не удается в первый раз. Загвоздка в том, что вам нужно настроить SMTP в оснастке IIS.
Ты можешь использовать :
<html>
<head>
<title>Sleep</title>
</head>
<body>
<%
function Sleep(seconds)
set oShell = CreateObject("Wscript.Shell")
cmd = "%COMSPEC% /c timeout " & seconds & " /nobreak"
oShell.Run cmd,0,1
End function
Sleep(5)
response.write("End")
%>
</body>
</html>
Ответ: не используйте сервер для ожидания, используйте клиент. Вы можете написать javascript, который будет вызывать Send () каждую секунду с помощью setInterval, пока очередь не станет пустой. Используйте вызов Аякс, чтобы отправить одно электронное письмо с помощью сценария на стороне сервера. Затем при возврате вызова ajax вы также можете указать на странице html, что электронное письмо было отправлено.
Вы ЗНАТЬ, что сервер отклоняет электронные письма, потому что они приходят слишком быстро?