コード例 #1
0
        /// <summary>
        /// Get worker heartbeat
        /// </summary>
        /// <param name="ct"></param>
        /// <returns></returns>
        private async Task <WorkerHeartbeatModel> GetWorkerHeartbeatAsync(CancellationToken ct)
        {
            var workerHeartbeat = new WorkerHeartbeatModel {
                WorkerId = WorkerId,
                AgentId  = AgentId,
                Status   = GetStatus()
            };

            if (_agentRepository != null)
            {
                await _agentRepository.AddOrUpdate(workerHeartbeat, ct);
            }
            return(workerHeartbeat);
        }
コード例 #2
0
        /// <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;
                }
            }
        }