Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Логер. Как разделить ресурсы меджу 2-мя программи, Разделение ресурсов или данных 
V
    Опции темы
Lisus
Дата 28.3.2008, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 21.10.2007

Репутация: нет
Всего: 2



Задача такова: сделать приложение, которое может запускаться одновременно несколько раз, ну как Блокнот типа. 

Программа должна работать с жестким диском. При каких-нибудь сбоях в файл error.txt  записывается происшествие.

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

Как обойти такую "редкую", но теоритический возможную ситуацию?

Статик переменные здесь не прокатят, они разные для разных программ.
Синхронизировать на еррорную запись не получается, т.к. я не знаю, как можно сделать объект (по которому будет проводиться синхронизация) общим.

Есть же какие-нибудь возможности для этого. Ну скажем можно же запретить второй программе запускаться есть запущена первая, значит должна быть возможность и наладить диалог между 2-мя программами.

Как решается эта проблема?
PM MAIL   Вверх
integral
Дата 31.3.2008, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 278
Регистрация: 3.7.2006
Где: Dnipropetrovs' ;k, Ukraine

Репутация: нет
Всего: нет



не факт, что это то что нужно, но мне придумалось такое:
если оба получили отказ на запись в ерорный файл, то каждый поток нужно уложить спать на рандобное время, например, от 0,01с до 1с. Ну и так повторять - вряд ли у тебя будут совпадать время снаsmile


--------------------
import my.opinion.*;
жж
PM ICQ   Вверх
LSD
Дата 31.3.2008, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Можно сделать так (запустить надо экземпляра 3-4):
Код

public class Test
{
  private static File errorLogFile = new File("error.log");
  
  public static volatile boolean running = true;

  public static void main(String[] args) throws Exception
  {
    int n = (int) (Math.random() * 1000);
    new Thread(new R("#" + n), "error-writer-" + n).start();

    Thread.sleep(60 * 1000);
    running = false;
  }


  public static void writeErrorLog(String message, Throwable err)
  {
    try
    {
      FileOutputStream out = new FileOutputStream(errorLogFile, true);
      FileLock lock;
      while((lock = out.getChannel().tryLock()) == null)
      {
        try
        {
          Thread.sleep(10);
        }
        catch(InterruptedException e)
        {
          //ignore
        }
      }
      try
      {
        PrintWriter writer = new PrintWriter(out);
        writer.println(message);
        err.printStackTrace(writer);
        writer.println();
        writer.flush();
      }
      finally
      {
        lock.release();
      }
      out.close();
    }
    catch(FileNotFoundException e)
    {
      e.printStackTrace();
    }
    catch(IOException e)
    {
      e.printStackTrace();
    }
  }

  public static class R implements Runnable
  {
    private String id;

    public R(String id)
    {
      this.id = id;
    }

    public void run()
    {
      Random rnd = new Random();
      while(running)
      {
        writeErrorLog("Writer " + id + " message #" + System.nanoTime(), new Exception("Error"));
        try
        {
          Thread.sleep(rnd.nextInt(250));
        }
        catch(InterruptedException e)
        {
          e.printStackTrace();
        }
      }
    }
  }
}



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Lisus
Дата 7.4.2008, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 21.10.2007

Репутация: нет
Всего: 2



2 integral

Ну это конечно не полное решение, но это сильно понижает вероятность одновременного доступа, что тоже результат.
PM MAIL   Вверх
Lisus
Дата 7.4.2008, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 21.10.2007

Репутация: нет
Всего: 2



2 LSD, ЛС - это исключение, больше не буду.

Т.е. можно установить блок на файл?

Я почему-то думал, что если файл занят, то блок TRY прервется в месте создания стрима
21: FileOutputStream out = new FileOutputStream(errorLogFile, true);

Т.е. это одна из ситуаций когда файл на запись не доступен.
PM MAIL   Вверх
LSD
Дата 7.4.2008, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(Lisus @  7.4.2008,  13:24 Найти цитируемый пост)
Т.е. можно установить блок на файл?

Да, но это гарантирует только то, что другое Java приложение не сможет поставить лок. Не гарантируется, что этот лок будет действовать и на обычные приложения в системе.

Цитата(Lisus @  7.4.2008,  13:24 Найти цитируемый пост)
Я почему-то думал, что если файл занят, то блок TRY прервется в месте создания стрима
21: FileOutputStream out = new FileOutputStream(errorLogFile, true);

Нет, тут он не прервется. Таким образом можно организовать взаимодействие межде приложениями, через memory mapped files.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Lisus
Дата 7.4.2008, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 21.10.2007

Репутация: нет
Всего: 2



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

Т.е. 

- программа а) открывает на запись файл
- программа б) открывает на запись тот же файл
- программа а) записывает "123"
- программа б) записывает "456"
- программа а) записывает "789"
- программа б) закрывает файл
- программа а) закрывает файл

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

т.е. хрестиматийный способ работы с файлом:

Код


FileOutputStream fos= null;
try{
   fos = new FileOutputStream ("error.txt");
   try{
      fos.write(23);
   }
   catch(IOExeption e){....}
   fos.close();
}
catch(FileNotFoundExeption e)
{
...
}


не защищает от параллельной работы с одним файлом нескольких приложений???
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0515 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.