Помогите придумать алгоритм конкурентного чтения файлов из директории.
Во-первых, задача будет выполняться регламентным заданием, т.е. без участия человека.
Во-вторых, после выполнения задачи обработанные файлы нужно удалить.
В-третьих, в процессе выполнения задачи в директорию могут поступать новые файлы, которые ещё не подвергались обработке.
В-четрвертых, обработку могут запустить и ручками и тогда вообще непонятно, какой файл обрабатывался, какой - нет.
Пока не придумал ничего более умного, чем создание в каталоге проверки файл-флага, сигнализирующего о том, что обработка файлов началалсь и фиксирование в списке значений текущих файлов, которые обрабатываются. После выполнения задачи удалается сначала файлы из списка а потом файл-флаг.
Во-вторых, после выполнения задачи обработанные файлы нужно удалить.
В-третьих, в процессе выполнения задачи в директорию могут поступать новые файлы, которые ещё не подвергались обработке.
В-четрвертых, обработку могут запустить и ручками и тогда вообще непонятно, какой файл обрабатывался, какой - нет.
Пока не придумал ничего более умного, чем создание в каталоге проверки файл-флага, сигнализирующего о том, что обработка файлов началалсь и фиксирование в списке значений текущих файлов, которые обрабатываются. После выполнения задачи удалается сначала файлы из списка а потом файл-флаг.
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(3) newborn, Всю жизнь программирования так делал :) В общем операции выполняются быстро и не заметно. Если файл обрабатывается несколькими пользователями то переименовать не получится. Таким образом можно уйти от обработки одного файла несколькими процессами.
По другому, имхо, никак.
Можно конечно грузить файл в 1С, потом удалять. Но тут вопрос следующий: А насколько велик может быть файл? 1С (грубо говоря) будет его 15 минут грузить себе, потом при удалении будет ошибка удаления, придется брать следующий, а тут окажется что он тоже заблочен. Вообщем вариант с (2) самый гут :)
З.ы.: если будут еще какие-то красивые варианты то с радостью проанализирую :)
По другому, имхо, никак.
Можно конечно грузить файл в 1С, потом удалять. Но тут вопрос следующий: А насколько велик может быть файл? 1С (грубо говоря) будет его 15 минут грузить себе, потом при удалении будет ошибка удаления, придется брать следующий, а тут окажется что он тоже заблочен. Вообщем вариант с (2) самый гут :)
З.ы.: если будут еще какие-то красивые варианты то с радостью проанализирую :)
(7) newborn, Можно вот так извратиться.
Я так делал блокировку обмена. Работает отлично.
АктивностьОбменаКлючОбъекта = "КлючОбъекта";
АктивностьОбменаКлючНастроек = "КлючНастроек";
АктивностьОбменаНастройки = "ТекстНастройки";
АктивностьОбменаОписаниеНастроек = "ОписаниеНастроек";
АктивностьОбменаИмяПользователя = "ИмяПользователяИБ";
Если ПроверкаАктивностиОбмена = Неопределено Тогда
Попытка
ХранилищеОбщихНастроек.Сохранить(АктивностьОбменаКлючОбъекта,
АктивностьОбменаКлючНастроек,
АктивностьОбменаНастройки,
АктивностьОбменаОписаниеНастроек,
АктивностьОбменаИмяПользователя);
Исключение
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не удалось зафиксировать начало. Причина: " + Символы.ПС + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
ПоказатьЯ так делал блокировку обмена. Работает отлично.
(7) newborn,
активные регламентные и фоновые задания получай,
если нужное задание работает, то у пользака отключается кнопка.
У меня некоторые обработки на фоновых заданиях и работают, так вот по ключу сначала проверка делается, и не дает запустить еще один экземпляр.
регламентные также получаются
ПолучитьРегламентныеЗадания(<Отбор>)
и вперед.
есть ли возможность внутри 1С как-то сигнализировать для всех пользователей о том, что обработка идёт? И не запускать конкурирующие обработки?
активные регламентные и фоновые задания получай,
если нужное задание работает, то у пользака отключается кнопка.
У меня некоторые обработки на фоновых заданиях и работают, так вот по ключу сначала проверка делается, и не дает запустить еще один экземпляр.
регламентные также получаются
ПолучитьРегламентныеЗадания(<Отбор>)
и вперед.
(11) dj_serega, проверку в само регламентное задание зашить.
Я так понимаю, оно гдето в конфе зашито, и запускается по расписанию, и эта же процедура вызывается из обработок.
Поэтому ничего не мешает ее запускать, хоть в фоне, хоть в регламентном. И в ней уже ставить проверку на запущенность самой себя, ключ сделать фиксированный.
Но это всего лишь как один из возможных вариантов реализации.
Я так понимаю, оно гдето в конфе зашито, и запускается по расписанию, и эта же процедура вызывается из обработок.
Поэтому ничего не мешает ее запускать, хоть в фоне, хоть в регламентном. И в ней уже ставить проверку на запущенность самой себя, ключ сделать фиксированный.
Но это всего лишь как один из возможных вариантов реализации.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот