2010-09-09 4 views
0

Как узнать, когда закончилась работа db4o started from code?, определяющий, когда закончилась резервная копия db4o

Doc упоминает, что он выполняет резервное копирование в отдельном потоке, но ничего не говорит о том, когда он заканчивается. Метод не получает никакого обратного вызова.

ответ

3

Насколько я знаю, это невозможно. (Когда вы пытаетесь запустить резервное копирование, пока все уже готово, вы получаете исключение BackupInProgressException. Таким образом, вы знаете, что все уже готово к резервному копированию.

.

Однако это не реальное уведомление и не usfull во многих ситуациях

Однако есть комплекс обходные Вы можете предоставить свою собственное хранение-реализацию для резервного копирования-процесса:.

IStorage MyStorage = ...; container.Ext(). Резервное копирование (myStorage, "backup.db4o.bak");

Таким образом вы можете реализовать хранилище-обертку, которое уведомляет вас. Вы строите декоратор, который реализует интерфейс IStorage. IBin-экземпляры, которые возвращаются, затем уведомляют вас при закрытии. Когда резервная копия вызывает метод close-methon на экземпляре IBin, вы знаете, что это сделано.

Вот проект, как это делается. (Не тест или что-то еще). StorageDecorator является базовым классом для декодеров IStorage, который включен в db4o.

class NotificationStorageDecorator : StorageDecorator 
{ 
    public NotificationStorageDecorator(IStorage storage) : base(storage) 
    { 

    } 

    public NotificationStorageDecorator() : this(new FileStorage()){} 

    protected override IBin Decorate(BinConfiguration config, IBin bin) 
    { 
     return new MyNotificationBin(bin);  
    } 

    class MyNotificationBin : BinDecorator 
    { 
     public MyNotificationBin(IBin bin) : base(bin) 
     { 
     } 

     public override void Close() 
     { 
      base.Close(); 
      // Implement here your notification-mechanism 
      // For example with events etc 
      Console.Out.WriteLine("Backup-done"); 
     } 
    } 
} 

// затем использовать его

  var notifactionStorage = new NotificationStorageDecorator(); 
      container.Ext().Backup(notifactionStorage,"backup.db4o.back"); 
+0

+1 @Gamlor я считаю, что это очень разумное работу вокруг. Если никто больше не придет с чем-то, я обязательно попробую это. – eglasius

+0

@eglasius У вас были какие-то успехи в этом? У нас все еще есть унаследованная система и повысить надежность, которую нам нужно знать о готовых резервных копиях. –

+0

Прошу прощения, но в конце мы никогда не возвращались, чтобы попробовать :( – eglasius