async Task <ReceivedStatus> IReceiverCallback.Received(Uri uri, Envelope[] messages) { try { var now = DateTime.UtcNow; foreach (var message in messages) { message.ReceivedAt = uri; message.Callback = new LightweightCallback(_workerQueue); if (message.IsDelayed(now)) { _workerQueue.ScheduledJobs.Enqueue(message.ExecutionTime.Value, message); } else { await _workerQueue.Enqueue(message); } } _logger.IncomingBatchReceived(messages); return(ReceivedStatus.Successful); } catch (Exception e) { _logger.LogException(e); return(ReceivedStatus.ProcessFailure); } }
// Separated for testing here. public async Task <ReceivedStatus> ProcessReceivedMessages(DateTime now, Uri uri, Envelope[] messages) { try { foreach (var message in messages) { message.ReceivedAt = uri; if (message.IsDelayed(now)) { message.Status = TransportConstants.Scheduled; message.OwnerId = TransportConstants.AnyNode; } else { message.Status = TransportConstants.Scheduled; message.OwnerId = _settings.UniqueNodeId; } message.Status = message.IsDelayed(now) ? TransportConstants.Scheduled : TransportConstants.Incoming; } using (var session = _store.LightweightSession()) { session.StoreIncoming(_marker, messages); await session.SaveChangesAsync(); } foreach (var message in messages.Where(x => x.Status == TransportConstants.Incoming)) { message.Callback = new MartenCallback(message, _queues, _store, _marker, _retries, _logger); await _queues.Enqueue(message); } _logger.IncomingBatchReceived(messages); return(ReceivedStatus.Successful); } catch (Exception e) { _logger.LogException(e); return(ReceivedStatus.ProcessFailure); } }