2014-01-03 2 views
1

Я работаю над процессом загрузки параллельного файла, но не знаю, какой подход принять.Совместный общий доступ к файлам в Java

О:

пучки приложений кучу файлов вместе в почтовый файл. Обычно файлы доступны на жестком диске в общем месте (например, tmp). Однако есть случаи, когда файлов нет и их необходимо загрузить с удаленного http-сервера.

Вопрос:

  • Как я могу загрузить несколько файлов одновременно, и гарантировать, что никакой другой поток (пакетирования файлов) не загружает тот же файл, в то же время?

  • Более того, как я могу гарантировать, что в случае одновременного запуска нескольких приложений (помните, что все файлы находятся в общем местоположении), ни один экземпляр приложения не загружает один и тот же файл одновременно ?

Опишите стратегию и, возможно, способ ее реализации. Возможно, решение вышеупомянутого вопроса уже существует.

Спасибо!

+1

Вместо того, чтобы люди * качки * идеи, попробуйте очертить свой первый и получить обратную связь по вашему вопросу. Код помогает также ссылаться на пакеты, которые вы можете использовать для выполнения задачи. – Jakub

ответ

1
  1. Вы можете использовать очереди или БД для загрузки нужных файлов, просто держать столбец в «статус» и поток будет пометить файл как «извлечение». Когда будет выполнен, оно будет установлено как «сделано». Сохраните последнюю временную метку изменения, и если файл загружается в течение длительного времени, остановите или перезапустите загрузку.

  2. Использование базы данных для этой очереди файлов может гарантировать, что другие приложения не будут получать один и тот же файл несколько раз (может быть, сохранить загрузку и т. Д .;). Кроме того, вы можете запускать несколько загрузок, а db может использовать для отслеживания скорости загрузки, прогресса и т. Д .;

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

1

Вот возможная стратегия:

  1. В случае одного приложения: есть какое-то диспетчерская нить, которая считывает работу из очереди (может быть какие-то сохранялось очередь тоже как таблицы БДА или другими) и порождает новые потоки для каждого элемента, который был прочитан из очереди. По чтению я имею в виду, читает и удаляет из очереди.

  2. Имейте эту очередь в общей БД (или в любом общем хранилище). В этом случае может быть отдельное одно приложение диспетчера, которое просто считывает работы или рабочие части из БД и дает работу рабочим приложениям. Поэтому каждое рабочее приложение запрашивает приложение диспетчера для работы, это гарантирует, что только приложение диспетчера считывает из БД (или другого центрального хранилища, которое вы решите использовать). Это в свою очередь устраняет необходимость синхронизации вашего доступа к базе данных (постоянного хранилища).

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