@AV25242 I am already using the “Always On” option.
@matthew.groves
In Startup.cs:
I have these lines in ConfigureServices method:
services.AddCouchbase(Configuration.GetSection("Couchbase"));
services.AddCouchbaseBucket<IUmbracoBucketProvider>("Umbraco");
services.AddCouchbaseBucket<IPelegBucketProvider>("Peleg");
services.AddCouchbaseBucket<IGatewaysBucketProvider>("Gateways");
//all couchbase calls from the app are made through this service
services.AddSingleton<ICache, CouchbaseManager>();
I also have this in Configure method:
applicationLifetime.ApplicationStopped.Register(() =>
{
app.ApplicationServices.GetRequiredService<ICouchbaseLifetimeService>().Close();
});
The actual usage of Couchbase is in one service that I am adding as a singleton:
public CouchbaseManager(ILogger<CouchbaseManager> logger, IPelegBucketProvider pelegBucketProvider, IUmbracoBucketProvider umbracoBucketProvider, IGatewaysBucketProvider gatewaysBucketProvider)
{
_logger = logger;
IBucket gatewaysBucket = gatewaysBucketProvider.GetBucket();
IBucket pelegBucket = pelegBucketProvider.GetBucket();
IBucket umbracoBucket = umbracoBucketProvider.GetBucket();
Buckets = new Dictionary<E_Bucket, IBucket>
{
{ E_Bucket.Gateways, gatewaysBucket },
{ E_Bucket.Peleg, pelegBucket },
{ E_Bucket.Umbraco, umbracoBucket }
};
BucketContexts = new Dictionary<E_Bucket, BucketContext>
{
{ E_Bucket.Gateways, new BucketContext(gatewaysBucket) },
{ E_Bucket.Peleg, new BucketContext(pelegBucket) },
{ E_Bucket.Umbraco, new BucketContext(umbracoBucket) }
};
}
public async Task<Dictionary<string, T>> GetAsync<T>(IEnumerable<string> keys, E_Bucket bucket)
{
Dictionary<string, T> result = new Dictionary<string, T>();
try
{
if (keys != null && keys.Any())
{
IDocumentResult<string>[] cbRes = await Buckets[bucket].GetDocumentsAsync<string>(keys);
result = cbRes.Where(x => x.Success).ToDictionary(y => y.Id, z => Tools.FromJson<T>(z.Content));
}
}
catch (Exception ex)
{
_logger.LogError($"CB Multi GetAsync exception message: {ex.Message}", ex);
}
return result;
}
public async Task<bool> UpsertAsync<T>(Dictionary<string, T> values, E_Bucket bucket, TimeSpan timeSpan)
{
if (values != null && values.Count > 0)
{
try
{
List<IDocument<string>> docs = new List<IDocument<string>>();
foreach (KeyValuePair<string, T> value in values)
{
Document<string> doc = new Document<string>()
{
Id = value.Key,
Content = Tools.ToJson(value.Value),
Expiry = (uint)timeSpan.TotalMilliseconds
};
docs.Add(doc);
}
IDocumentResult<string>[] results = await Buckets[bucket].UpsertAsync(docs);
if (results.All(x => !x.Success))
{
Exception ex = results.FirstOrDefault(x => x.Exception != null).Exception;
if (ex != null)
{
throw new Exception("CB Multi UpsertAsync all failed", ex);
}
else
{
throw new Exception("CB Multi UpsertAsync all failed");
}
}
return true;
}
catch (Exception ex)
{
_logger.LogError($"CB Multi UpsertAsync exception message: {ex.Message}", ex);
}
}
return false;
}