Beispiel #1
0
        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);
            }
        }