Имя: Пароль:
1C
 
Можно ли в http сервисе вернуть ответ, потом продолжить выполнение кода?
0 anders297
 
05.10.23
11:54
Хочу по апи получить некоторые данные, вернуть клиенту ответ что получил их и все ок, далее продолжить выполнение тяжелого кода.

В методе HHTP сервиса
Ответ = Новый HTTPСервисОтвет(200);
Ид = Запрос.ПараметрыURL["id"];
Ответ.УстановитьТелоИзСтроки("success");
Возврат Ответ;


// Здесь продолжить работу с полученным ИД

Возможно ли это? Получается что мне эти идентификаторы нужно складывать в какое-то хранилище типа плана обмена, потом регзаданием обрабатывать. Но в рамках задачи, обработать нужно максимально быстро, насколько это возможно. Неохота регзадание каждые 10 секунд крутить ради запросов, которых может быть несколько в сутки.
1 Donkey_hot
 
05.10.23
10:52
(0) БСП, ВыполнитьПроцедуру не подойдет?
2 Новиков
 
05.10.23
11:00
(0) вернуть клиенту ответ что получил их и все ок
и
обработать нужно максимально быстро, насколько это возможно

В некотором контекстном противоречии. Если нужно отдать клиенту "квитанцию об успешной загрузке" в терминах обменов 1С - разговор один и твои проблемы, что ты далее будешь делать с загруженным. Т.е. это не проблемы сервиса http и его работы, он заканчивает свою деятельность отдачей ответа.

Если же с отдачей нужно как-то проинформировоать ту сторону о результатах обработки этой загрузки, то разговор другой.
3 Hmster
 
05.10.23
11:06
(0) А разве нельзя в самом сервисе перед отправкой ответа запустить регл. задание?
4 Новиков
 
05.10.23
11:22
(3) В общем случае, можно - но это проблему не решит, т.к. если возможна повторная до-обработка/новая обработка данных полученных ранее от внешнего api, то получается "одноразовый" http-сервис загрузчик какой-то: данные принял, ок вернул наружу, а обработать не смог и, допустим, упал на чем-то. Я бы сразу на это расчитывал, если это какой-то загрузчик прайс-листов или что-то подобного.
5 anders297
 
05.10.23
11:47
(2) информировать о успешной обработке не нужно. Только то что идентификатор я получил. Дальше мои проблемы.
6 anders297
 
05.10.23
11:50
(4) да, у меня предусмотрен функционал, который хранит полученные ИД, и он прослеживает чтобы их обработка прошла до конца. Но уведомления о нештатных ситуациях обрабатываются на нашей стороне. Клиенту по апи они не нужны.
7 anders297
 
05.10.23
11:52
(3) Я никогда раньше не запускал регзадания програмно )
Это то-же самое что запуск фоновых заданий?
8 DirectorGora
 
05.10.23
11:57
(0) По опыту скажу отсылка данных по http сервису вполне быстро отрабатывает, а вот если Вы хотите получить ответ от стороннего сервера, то вполне может много времени занять.
9 DirectorGora
 
05.10.23
11:58
(7) Регламентные задания отличаются от фоновых расписанием, не?
10 Новиков
 
05.10.23
12:03
(5) в этом случае, тогда эти "сырые данные" вы просто грузите в РС, структура которого совпадает полученным. Если у вас это 1 поле какое-то идентификатор, то значит идентификатор. И отдельный ресурс сделаете "Обработано". И заданием просто вычитываете, что не обработано, обрабатываете и проставляете флаг обработки. Это позволит вам этот процесс выстроить так, как он у вас в жизни происходит. Более того, сами можете настроить и второе задание, которое по какому-то SLA (дате получения данных по апи) будет алерты вам слать - дескать, вот загрузил данные, а 3 дня обработать их не могу. Ну, появится более такой гибкий и хороший механизм. А если сделать в лоб, запуск задания из сервиса - это плохая практика, одноразовая. Не получилось обработать и чего?
11 Hmster
 
05.10.23
12:13
(7)
ВидЗадания - Имя рег задания
    
    
    МетаРегЗадание = Метаданные.РегламентныеЗадания.Найти(ВидЗадания);
    Если Не МетаРегЗадание = Неопределено Тогда
        Попытка
            СтруктураОтбора = Новый Структура;
            СтруктураОтбора.Вставить("Метаданные",МетаРегЗадание);
            РеглЗад=РегламентныеЗадания.ПолучитьРегламентныеЗадания(СтруктураОтбора);
            Для Каждого Задание Из РеглЗад Цикл
                Попытка
                    Задание.Записать();
                Исключение
                КонецПопытки;                        
            КонецЦикла;
        Исключение
        КонецПопытки;
    КонецЕсли;
12 Волшебник
 
05.10.23
12:27
(11) Не надо глотать ошибки, это плохая практика
13 anders297
 
05.10.23
12:55
(11) спасибо
14 anders297
 
05.10.23
12:57
Когда мы делаем Задание.Записать() - Это запуск регзадания, сейчас отдельным процессом?
15 Donkey_hot
 
05.10.23
12:57
В упор не пойму, причем тут рег. задания...
16 arsik
 
гуру
05.10.23
12:58
А чем вам фоновые то не подошли?
17 Donkey_hot
 
05.10.23
13:03
(16) + Вот-вот
18 anders297
 
05.10.23
13:04
(16) та наверное ничем) в начале о них не подумал.
19 Donkey_hot
 
05.10.23
13:05
(18) Если есть БСП, см. (1), в противном случае см. МенеджерФоновыхЗаданий, метод Выполнить()
20 mTema32
 
05.10.23
13:26
(0) Складываешь данные в какой-нибудь РС с признаком обработаны/не обработаны. И фоном вешаешь задание которое эти данные лопатит, запускаясь с нужной периодичностью.
21 Valdis2007
 
05.10.23
14:36
(5) ну тогда тебе и не надо фоновые зад. , просто делай, что надо после - Возврат Ответ;
22 Valdis2007
 
05.10.23
14:42
Ответ = Новый HTTPСервисОтвет(200);
Ид = Запрос.ПараметрыURL["id"];
Ответ.УстановитьТелоИзСтроки("success");
//запуск асинхронной процедуры посмотри в СП подробности
ФоновыеЗадания.Выполнить("",МассивПараметров, Строка(Новый УникальныйИдентификатор),"");
//

Возврат Ответ;
23 mikecool
 
05.10.23
15:15
(9) сотрудник на 666к рублей не должен задавать таких вопросов
24 DirectorGora
 
05.10.23
15:26
(23) З - зависть))
25 ДедМорроз
 
05.10.23
23:28
Фоновые задания - это хорошо,но только,если клиент-сервер.
26 Новиков
 
06.10.23
09:01
(25) Думаешь, если файловая, то у него нет возможности запустить отдельный клиентский сеанс для этих дел?
27 Hmster
 
06.10.23
09:38
Фоновые задания это конечно хорошо, но если нужно гарантировано выполнить код, лучше подстраховаться регл.заданием.
Например, задание выполняется раз 10 минут, но при определенных обстоятельствах можно запустить раньше срока.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший