PDA

Просмотр полной версии : Как грамотно поставить запросы в очередь с задержкой по времени?


flashfoxter
21.06.2011, 18:14
Как грамотно поставить запросы в очередь с задержкой по времени?
Timer, setTimeout - не предалагать :)

КорДум
21.06.2011, 18:14
Какие запросы?

nOobCrafter
21.06.2011, 18:15
а как вы без таймера собираетесь синхронизировать?

GBee
21.06.2011, 18:16
BulkLoader есть готовый, правда не использовал. Для контакта делал цепь запросов, после выполнения (удачного или неудачного) через 400мс запускается следующий, но с таймером.

flashfoxter
21.06.2011, 18:19
Если конкретизировать то вы мне скажете, что надо было тему в ВК создавать - а это не так :)))
Сейчас конкретно интересует нормальный способ обхода too many request от ВК.
Для этого надо запросы в очередь ставить. Но эта проблема может решать не только случай с ВК.
Для этого сейчас использую таймер но это не есть правильно хочу красивое и логичное решение. Может есть открытая библиотека где можно посмотреть как это можно сделать...

Добавлено через 1 минуту
BulkLoader - A library for managing multiple loadings with Actionscript 3....

GBee
21.06.2011, 18:46
Правильное решение работает, неправильное - нет, вот и весь сказ.

Wolsh
21.06.2011, 23:39
GBee, может я ошибаюсь, но по-моему товарищ flashfoxter говорит о бомбежке запросами по таймеру, без живой очереди, подразумевающей ожидание ответа на предыдущий запрос - просто по тику посылается следующий запрос из массива. Это конечно никуда не годится. GBee говорит о другом подходе – запросы выстраиваются в очередь, и каждый следующий посылается ТОЛЬКО тогда, когда придет ответ/подтверждение на предыдущий. А на случай если ответ не придет (не ждать же его вечно) – после 400мс ожидания посылается следующий (на самом деле лучше давать три попытки "провалившемуся" запросу, кроме того, если ответ так и не получен – генерить событие или ошибку, и только потом продолжать со следующим запросом.

flashfoxter
22.06.2011, 00:10
Вот.... спасибо это уже ближе к теме. То есть допустим:
1. Создаем Класс Sender
2. Делаем у него паблик метод, sendRequest(some):Boolean
3. Вызываем sender.sendRequest(some)
4. В классе принимаем что отправить, смотрим если ли в массиве (хранителе запросов) данные reqHolder.length
5. Если нет то запрашиваем сколько времени прошло с последнего запроса, если все ок то - запрос,
если нет запрос в массив push.
6. По таймеру проверяем что в массиве, и шлем запросы из очереди
7. Неудачные запросы складываем в отдельный массив с ошибками, из этом массива делаем запросы
по 3 раза(допустим).

Как-то так ? Кто то может еще подскажет... Может увеличивать время, "отстоя" ошибочного запроса, или автоматическое разрезание его на более мелкие части...

nOobCrafter
22.06.2011, 00:18
http://johnlindquist.com/2010/09/09/patterncraft-command-pattern/
ближе к концу, асинхронные команды, допилите этот вариант и будет вам счастье.
Так же где то тут мелькали готовые варианты обработки ошибки запроса с последующим повторным вызовом, или это было в какой то ВК либе, советую кстати их изучить все же.

flashfoxter
22.06.2011, 00:39
Посмотрел по ссылке, правда без звука и только начало, походит больше на TaskManager который я видел на сайте xitri

nOobCrafter
22.06.2011, 00:52
тип того, та или иначе манагер занимается контролем выполнения команд, и в нем же можно всунуть репитеры при ошибке и таймер, система упрощается в разы.

GBee
22.06.2011, 12:30
Wolsh, не люблю параллельные запросы, и поделился идеей как делал для контактика. Провалившиеся запросы уходят в конец очереди у меня. Ну и можно форсировать некоторые запросы, чтобы они влазили в начало очереди.

BulkLoader, который я нашел по первой ссылке, имеет параметр кол-во одновременных запросов (можно выставить 1), насчет периода бомбежки не знаю.