Example #1
0
 private void DispatchEvent(SenderEventHandler handler, SenderEventArgs eventArgs)
 {
     if (handler != null)
     {
         handler.Invoke(this, eventArgs);
     }
 }
Example #2
0
 public void WaitForEvent(SenderEventArgs.SenderEventType eventType, ushort numberOfTimes)
 {
     switch (eventType)
     {
         case SenderEventArgs.SenderEventType.Attempted:
             _messageAttemptedSynchronizer.Wait(numberOfTimes);
             break;
         case SenderEventArgs.SenderEventType.Succeeded:
             _messageSucceededSynchronizer.Wait(numberOfTimes);
             break;
         case SenderEventArgs.SenderEventType.Failed:
             _messageFailedSynchronizer.Wait(numberOfTimes);
             break;
     }
 }
Example #3
0
        private void HasResponse(IAsyncResult result)
        {
            try
            {
                _client.EndSend(result);

                SenderEnvelope envelope = null;

                lock (_syncLock)
                {
                    envelope = _sendQueue.Dequeue();
                }

                _retryTimer.Reset();

                var eventArgs = new SenderEventArgs(envelope, SenderEventArgs.SenderEventType.Succeeded);
                DispatchEvent(MessageSucceeded, eventArgs);
            }
            catch (Exception ex)
            {
                Status = SenderStatus.WaitForRetry;

                SenderEnvelope envelope = _sendQueue.Peek();

                var eventArgs = new SenderEventArgs(envelope, SenderEventArgs.SenderEventType.Failed);
                eventArgs.ErrorMessage = ex.Message;
                DispatchEvent(MessageFailed, eventArgs);

                _retryTimer.Wait();
            }

            TryToSendFirstMessageInQueue();
        }
Example #4
0
        private void TryToSendFirstMessageInQueue()
        {
            if (_sendQueue.Count > 0)
            {
                SenderEnvelope envelope = _sendQueue.Peek();
                envelope.Attempts.Add(DateTime.Now);

                Status = SenderStatus.Sending;
                _client.BeginSend(envelope.Message, new AsyncCallback(HasResponse));

                var eventArgs = new SenderEventArgs(envelope, SenderEventArgs.SenderEventType.Attempted);
                DispatchEvent(MessageAttempted, eventArgs);
            }
            else
            {
                Status = SenderStatus.Idle;
            }
        }