Помогите придумать алгоритм конкурентного чтения файлов из директории.

1. newborn 27.01.15 11:06 Сейчас в теме
Во-первых, задача будет выполняться регламентным заданием, т.е. без участия человека.
Во-вторых, после выполнения задачи обработанные файлы нужно удалить.
В-третьих, в процессе выполнения задачи в директорию могут поступать новые файлы, которые ещё не подвергались обработке.
В-четрвертых, обработку могут запустить и ручками и тогда вообще непонятно, какой файл обрабатывался, какой - нет.

Пока не придумал ничего более умного, чем создание в каталоге проверки файл-флага, сигнализирующего о том, что обработка файлов началалсь и фиксирование в списке значений текущих файлов, которые обрабатываются. После выполнения задачи удалается сначала файлы из списка а потом файл-флаг.
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. dj_serega 391 27.01.15 11:11 Сейчас в теме
(1) newborn, Файл который обрабатываться переименовать в "Обработка ДатаВремя_ИмяФайла".
После успешной обработки перемещать в каталог "Обработанные файлы". При этом имя файла менять на "Обработано ДатаВремя_ИмяФайла".
3. newborn 27.01.15 11:14 Сейчас в теме
(2) dj_serega,

Чё-та слишком много файловых операций. Я как-раз хотел уйти от них. Я думал, может у кого-то есть идеи обойтись операциями внутри 1С...
Хотя, как вариант - можно попробовать.
4. PetroP 27.01.15 11:20 Сейчас в теме
(3) newborn, перемещение/переименование файла в рамках одного диска - операция быстрая и не затратная. По сути, переписывается путь в файловой таблице.
5. dj_serega 391 27.01.15 11:25 Сейчас в теме
(3) newborn, Всю жизнь программирования так делал :) В общем операции выполняются быстро и не заметно. Если файл обрабатывается несколькими пользователями то переименовать не получится. Таким образом можно уйти от обработки одного файла несколькими процессами.
По другому, имхо, никак.
Можно конечно грузить файл в 1С, потом удалять. Но тут вопрос следующий: А насколько велик может быть файл? 1С (грубо говоря) будет его 15 минут грузить себе, потом при удалении будет ошибка удаления, придется брать следующий, а тут окажется что он тоже заблочен. Вообщем вариант с (2) самый гут :)

З.ы.: если будут еще какие-то красивые варианты то с радостью проанализирую :)
6. DJDUH 17 27.01.15 11:29 Сейчас в теме
(1) newborn, Через транзакцию - по завершению удалишь файл + пишешь лог (наприм в *.txt)!
7. newborn 27.01.15 11:37 Сейчас в теме
Нет, я о другом направлении думаю.
есть ли возможность внутри 1С как-то сигнализировать для всех пользователей о том, что обработка идёт? И не запускать конкурирующие обработки?
8. dj_serega 391 27.01.15 12:37 Сейчас в теме
(7) newborn, Можно вот так извратиться.

	АктивностьОбменаКлючОбъекта			= "КлючОбъекта";
	АктивностьОбменаКлючНастроек		= "КлючНастроек";
	АктивностьОбменаНастройки			= "ТекстНастройки";
	АктивностьОбменаОписаниеНастроек	= "ОписаниеНастроек";
	АктивностьОбменаИмяПользователя		= "ИмяПользователяИБ";
	
	
	Если ПроверкаАктивностиОбмена = Неопределено Тогда
	
		Попытка
			ХранилищеОбщихНастроек.Сохранить(АктивностьОбменаКлючОбъекта,
												АктивностьОбменаКлючНастроек,
												АктивностьОбменаНастройки,
												АктивностьОбменаОписаниеНастроек,
												АктивностьОбменаИмяПользователя);
		Исключение
			ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не удалось зафиксировать начало. Причина: " + Символы.ПС + ОписаниеОшибки());
		КонецПопытки;
		
	КонецЕсли;
Показать

Я так делал блокировку обмена. Работает отлично.
9. newborn 27.01.15 14:42 Сейчас в теме
(8) dj_serega,
спасибо, посмотрим
10. Boneman 298 27.01.15 15:19 Сейчас в теме
(7) newborn,
есть ли возможность внутри 1С как-то сигнализировать для всех пользователей о том, что обработка идёт? И не запускать конкурирующие обработки?

активные регламентные и фоновые задания получай,
если нужное задание работает, то у пользака отключается кнопка.

У меня некоторые обработки на фоновых заданиях и работают, так вот по ключу сначала проверка делается, и не дает запустить еще один экземпляр.
регламентные также получаются
ПолучитьРегламентныеЗадания(<Отбор>)
и вперед.
11. dj_serega 391 27.01.15 15:26 Сейчас в теме
(10) Boneman, А если пользователь запустил и после него фоновое пробует запуститься?
12. Boneman 298 27.01.15 15:52 Сейчас в теме
(11) dj_serega, проверку в само регламентное задание зашить.
Я так понимаю, оно гдето в конфе зашито, и запускается по расписанию, и эта же процедура вызывается из обработок.
Поэтому ничего не мешает ее запускать, хоть в фоне, хоть в регламентном. И в ней уже ставить проверку на запущенность самой себя, ключ сделать фиксированный.
Но это всего лишь как один из возможных вариантов реализации.
13. dj_serega 391 27.01.15 15:58 Сейчас в теме
(12) Boneman, если пользователь будет запускать туже процедурину тогда согласен. Судя по опыту, есть прогеры, которые занимаются копипастом. Лень модифицировать для универсальности процедуру :(
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот