Sync Framework con IronRuby

In questo ultimo periodo abbiamo messo in produzione una serie di applicazioni occasionalmente connesse che sfruttano il Microsoft Sync Framework per sincronizzare i propri storage locali con lo storage centralizzato.

Prima di tutto è bene dire che il Microsoft Sync Framework ha un runtime che premette

  • la sincronizzazione universale agnostica da tipi di dato e protolli.
  • la possibilità di creare e consumare feeds che sono "FeedSync-compliant"
  • lo sviluppo rapido di applicazioni che sincronizzano dati archiviati su file system NTFS, drivers removibili, Microsoft SQL Server
  • la possbilità dei estendere creare dei provider custom
  • la gestione completa dei conflitti
  • il supporto built in per il filtro delle informazioni da sincronizzare
  • di minimizzare il traffico di rete grazie alla possibilità di sincrozzizare granulare

Un primo esempio di come realizzare una piccola applicazione che permette di sincronizzare 2 cartelle del file-system lo potete trovare qui.

Ora per rendere la cosa un po' più divertente e visto che in questo periodo mi sto guardando un IronRuby in vista della sessione di Ivan Porto Carrero alla prossima conferenza ugialtnet ho riscritto l'esempio appenda citato usano IronRuby. Questo il risultato

require "mscorlib" require "Microsoft.Synchronization.dll" require "Microsoft.Synchronization.Files.dll" include System include Microsoft::Synchronization include Microsoft::Synchronization::Files class Syncronizer def DoWork replica1RootPath, replica2RootPath idFileName = "filesync.id"; replica1Id = GetReplicaId( replica1RootPath + "/" + idFileName) replica2Id = GetReplicaId( replica2RootPath + "/" + idFileName) options = FileSyncOptions.RecycleDeletedFiles filter = FileSyncScopeFilter.new filter.FileNameExcludes.Add idFileName DetectChangesOnFileSystemReplica replica1Id, replica1RootPath, filter, options DetectChangesOnFileSystemReplica replica2Id, replica2RootPath, filter, options SyncFileSystemReplicasOneWay replica1Id, replica2Id, replica1RootPath, replica2RootPath, filter, options SyncFileSystemReplicasOneWay replica2Id, replica1Id, replica2RootPath, replica1RootPath, filter, options end def GetReplicaId path id = Guid.NewGuid if File.exist? path str = File.read path id = Guid.new(str) else File.open(path, 'w') {|f| f.write(id.ToString) } end id end def DetectChangesOnFileSystemReplica replicaId, rootPath, filter, options provider = FileSyncProvider.new(replicaId, rootPath, filter, options) provider.DetectChanges; provider.Dispose end def SyncFileSystemReplicasOneWay sourceReplicaId, destinationReplicaId, sourceReplicaRootPath, destinationReplicaRootPath, filter, options agent = SyncOrchestrator.new agent.LocalProvider = FileSyncProvider.new(sourceReplicaId, sourceReplicaRootPath, filter, options) agent.RemoteProvider = FileSyncProvider.new(destinationReplicaId, destinationReplicaRootPath, filter, options) agent.Direction = SyncDirectionOrder.Upload agent.Synchronize end end sync = Syncronizer.new sync.DoWork "D:/tmp/SyncFXSamples/A", "D:/tmp/SyncFXSamples/B"

Per chi volesse provare basta semplicemente scaricare lo zip che trovate qui ed eseguire lo script con il comando ir sync.rb come nell'immagine qui sotto.

image

Per il futuro, visto che gli esempi del Sync Framework non sono moltissimi, mi piacerebbe scrivere alcuni post per dimostrare come e quando questo framework può risolverci alcuni problemi non banali.
Ora devo spero di trovare il tempo per continuare.