2015-04-16 4 views
1

У меня есть служба Windows, которая просто читает общую папку UNC (например, папку для просмотра), а затем берет верхние 5 файлов и выполняет некоторый процесс и передает его в другое место через API.Синхронизация между службами windows

Эта услуга должна запускаться каждые 5 минут. А обработка & может занять более 5 минут.

Я запустил этот сервис Windows на 5 серверов, и я хотел бы найти прочный подход, который эти службы не будут иметь доступа к одному и тому же файлу в одно и то же время.

Я думаю, что когда-либо служба получит доступ, сначала он проверит SQL-сервер, если эти файлы находятся в списке обработки (например, в таблице обработки_файлов). Если нет, напишите эти файлы в базе данных и попытайтесь их забрать, поэтому, если есть другая служба, попытайтесь обратиться к той же папке, она проверит db и увидит, что файлы находятся в процессе. Затем он попробует следующий 5 файлов.

Я хотел бы знать, есть ли известный сценарий для этого сценария, тогда мне не нужно изобретать колесо.

ответ

0

Использование SQL-сервера для чего-то вроде этого кажется излишним. Кажется, у вас есть права на чтение/запись в папку, поэтому одним из способов было бы создать пустой файл блокировки при обработке файла.

Поэтому, когда сервер обрабатывает файл, создайте файл filename.ext.lock в каталоге. Если другой сервер видит этот файл, он знает, что он игнорирует файл filename.ext с момента его обработки. Если вы хотите получить фантазию, вы можете добавить информацию в файл .lock, как то, что сервер обрабатывает, когда он запущен и т. Д. Для целей отладки. Когда файл завершит обработку, вы можете просто удалить файл .lock.

0

Блокировка файлов будет самым простым и эффективным способом.

Когда вы открываете файл, вы можете выбрать, разрешать или не разрешать другим процессам делиться файлом. Если вы этого не сделаете, тогда только один процесс может открыть файл в то время; другие процессы получат нарушение обмена.

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

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

Смежные вопросы