AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 12.06.2024, 19:03   #1  
Lankey is offline
Lankey
Участник
 
127 / 28 (1) +++
Регистрация: 19.05.2020
Архитектура импорта файлов: батчем + интеррактивно
AX2009

Простая задача: Нужно импортировать файлы батчем из папки на сервере и также дать возможность пользователю запустить этот процесс вручную(интеррактивно)

Как избежать того, чтобы два батч процесса или батч+интеррактив не начали одновременно обрабатывать один и тот же файл?
Один из вариантов, как мне кажется: создать табличку, куда писать имя файла и статус (обработан или нет) и, может, какой-то guid для обозначения процесса, который файл обрабатывает. Т.о конкурирующий процесс увидит, что файл уже в процессе обработки, и не будет его трогать.

Другой вариант: можно куда-то перемещать файл сразу для обработки(в другую папку и удалять из текущей), но, наверное, это менее надежный подход

Еще один: как-то лочить сам файл(открывать на запись, но ничего не писать).Тогда другой процесс проверит открыт ли он на запись и не сможет обработать.

Есть ли иные(проверенные) способы?
(Не хочу изобретать велосипед или наступать на грабли). Может, в самой аксапте есть хорошие стандартные примеры?

Последний раз редактировалось Lankey; 12.06.2024 в 19:08.
Старый 12.06.2024, 20:48   #2  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,689 / 1192 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
В MS SQL сервере введено понятие "ресурса", который можно заблокировать

sp_getapplock (Transact-SQL)

Физически, "ресурс" - это просто символьная строка. Соответственно, через команды прямого обращения к SQL (Connection+Statement) можно создать и заблокировать "ресурс" и при попытке другого пользователя создать тот же самый ресурс он получит ошибку

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

Достоинства этого метода в том, что в случае разрыва соединения блокировка ресурса снимается автоматически. Именно по этой причине лучше использовать именно Connection

PS: вопрос только в том, какая версия MS SQL используется. Не помню, с какой версии эти функции были введены

PPS: в dax2012 есть готовый класс по работе с ресурсами MS SQL. Называется ReqReaderWriterLock. Но был ли он в dax2009 - не в курсе
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...

Последний раз редактировалось Владимир Максимов; 12.06.2024 в 21:06.
За это сообщение автора поблагодарили: S.Kuskov (5), Lankey (1).
Старый 12.06.2024, 21:08   #3  
axm2017 is offline
axm2017
Участник
 
1,890 / 295 (13) ++++++
Регистрация: 15.05.2017
Цитата:
Сообщение от Lankey Посмотреть сообщение
AX2009
...
Другой вариант: можно куда-то перемещать файл сразу для обработки(в другую папку и удалять из текущей), но, наверное, это менее надежный подход
...
Перемещать проще и надежнее + какая то обработка файлов данных в стандарте уже что-то подобное делает если память не подводит.
Что то типа папка файлов для обработки -> папка с обрабатываемыми файлами ->папка с успешно обработанными/сбойные файлы
(stoneridgesoftware: Automated Data Entity Import Using DIXF in Dynamics AX ?)

Последний раз редактировалось axm2017; 12.06.2024 в 21:11.
Старый 12.06.2024, 21:21   #4  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,689 / 1192 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Кстати, все описанные варианты не взаимоисключающие, а, скорее, взаимодополняющие

1. Перемещение файла упростит анализ того, что вообще надо обрабатывать, а что уже обработано. Все, что в указанной папке - надо обработать. После обработки файл в другой папке

2. Дополнительная таблица - это лог того, что обработали. Удобно для "разбора полетов" в случае каких-то проблем

3. Блокировка по sp_getapplock - ну, это гарантия того, что 2 пользователя не попытаются "одновременно" взять (переместить) файл
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 12.06.2024, 23:39   #5  
Товарищ ♂uatr is offline
Товарищ ♂uatr
Участник
Аватар для Товарищ ♂uatr
MCBMSS
 
297 / 866 (29) +++++++
Регистрация: 23.10.2012
Добрый вечер.
Смотреть на флаг read-only у целевого файла - стандартный способ для встроенной системы контроля версий в Аксапту.
Однако общепринятой практикой является таблица с логическими флагами или статусами.
Самым простым выглядит, для пользовательского процесса, запускать всё тоже пакетное задание, но в синхронном режиме, с ограничением (batch constrain) на выполнение иного пакетного задания.
Тут всё зависит от контекста. Зачем вообще пользователя подпускать к данному процессу? Он системе как-то помогает? Да вряд ли... Приоритизирует файлы к обработке потому что эти данные нужны здесь и сейчас?
Старый 13.06.2024, 08:17   #6  
Lankey is offline
Lankey
Участник
 
127 / 28 (1) +++
Регистрация: 19.05.2020
Цитата:
Сообщение от Товарищ ♂uatr Посмотреть сообщение
Зачем вообще пользователя подпускать к данному процессу? Он системе как-то помогает? Да вряд ли... Приоритизирует файлы к обработке потому что эти данные нужны здесь и сейчас?
Спасибо
Батч будет каждую неделю. Пользователи будут корректировать файлы, что не импортировались вследствие ошибок в данных, и тут же ре-импортировать

Последний раз редактировалось Lankey; 13.06.2024 в 08:29.
Старый 13.06.2024, 08:28   #7  
Lankey is offline
Lankey
Участник
 
