Блокировка файла между службами - PullRequest
4 голосов
/ 08 июля 2010

Каков наилучший способ обмена файлами между двумя службами «записи» в одном приложении?

Редактировать: Извините, я должен был предоставить более подробную информацию, я думаю.

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

Ответы [ 2 ]

2 голосов
/ 08 июля 2010

Вот общее представление о том, что вы можете сделать:

public class FileManager
{
    private final FileWriter writer = new FileWriter("SomeFile.txt");
    private final object sync = new object();

    public void writeBuffer(string buffer)
    {
        synchronized(sync)
        {
            writer.write(buffer.getBytes());
        }
    }        

    public void copyAndCompress()
    {
        synchronized(sync)
        {
            // copy and/or compress
        }
    }

}

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

0 голосов
/ 08 июля 2010

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

Пример: Сервис1:

  • создает myfile.lock
  • создает / открывает myfile

Сервис2:

  • замечает, что myfile.lock присутствует, и делает паузу / блокирует / ждет
  • Когда myfile.lock уходит, он создает его, а затем открывает мой файл.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...