Sono nuovo per il servizio di assistenza e ho iniziato osservando gli articoli MSDN che trattano l'argomento. Ho iniziato implementando l'esempio Hello World here.Service Fabric - Stateful Service Persistence
ho cambiato la loro implementazione originale RunAsync a:
var myDictionary = await this.StateManager.GetOrAddAsync<IReliableDictionary<int, DataObject>>("myDictionary");
while (!cancellationToken.IsCancellationRequested)
{
DataObject dataObject;
using (var tx = this.StateManager.CreateTransaction())
{
var result = await myDictionary.TryGetValueAsync(tx, 1);
if (result.HasValue)
dataObject = result.Value;
else
dataObject = new DataObject();
//
dataObject.UpdateDate = DateTime.Now;
//
//ServiceEventSource.Current.ServiceMessage(
// this,
// "Current Counter Value: {0}",
// result.HasValue ? result.Value.ToString() : "Value does not exist.");
await myDictionary.AddOrUpdateAsync(tx, 1, dataObject, ((k, o) => dataObject));
await tx.CommitAsync();
}
await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken);
}
Ho anche introdotto un tipo DataObject e hanno esposto una proprietà UpdateDate su quel tipo.
[DataContract(Namespace = "http://www.contoso.com")]
public class DataObject
{
[DataMember]
public DateTime UpdateDate { get; set; }
}
Quando eseguo l'applicazione (F5 in Visual Studio 2015), un dataObject esempio (digitato da 1) non si trova nel dizionario così creo uno, impostare UpdateDate, aggiungere al dizionario e impegnare la transazione. Durante il ciclo successivo, trova dataObject (con chiave 1) e imposta UpdateDate, aggiorna l'oggetto nel dizionario e impegna la transazione. Perfezionare.
Ecco la mia domanda. Quando interrompo e riavvia il progetto di servizio (F5 in visual studio 2015) mi aspetterei che alla prima esecuzione di RunAsync venga trovato il dataObject (con chiave 1) ma non lo è. Mi aspetto che tutto lo stato venga svuotato alla sua replica.
Devo fare qualcosa per il servizio stateful per svuotare lo stato interno alla sua replica primaria?
Da quello che ho letto, lo fa sembrare come se tutto questo venisse gestito dal fabric di servizio e che il commit di chiamata (sulla transazione) sia sufficiente. Se trovo la replica primaria (in Service Fabric Explorer-> Vista applicazione) posso vedere che RemoteReplicator_xxx LastACKProcessedTimeUTC viene aggiornato una volta che ho eseguito il commit della transazione (durante l'esecuzione).
Qualsiasi aiuto è molto apprezzato.
Grazie!
-Mark
Grazie Sean. Le proprietà del mio progetto (sul progetto sfproj) non mostrano un gruppo di applicazioni nella finestra Proprietà. Ho forse bisogno di un aggiornamento vs2015 o ...? Ho installato gli strumenti Fabric del servizio di Visual Studio (il sdk dalla pagina di avvio). Grazie ancora! – markondotnet
Quando hai installato l'SDK? Questa funzionalità è nuova nella versione di anteprima pubblica rilasciata ieri. –
L'ho installato la scorsa domenica e ho appena notato oggi (nelle notifiche vs2015) che la versione 2.8 era fuori (a partire da ieri) quindi l'ho installata. Ancora nessuna opzione "Preserva dati all'avvio" sulle proprietà del progetto. – markondotnet