127 / 28 (1) +++
Регистрация: 19.05.2020
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
1. Перемещение файла упростит анализ того, что вообще надо обрабатывать, а что уже обработано. Все, что в указанной папке - надо обработать. После обработки файл в другой папке
Спасибо.
После обработки он будет в другой папке.
Я тут писала про "промежуточную папку" (как axm2017 описывает выше) , где файл будет, пока не закончена его обработка. Можно, действительно, без нее: если процесс прервался с ошибкой по какой-то причине перемещать его обратно папку-источник в catch блоке. Хотя, если вообще прервана связь с сервером, это не поможет.

Последний раз редактировалось Lankey; 13.06.2024 в 08:33.
Старый 13.06.2024, 08:31   #8  
Lankey is offline
Lankey
Участник
 
127 / 28 (1) +++
Регистрация: 19.05.2020
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
2. Дополнительная таблица - это лог того, что обработали. Удобно для "разбора полетов" в случае каких-то проблем

3. Блокировка по sp_getapplock - ну, это гарантия того, что 2 пользователя не попытаются "одновременно" взять (переместить) файл
Поясните, пожалуйста, зачем (3), если сделать (2), то есть, уже по таблице,вроде, можно понять, заблокирован файл или нет.
Старый 13.06.2024, 08:39   #9  
Lankey is offline
Lankey
Участник
 
127 / 28 (1) +++
Регистрация: 19.05.2020
Цитата:
Сообщение от Товарищ ♂uatr Посмотреть сообщение
Добрый вечер.
Самым простым выглядит, для пользовательского процесса, запускать всё тоже пакетное задание, но в синхронном режиме, с ограничением (batch constrain) на выполнение иного пакетного задания.
Спасибо. Синхнонное выполнение батча - интересная идея, но, мне кажется, редко используется. Почему? Тк ошибки пользователю не показываются в таком режиме. то есть, менее user-friendly, чем интеррактивный режим? Или есть какие-то еще подводные камни?
Старый 13.06.2024, 10:58   #10  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,689 / 1192 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от Lankey Посмотреть сообщение
Поясните, пожалуйста, зачем (3), если сделать (2), то есть, уже по таблице,вроде, можно понять, заблокирован файл или нет.
Запись в лог - это история. Что БЫЛО сделано. Инструментом контроля, в общем случае, служить не может

1. Первый пользователь выбрал файл
2. Второй пользователь выбрал файл
3. Первый пользователь сделал запись в лог
4. Что помешает второму пользователю также сделать запись в лог?

Т.е. просто будут 2 записи в логе и 2 пользователя "одновременно" попытаются обработать файл

В случае же блокировки ресурса, первое, что делает пользователь после выбора - пытается заблокировать ресурс. Удалось? Можешь продолжать. Нет? Этот файл взял другой пользователь
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 13.06.2024, 17:46   #11  
Lankey is offline
Lankey
Участник
 
127 / 28 (1) +++
Регистрация: 19.05.2020
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
4. Что помешает второму пользователю также сделать запись в лог?
"Мешает" проверка на то, что файл с таким именем уже есть в логе, и его статус != Обработан

То есть, такой лог , в моем понимании, альтернативен Вашему предложению использовать sp_getapplock . Только лог дополнительно полезен тем, что потом можно его анализировать потом, а sp_getapplock - нет

Последний раз редактировалось Lankey; 13.06.2024 в 17:53.
Старый 13.06.2024, 23:40   #12  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,689 / 1192 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от Lankey Посмотреть сообщение
"Мешает" проверка на то, что файл с таким именем уже есть в логе, и его статус != Обработан
Я так понимаю, что Вы предполагаете перед записью в лог выполнять поиск.

1. Первый пользователь ищет запись. Не нашел
2. Второй пользователь ищет запись. Не нашел
3. Первый пользователь создает запись
4. Второй пользователь создает запись

Уникальный индекс по имени файла? А если в разное время приходили файлы с одинаковым именем? По каким критериям выполнять поиск?

Вы не контролируете то, что получаете из-вне системы. Статусы могут контролировать только записи таблицы. Но что именно записано в эти таблицы?

При работе с данными, которые приходят из вне системы, использование таблицы блокировок для контроля - крайне не надежный инструмент.
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 17.06.2024, 09:23   #13  
Lankey is offline
Lankey
Участник
 
127 / 28 (1) +++
Регистрация: 19.05.2020
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Уникальный индекс по имени файла? А если в разное время приходили файлы с одинаковым именем?
Спасибо. Согласна, так менее надежно
Не очень ясно, почему ,как я понимаю, в стандарте не используется sp_getapplock
Теги
ax2009

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
D365FO: Настройка экспорта платежек / импорта выписок, импорта списка банков sukhanchik DAX: Функционал 34 27.01.2021 15:36
D365FO: Пример импорта из (экспорта в) Excel sukhanchik DAX: Программирование 1 03.07.2019 16:19
Как посмотреть исходные имена файлов в MSP-пакете gl00mie DAX: Администрирование 2 19.11.2017 10:14
Проблема при выполнении Импорта выписки по счету (проводка) Dino47 DAX: Функционал 5 22.02.2012 05:48
XPOParser - утилита для редактирования X++ отчетов (xpo-файлов) alex55 DAX: Программирование 3 12.02.2012 22:24

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 20:37.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.