Beispiel #1
0
 /// <summary>
 /// Convert to Service model
 /// </summary>
 /// <param name="model"></param>
 /// <returns></returns>
 public static WorkerInfoModel ToFrameworkModel(this WorkerDocument model)
 {
     if (model == null)
     {
         return(null);
     }
     return(new WorkerInfoModel {
         AgentId = model.Id,
         Status = model.WorkerStatus,
         LastSeen = model.LastSeen
     });
 }
        /// <inheritdoc/>
        public async Task AddOrUpdate(WorkerHeartbeatModel workerHeartbeat,
                                      CancellationToken ct)
        {
            if (workerHeartbeat == null)
            {
                throw new ArgumentNullException(nameof(workerHeartbeat));
            }
            while (true)
            {
                var workerDocument = new WorkerDocument {
                    AgentId      = workerHeartbeat.AgentId,
                    Id           = workerHeartbeat.WorkerId,
                    WorkerStatus = workerHeartbeat.Status,
                    LastSeen     = DateTime.UtcNow
                };
                var existing = await _documents.FindAsync <WorkerDocument>(
                    workerHeartbeat.WorkerId);

                if (existing != null)
                {
                    try {
                        workerDocument.ETag = existing.Etag;
                        workerDocument.Id   = existing.Id;
                        await _documents.ReplaceAsync(existing, workerDocument);

                        return;
                    }
                    catch (ResourceOutOfDateException) {
                        continue; // try again refreshing the etag
                    }
                    catch (ResourceNotFoundException) {
                        continue;
                    }
                }
                try {
                    await _documents.AddAsync(workerDocument);

                    return;
                }
                catch (ConflictingResourceException) {
                    // Try to update
                    continue;
                }
            }
        }