|
Асинхронность запроса к http-сервису и исполняемого кода | ☑ | ||
---|---|---|---|---|
0
Vito
09.08.22
✎
17:18
|
К http-сервису 1С идет запрос с параметрами, в дальнейшем параметры используются на выполнения кода, довольно длительного по времени (в процессе формируется 2 запроса по API, ну вот такой кривой внешний сервис). В результате время выполнения первого запроса очень длинное, что неприятно, тем более иногда оно может превысить таймаут.
Как можно сделать, так чтобы http-сервису сразу ответил на запрос статусом 200, типа "я принял параметры", а дальше спокойно стал исполнять длинный код? Код http-сервиса: Функция APIGET(Запрос) Ответ = Новый HTTPСервисОтвет(200); ДлинныйИспоняемыйКод(Запрос); Возврат Ответ; КонецФункции |
|||
1
Kassern
09.08.22
✎
17:22
|
(0) легко так можно сделать. Вы передаете сервису параметры, он вам возвращает токен. Вы по этому токену проверяете, есть ли ответ, или нет. Если есть, то уже получаете данные
|
|||
2
YAGolova
09.08.22
✎
17:22
|
Воспользуйся фоновыми заданиями. Те ДлинныйИспоняемыйКод должен выполняться в фоне
|
|||
3
Kassern
09.08.22
✎
17:23
|
по такому принципу работает почта России, когда вам нужно получить информацию по большому количеству отправлений.
|
|||
4
YAGolova
09.08.22
✎
17:23
|
(1) Судя по всему ему и на надо получать данные - главное запрос отправить
|
|||
5
Kassern
09.08.22
✎
17:24
|
(4) если есть возможность с внешнего сервиса поменять алгоритм, то (1) как вариант
|
|||
6
mTema32
09.08.22
✎
17:58
|
(0) В (1) человек дело говорит. Так много сервисов работают.
Фактически получается разделение сервиса на два. Сторонний клиент делает запрос и ему создается запись с номером его запроса и текущим статусом. И клиент периодически опрашивает эту запись. Как только данные будут собраны, меняется статус запроса. И каким-либо методом используя этот номер запроса данные он забирает. |
|||
7
Vito
09.08.22
✎
18:01
|
(5) Как вариант, но внешний сервис будет ждать или там тоже нужно городить асинхронность, а это геморно, а если сделать то можно и без токена обойтись...
(2) Попробую наверное этот вариант. Я о нем думал тоже. Мне кажется это проще всего. По результатам отпишусь. |
|||
8
Vito
09.08.22
✎
18:03
|
(6) Мне не надо назад возвращать результаты исполнения кода. Фактически запрос к http-сервису это хук, который всего лишь запускает процесс, причем некритичный. Он кнопкой продублирован.
|
|||
9
Kassern
09.08.22
✎
18:05
|
(8) А как вы узнаете, удачно, или нет этот "хук" отработал, или пофиг? Если пофиг, то да, токен не нужен, нужно лишь сам внешний сервис немного ковырнуть, чтобы он сразу ответ возвращал, а потом у себя крутил процесс.
|
|||
10
Vito
09.08.22
✎
18:47
|
(9) Достаточно будет, что критерием успешности отработки является успешное получение параметров. А потом пусть крутиться, поэтому мне вариант 2 понравился.
|
|||
11
Kassern
09.08.22
✎
18:51
|
(10) а оно вам надо, висящее фоновое задание в 1с? Я бы на сторону внешнего сервиса это пихнул, меньше головняка в 1с
|
|||
12
Новиков
09.08.22
✎
18:55
|
(1) Классное решение.
|
|||
13
Тихий омут
10.08.22
✎
03:42
|
(0) ГИИС ДМДК?
|
|||
14
Strogg
10.08.22
✎
08:30
|
(1) поподробнее для вебсервис-новичков можно? Типа формируется какой то уид задания, в базу записывается сочетание уид - статус выполнения, и при следующем обращении к сервису по уид - выдается либо результат либо болт, если задание еще не выполнено?
|
|||
15
Smit1C
10.08.22
✎
08:36
|
(13) тоже хотел спросить )))
|
|||
16
Kassern
10.08.22
✎
09:00
|
(14) Попробую по подробнее:
Вы передаете данные для обработки на веб сервис, ответом сразу получаете какой-то гуид/токен. Веб сервис добавляет ваши данные для обработки в очередь и присваивает статус Далее вы периодически отправляете запрос на проверку статуса передавая полученный токен. Если данные веб сервис обработал, он вам вернет результат. |
|||
17
программистище
10.08.22
✎
09:18
|
Еще можно писать данные в регистр очереди и отправлять 200, что данные записаны
А потом уже регламентное обрабатывает по очереди |
|||
18
Strogg
10.08.22
✎
10:19
|
(16) в точности как я и написал)
|
|||
19
Kassern
10.08.22
✎
10:23
|
(18) ага, я чет дальше "по подробнее можно" не прочитал спросонья)
|
|||
20
valerivp
12.08.22
✎
00:17
|
(0) лучше вернуть 202
|
|||
21
Serginio1
18.08.22
✎
13:29
|
.Net в 1С. Асинхронные HTTP запросы, отправка Post нескольких файлов multipart/form-data, сжатие трафика с использованием gzip, deflate, удобный парсинг сайтов и т.д.
https://infostart.ru/1c/articles/466052/ Выполнитель=Врап.ПолучитьАсинхронныйВыполнитель(); ДобавитьОбработчик Выполнитель.ПриОкончанииВыполненияЗадачи, ПриОкончанииВыполнения; //Обработчик события выглядит так Процедура ПриОкончанииВыполнения(Задача,ДанныеКЗадаче) // Обязательно нужно отлавливать ошибку в 1С // Иначе она передается в .Net где обрабатывается там Попытка Так как задача может завершиться с ошибкой Мы должны проверить, и если ошибка нужно предпринять какие то действия Если (Задача.IsFaulted) Тогда // Ошибка выполнения Сообщить("Ошибка "+Врап.ВСтроку(Задача.Exception)); Сообщить("Данные к задаче "+Врап.ВСтроку(ДанныеКЗадаче)); иначе Сообщить("=====Выполнена задача ===="); Сообщить("Данные к задаче "+Врап.ВСтроку(ДанныеКЗадаче)); Сообщить(Врап.ВСтроку(Задача.Result)); КонецЕсли; Исключение Сообщить("Ошибка в процедуре"); Сообщить(ОписаниеОшибки()); КонецПопытки КонецПроцедуры Вызываем задачу так Клиент=Врап.СоздатьОбъект(HttpClient); Задача=Клиент.GetStringAsync("https://msdn.microsoft.com/ru-ru/library/hh551745(v=vs.118).aspx"); Выполнитель.Выполнить(задача,ТекущаяДата()); |
|||
22
ДедМорроз
18.08.22
✎
14:57
|
Очередь нужна,если запросов будет много и они могут приходить параллельно,а фоновое задание хочется иметь одно.
Если не важно,то для каждого обращения может запускаться свое фоновое задание. |
|||
23
valerivp
18.08.22
✎
15:16
|
(21)но это же на клиенте - для него есть штатные методы, а в старых платформах - js
|
|||
24
Serginio1
18.08.22
✎
16:07
|
(23) Так клиенту похрену когда придет ответ если он принимает ответы асинхронно.
Если не хочешь асинхронно, то возвращай Id ответа, ответ помещай в словарь и метод для опроса по Id . Можешь использовать Вэб сокеты для оповещения https://infostart.ru/1c/articles/434771/ Вариантов куча. Но обычно это асинхронные методы |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |