コード例 #1
0
        private async Task OnMessageQueueReceived(MessageQueueItem mqi)
        {
            _logger.LogInformation($"{Name}: Message Queue Received with a message id of {mqi.Message.MessageId}, starting processing...");
            await BroadcastMessageLogic.ProcessMessageQueueItem(mqi);

            _logger.LogInformation($"{Name}: Finished processing of message {mqi.Message.MessageId}.");
        }
コード例 #2
0
        public async Task <bool> Process(MessageQueueItem item)
        {
            bool success = true;

            if (Config.SystemBehaviorConfig.IsAzure)
            {
                var messageHandlerOptions = new MessageHandlerOptions(ExceptionReceivedHandler)
                {
                    MaxConcurrentCalls = 1,
                    AutoComplete       = false
                };

                // Register the function that will process messages
                _client.RegisterMessageHandler(ProcessQueueMessage, messageHandlerOptions);

                //await ProcessQueueMessage(_client.ReceiveAsync());
            }
            else
            {
                return(await ProcessMessageQueueItem(item));
            }

            _queueService = null;
            return(false);
        }
コード例 #3
0
 public DataBusMsg(MessageQueueItem item)
 {
     Payload     = JsonConvert.DeserializeObject <T>(item.Publication.Payload);
     DateCreated = item.Publication.DateCreated;
     MaxAttempts = item.Subscription.MaxAttempts;
     RetryDelay  = item.Subscription.RetryDelay;
     LastAttempt = item.LastAttempt;
 }
コード例 #4
0
        /// <summary>
        /// Publishes a message to all subscribers of that type of message.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="message">The message that is broadcast.</param>
        public void Publish <T>(T message)
        {
            var messageQueue = new MessageQueueItem <T>()
            {
                Message = message, Type = typeof(T)
            };

            _messageQueue.Add(messageQueue);
        }
コード例 #5
0
    static void PostThreadMessage(Command cmd, Action act)
    {
        lock (s_thread_msg_queue)
        {
            MessageQueueItem item = new MessageQueueItem();
            item.cmd    = cmd;
            item.action = act;

            s_thread_msg_queue.Enqueue(item);
        }

        s_queue_event.Set();
    }
コード例 #6
0
        public void EnqueueMessage(MessageQueueItem messageQueue)
        {
            if (SystemBehaviorConfig.ServiceBusType == ServiceBusTypes.Rabbit)
            {
                _rabbitOutboundQueueProvider.EnqueueMessage(messageQueue);
                return;
            }

            VerifyAndCreateClients();
            string serializedObject = String.Empty;

            if (messageQueue != null && messageQueue.Message != null && messageQueue.MessageId == 0 && messageQueue.Message.MessageId != 0)
            {
                messageQueue.MessageId = messageQueue.Message.MessageId;
            }

            try
            {
                serializedObject = ObjectSerialization.Serialize(messageQueue);

                // We are limited to 256KB in azure queue messages
                var size = ASCIIEncoding.Unicode.GetByteCount(serializedObject);
                if (size > 220000)
                {
                    messageQueue.Profiles = null;
                    serializedObject      = ObjectSerialization.Serialize(messageQueue);
                }

                if (ASCIIEncoding.Unicode.GetByteCount(serializedObject) > 220000)
                {
                    messageQueue.Message.MessageRecipients = null;
                    serializedObject = ObjectSerialization.Serialize(messageQueue);
                }
            }
            catch { }

            // If we get an Exception, i.e. OutOfMemmory, lets just strip out the heavy data and try.
            if (String.IsNullOrWhiteSpace(serializedObject))
            {
                messageQueue.Profiles = null;
                messageQueue.Message.MessageRecipients = null;
                serializedObject = ObjectSerialization.Serialize(messageQueue);
            }

            BrokeredMessage message = new BrokeredMessage(serializedObject);

            message.MessageId = string.Format("{0}|{1}", messageQueue.Message.MessageId, messageQueue.Message.ReceivingUserId);

            SendMessage(_messageClient, message);
        }
コード例 #7
0
        public void Process(MessageQueueItem item)
        {
            bool success = true;

            if (Config.SystemBehaviorConfig.IsAzure)
            {
                ProcessQueueMessage(_client.Receive());
            }
            else
            {
                ProcessMessageQueueItem(item);
            }

            _queueService = null;
        }
コード例 #8
0
    static void ThreadProc()
    {
        Debug.Log("rttp working thread running");
        long last_input_tick = Utility.GetMilliSecondSinceEpoch();

        while (true)
        {
            long now      = Utility.GetMilliSecondSinceEpoch();
            long interval = now - last_input_tick;
            if (interval > 10 || interval < 0 /*in case clock back*/)
            {
                rttp.rt_tick();
                last_input_tick = now;
            }

            MessageQueueItem item       = new MessageQueueItem();
            bool             found_item = false;
            lock (s_thread_msg_queue)
            {
                if (s_thread_msg_queue.Count > 0)
                {
                    item       = s_thread_msg_queue.Dequeue();
                    found_item = true;
                }
            }

            if (found_item)
            {
                if (item.cmd == Command.EXIT)
                {
                    break;
                }
                else
                {
                    item.action();
                    continue;
                }
            }
            else
            {
                s_queue_event.WaitOne(10);
            }
        }

        Debug.Log("rttp working thread exit");
    }
コード例 #9
0
ファイル: QueueService.cs プロジェクト: mrjohndowe/Core
        public async Task <bool> EnqueueMessageBroadcastAsync(MessageQueueItem mqi, CancellationToken cancellationToken = default(CancellationToken))
        {
            if (Config.SystemBehaviorConfig.IsAzure)
            {
                if (!String.IsNullOrWhiteSpace(mqi.Message.ReceivingUserId))
                {
                    var dm = await _departmentsService.GetDepartmentMemberAsync(mqi.Message.ReceivingUserId, mqi.DepartmentId);

                    string departmentNumber = await _departmentSettingsService.GetTextToCallNumberForDepartmentAsync(dm.DepartmentId);

                    mqi.DepartmentTextNumber = departmentNumber;

                    if (mqi.Message.ReceivingUser == null)
                    {
                        var user = mqi.Profiles.FirstOrDefault(x => x.UserId == mqi.Message.ReceivingUserId);

                        if (user != null && user.User != null)
                        {
                            mqi.Message.ReceivingUser = user.User;
                        }
                    }
                }
                else if (!String.IsNullOrWhiteSpace(mqi.Message.SendingUserId))
                {
                    var dm = await _departmentsService.GetDepartmentMemberAsync(mqi.Message.SendingUserId, mqi.DepartmentId);

                    string departmentNumber = await _departmentSettingsService.GetTextToCallNumberForDepartmentAsync(dm.DepartmentId);

                    mqi.DepartmentTextNumber = departmentNumber;
                }

                return(await _outboundQueueProvider.EnqueueMessage(mqi));
            }
            else
            {
                QueueItem item = new QueueItem();
                item.QueueType = (int)QueueTypes.MessageBroadcast;
                item.SourceId  = mqi.Message.MessageId.ToString();
                item.QueuedOn  = DateTime.UtcNow;

                await _queueItemsRepository.SaveOrUpdateAsync(item, cancellationToken);
            }

            return(true);
        }
コード例 #10
0
ファイル: QueueService.cs プロジェクト: mrpastewart/Core
        public void EnqueueMessageBroadcast(MessageQueueItem mqi)
        {
            if (Config.SystemBehaviorConfig.IsAzure)
            {
                if (!String.IsNullOrWhiteSpace(mqi.Message.ReceivingUserId))
                {
                    var    dm = _departmentsService.GetDepartmentMember(mqi.Message.ReceivingUserId, mqi.DepartmentId);
                    string departmentNumber = _departmentSettingsService.GetTextToCallNumberForDepartment(dm.DepartmentId);
                    mqi.DepartmentTextNumber = departmentNumber;

                    if (mqi.Message.ReceivingUser == null)
                    {
                        var user = mqi.Profiles.FirstOrDefault(x => x.UserId == mqi.Message.ReceivingUserId);

                        if (user != null && user.User != null)
                        {
                            mqi.Message.ReceivingUser = user.User;
                        }
                    }
                }
                else if (!String.IsNullOrWhiteSpace(mqi.Message.SendingUserId))
                {
                    var    dm = _departmentsService.GetDepartmentMember(mqi.Message.SendingUserId, mqi.DepartmentId);
                    string departmentNumber = _departmentSettingsService.GetTextToCallNumberForDepartment(dm.DepartmentId);
                    mqi.DepartmentTextNumber = departmentNumber;
                }

                _outboundQueueProvider.EnqueueMessage(mqi);
            }
            else
            {
                QueueItem item = new QueueItem();
                item.QueueType = (int)QueueTypes.MessageBroadcast;
                item.SourceId  = mqi.Message.MessageId.ToString();
                item.QueuedOn  = DateTime.UtcNow;

                _queueItemsRepository.SaveOrUpdate(item);
            }
        }
コード例 #11
0
        public void EnqueueMessage(MessageQueueItem messageQueue)
        {
            string serializedObject = String.Empty;

            if (messageQueue != null && messageQueue.Message != null && messageQueue.MessageId == 0 && messageQueue.Message.MessageId != 0)
            {
                messageQueue.MessageId = messageQueue.Message.MessageId;
            }

            try
            {
                serializedObject = ObjectSerialization.Serialize(messageQueue);

                // We are limited to 256KB in azure queue messages
                var size = ASCIIEncoding.Unicode.GetByteCount(serializedObject);
                if (size > 220000)
                {
                    messageQueue.Profiles = null;
                    serializedObject      = ObjectSerialization.Serialize(messageQueue);
                }

                if (ASCIIEncoding.Unicode.GetByteCount(serializedObject) > 220000)
                {
                    messageQueue.Message.MessageRecipients = null;
                    serializedObject = ObjectSerialization.Serialize(messageQueue);
                }
            }
            catch { }

            // If we get an Exception, i.e. OutOfMemmory, lets just strip out the heavy data and try.
            if (String.IsNullOrWhiteSpace(serializedObject))
            {
                messageQueue.Profiles = null;
                messageQueue.Message.MessageRecipients = null;
                serializedObject = ObjectSerialization.Serialize(messageQueue);
            }

            SendMessage(ServiceBusConfig.MessageBroadcastQueueName, serializedObject);
        }
コード例 #12
0
ファイル: MessageQueue.cs プロジェクト: Kvavar/Messenger
 public void Enqueue(MessageQueueItem item)
 {
     throw new NotImplementedException();
 }
コード例 #13
0
        public async Task <bool> SendMessageAsync(Message message, string sendersName, int departmentId, bool broadcastSingle = true, CancellationToken cancellationToken = default(CancellationToken))
        {
            if (broadcastSingle)
            {
                foreach (var recip in message.GetRecipients())
                {
                    var m = new Message();
                    m.Subject         = message.Subject;
                    m.Body            = message.Body;
                    m.SendingUserId   = message.SendingUserId;
                    m.ReceivingUserId = recip;
                    m.SentOn          = message.SentOn;

                    var savedMessage = await SaveMessageAsync(m, cancellationToken);

                    var mqi = new MessageQueueItem();
                    mqi.Message = savedMessage;

                    var users = new List <string>();

                    if (!String.IsNullOrWhiteSpace(mqi.Message.ReceivingUserId))
                    {
                        users.Add(mqi.Message.ReceivingUserId);
                    }

                    if (!String.IsNullOrWhiteSpace(mqi.Message.SendingUserId))
                    {
                        users.Add(mqi.Message.SendingUserId);
                    }

                    mqi.Profiles = await _userProfileService.GetSelectedUserProfilesAsync(users);

                    mqi.DepartmentId = departmentId;

                    await _queueService.EnqueueMessageBroadcastAsync(mqi, cancellationToken);
                }
            }
            else
            {
                var mqi = new MessageQueueItem();
                mqi.Message = message;

                var users = new List <string>();

                if (!String.IsNullOrWhiteSpace(mqi.Message.ReceivingUserId))
                {
                    users.Add(mqi.Message.ReceivingUserId);
                }

                users.AddRange(message.GetRecipients());

                if (!String.IsNullOrWhiteSpace(mqi.Message.SendingUserId) && mqi.Message.SendingUserId != mqi.Message.ReceivingUserId)
                {
                    users.Add(mqi.Message.SendingUserId);
                }

                mqi.Profiles = await _userProfileService.GetSelectedUserProfilesAsync(users);

                mqi.DepartmentId = departmentId;
                mqi.MessageId    = message.MessageId;

                await _queueService.EnqueueMessageBroadcastAsync(mqi, cancellationToken);
            }

            return(true);
        }
コード例 #14
0
 public CreateMessageQueueItemCommand(MessageQueueItem item)
 {
     _item    = item;
     _item.id = Guid.NewGuid();
 }
コード例 #15
0
        public static Tuple <bool, string> ProcessQueueMessage(BrokeredMessage message)
        {
            bool   success = true;
            string result  = "";

            if (message != null)
            {
                MessageQueueItem mqi = null;

                try
                {
                    var body = message.GetBody <string>();

                    if (!String.IsNullOrWhiteSpace(body))
                    {
                        try
                        {
                            mqi = ObjectSerialization.Deserialize <MessageQueueItem>(body);
                        }
                        catch (Exception ex)
                        {
                            success = false;
                            result  = "Unable to parse message body Exception: " + ex.ToString();
                            message.Complete();
                        }

                        ProcessMessageQueueItem(mqi);
                    }

                    try
                    {
                        if (success)
                        {
                            message.Complete();
                        }
                    }
                    catch (MessageLockLostException)
                    {
                    }
                }
                catch (Exception ex)
                {
                    result = ex.ToString();

                    if (mqi != null)
                    {
                        ex.Data.Add("DepartmentId", mqi.DepartmentId);

                        if (mqi.Message != null)
                        {
                            ex.Data.Add("MessageId", mqi.Message.MessageId);
                            ex.Data.Add("SendingUserId", mqi.Message.SendingUserId);
                            ex.Data.Add("RecievingUserId", mqi.Message.ReceivingUserId);
                        }
                    }

                    ex.Data.Add("MQI", JsonConvert.SerializeObject(mqi));

                    Logging.LogException(ex);
                    message.Abandon();
                }
            }

            return(new Tuple <bool, string>(success, result));
        }
コード例 #16
0
ファイル: MessageService.cs プロジェクト: mrpastewart/Core
        public void SendMessage(Message message, string sendersName, int departmentId, bool broadcastSingle = true)
        {
            if (broadcastSingle)
            {
                foreach (var recip in message.GetRecipients())
                {
                    var m = new Message();
                    m.Subject         = message.Subject;
                    m.Body            = message.Body;
                    m.SendingUserId   = message.SendingUserId;
                    m.ReceivingUserId = recip;
                    m.SentOn          = message.SentOn;

                    var savedMessage = SaveMessage(m);

                    var mqi = new MessageQueueItem();
                    mqi.Message = savedMessage;

                    var users = new List <string>();

                    if (!String.IsNullOrWhiteSpace(mqi.Message.ReceivingUserId))
                    {
                        users.Add(mqi.Message.ReceivingUserId);
                    }

                    if (!String.IsNullOrWhiteSpace(mqi.Message.SendingUserId))
                    {
                        users.Add(mqi.Message.SendingUserId);
                    }

                    mqi.Profiles     = _userProfileService.GetSelectedUserProfiles(users);
                    mqi.DepartmentId = departmentId;

                    _queueService.EnqueueMessageBroadcast(mqi);
                }
            }
            else
            {
                var mqi = new MessageQueueItem();
                mqi.Message = message;

                var users = new List <string>();

                if (!String.IsNullOrWhiteSpace(mqi.Message.ReceivingUserId))
                {
                    users.Add(mqi.Message.ReceivingUserId);
                }

                users.AddRange(message.GetRecipients());

                if (!String.IsNullOrWhiteSpace(mqi.Message.SendingUserId) && mqi.Message.SendingUserId != mqi.Message.ReceivingUserId)
                {
                    users.Add(mqi.Message.SendingUserId);
                }

                mqi.Profiles     = _userProfileService.GetSelectedUserProfiles(users);
                mqi.DepartmentId = departmentId;
                mqi.MessageId    = message.MessageId;

                _queueService.EnqueueMessageBroadcast(mqi);
            }
        }
コード例 #17
0
        public static void ProcessMessageQueueItem(MessageQueueItem mqi)
        {
            var _communicationService = Bootstrapper.GetKernel().Resolve <ICommunicationService>();

            if (mqi != null && mqi.Message == null && mqi.MessageId != 0)
            {
                var messageService = Bootstrapper.GetKernel().Resolve <IMessageService>();
                mqi.Message = messageService.GetMessageById(mqi.MessageId);
            }

            if (mqi != null && mqi.Message != null)
            {
                if (mqi.Message.MessageRecipients == null || mqi.Message.MessageRecipients.Count <= 0)
                {
                    var messageService = Bootstrapper.GetKernel().Resolve <IMessageService>();
                    mqi.Message = messageService.GetMessageById(mqi.Message.MessageId);
                }

                // If we didn't get any profiles chances are the message size was too big for Azure, get selected profiles now.
                if (mqi.Profiles == null)
                {
                    var userProfileService = Bootstrapper.GetKernel().Resolve <IUserProfileService>();

                    if (mqi.Message.MessageRecipients != null && mqi.Message.MessageRecipients.Any())
                    {
                        mqi.Profiles = userProfileService.GetSelectedUserProfiles(mqi.Message.MessageRecipients.Select(x => x.UserId).ToList());
                    }
                    else
                    {
                        mqi.Profiles = userProfileService.GetAllProfilesForDepartment(mqi.DepartmentId).Select(x => x.Value).ToList();
                    }
                }

                string name = string.Empty;
                if (!String.IsNullOrWhiteSpace(mqi.Message.SendingUserId))
                {
                    var profile = mqi.Profiles.FirstOrDefault(x => x.UserId == mqi.Message.SendingUserId);

                    if (profile != null)
                    {
                        name = profile.FullName.AsFirstNameLastName;
                    }
                }

                if (mqi.Message.ReceivingUserId != null && (mqi.Message.Recipients == null || !mqi.Message.Recipients.Any()))
                {
                    if (mqi.Profiles != null)
                    {
                        var sendingToProfile = mqi.Profiles.FirstOrDefault(x => x.UserId == mqi.Message.ReceivingUserId);

                        if (sendingToProfile != null)
                        {
                            _communicationService.SendMessage(mqi.Message, name, mqi.DepartmentTextNumber, mqi.DepartmentId, sendingToProfile);
                        }
                        else
                        {
                            var userProfileService = Bootstrapper.GetKernel().Resolve <IUserProfileService>();
                            var sender             = userProfileService.GetProfileByUserId(mqi.Message.SendingUserId);

                            if (sender != null)
                            {
                                name = sender.FullName.AsFirstNameLastName;
                            }
                        }
                    }
                }
                else if (mqi.Message.MessageRecipients != null && mqi.Message.MessageRecipients.Any())
                {
                    foreach (var recipient in mqi.Message.MessageRecipients)
                    {
                        var sendingToProfile = mqi.Profiles.FirstOrDefault(x => x.UserId == recipient.UserId);
                        mqi.Message.ReceivingUserId = recipient.UserId;

                        if (sendingToProfile != null)
                        {
                            _communicationService.SendMessage(mqi.Message, name, mqi.DepartmentTextNumber, mqi.DepartmentId, sendingToProfile);
                        }
                    }
                }
            }

            _communicationService = null;
        }
コード例 #18
0
        private async Task StartMonitoring()
        {
            if (SystemBehaviorConfig.ServiceBusType == ServiceBusTypes.Rabbit)
            {
                var callQueueReceivedConsumer = new EventingBasicConsumer(_channel);
                callQueueReceivedConsumer.Received += async(model, ea) =>
                {
                    if (ea != null && ea.Body.Length > 0)
                    {
                        CallQueueItem cqi = null;
                        try
                        {
                            var body    = ea.Body;
                            var message = Encoding.UTF8.GetString(body.ToArray());
                            cqi = ObjectSerialization.Deserialize <CallQueueItem>(message);
                        }
                        catch (Exception ex)
                        {
                            _channel.BasicNack(ea.DeliveryTag, false, false);
                            Logging.LogException(ex, Encoding.UTF8.GetString(ea.Body.ToArray()));
                        }

                        try
                        {
                            if (cqi != null)
                            {
                                if (CallQueueReceived != null)
                                {
                                    await CallQueueReceived.Invoke(cqi);

                                    _channel.BasicAck(ea.DeliveryTag, false);
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            Logging.LogException(ex);
                            if (RetryQueueItem(ea, ex))
                            {
                                _channel.BasicNack(ea.DeliveryTag, false, false);
                            }
                            else
                            {
                                _channel.BasicNack(ea.DeliveryTag, false, true);
                            }
                        }
                    }
                };

                var messageQueueReceivedConsumer = new EventingBasicConsumer(_channel);
                messageQueueReceivedConsumer.Received += async(model, ea) =>
                {
                    if (ea != null && ea.Body.Length > 0)
                    {
                        MessageQueueItem mqi = null;
                        try
                        {
                            var body    = ea.Body;
                            var message = Encoding.UTF8.GetString(body.ToArray());
                            mqi = ObjectSerialization.Deserialize <MessageQueueItem>(message);
                        }
                        catch (Exception ex)
                        {
                            _channel.BasicNack(ea.DeliveryTag, false, false);
                            Logging.LogException(ex, Encoding.UTF8.GetString(ea.Body.ToArray()));
                        }

                        try
                        {
                            if (mqi != null)
                            {
                                if (MessageQueueReceived != null)
                                {
                                    await MessageQueueReceived.Invoke(mqi);

                                    _channel.BasicAck(ea.DeliveryTag, false);
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            Logging.LogException(ex);
                            if (RetryQueueItem(ea, ex))
                            {
                                _channel.BasicAck(ea.DeliveryTag, false);
                            }
                            else
                            {
                                _channel.BasicNack(ea.DeliveryTag, false, true);
                            }
                        }
                    }
                };

                var distributionListQueueReceivedConsumer = new EventingBasicConsumer(_channel);
                distributionListQueueReceivedConsumer.Received += async(model, ea) =>
                {
                    if (ea != null && ea.Body.Length > 0)
                    {
                        DistributionListQueueItem dlqi = null;
                        try
                        {
                            var body    = ea.Body;
                            var message = Encoding.UTF8.GetString(body.ToArray());
                            dlqi = ObjectSerialization.Deserialize <DistributionListQueueItem>(message);
                        }
                        catch (Exception ex)
                        {
                            _channel.BasicNack(ea.DeliveryTag, false, false);
                            Logging.LogException(ex, Encoding.UTF8.GetString(ea.Body.ToArray()));
                        }

                        try
                        {
                            if (dlqi != null)
                            {
                                if (DistributionListQueueReceived != null)
                                {
                                    await DistributionListQueueReceived.Invoke(dlqi);

                                    _channel.BasicAck(ea.DeliveryTag, false);
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            Logging.LogException(ex);
                            if (RetryQueueItem(ea, ex))
                            {
                                _channel.BasicAck(ea.DeliveryTag, false);
                            }
                            else
                            {
                                _channel.BasicNack(ea.DeliveryTag, false, true);
                            }
                        }
                    }
                };

                var notificationQueueReceivedConsumer = new EventingBasicConsumer(_channel);
                notificationQueueReceivedConsumer.Received += async(model, ea) =>
                {
                    if (ea != null && ea.Body.Length > 0)
                    {
                        NotificationItem ni = null;
                        try
                        {
                            var body    = ea.Body;
                            var message = Encoding.UTF8.GetString(body.ToArray());
                            ni = ObjectSerialization.Deserialize <NotificationItem>(message);
                        }
                        catch (Exception ex)
                        {
                            _channel.BasicNack(ea.DeliveryTag, false, false);
                            Logging.LogException(ex, Encoding.UTF8.GetString(ea.Body.ToArray()));
                        }

                        try
                        {
                            if (ni != null)
                            {
                                if (NotificationQueueReceived != null)
                                {
                                    await NotificationQueueReceived.Invoke(ni);

                                    _channel.BasicAck(ea.DeliveryTag, false);
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            Logging.LogException(ex);
                            if (RetryQueueItem(ea, ex))
                            {
                                _channel.BasicAck(ea.DeliveryTag, false);
                            }
                            else
                            {
                                _channel.BasicNack(ea.DeliveryTag, false, true);
                            }
                        }
                    }
                };

                var shiftNotificationQueueReceivedConsumer = new EventingBasicConsumer(_channel);
                shiftNotificationQueueReceivedConsumer.Received += async(model, ea) =>
                {
                    if (ea != null && ea.Body.Length > 0)
                    {
                        ShiftQueueItem sqi = null;
                        try
                        {
                            var body    = ea.Body;
                            var message = Encoding.UTF8.GetString(body.ToArray());
                            sqi = ObjectSerialization.Deserialize <ShiftQueueItem>(message);
                        }
                        catch (Exception ex)
                        {
                            _channel.BasicNack(ea.DeliveryTag, false, false);
                            Logging.LogException(ex, Encoding.UTF8.GetString(ea.Body.ToArray()));
                        }

                        try
                        {
                            if (sqi != null)
                            {
                                if (ShiftNotificationQueueReceived != null)
                                {
                                    await ShiftNotificationQueueReceived.Invoke(sqi);

                                    _channel.BasicAck(ea.DeliveryTag, false);
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            Logging.LogException(ex);
                            if (RetryQueueItem(ea, ex))
                            {
                                _channel.BasicAck(ea.DeliveryTag, false);
                            }
                            else
                            {
                                _channel.BasicNack(ea.DeliveryTag, false, true);
                            }
                        }
                    }
                };

                var cqrsEventQueueReceivedConsumer = new EventingBasicConsumer(_channel);
                cqrsEventQueueReceivedConsumer.Received += async(model, ea) =>
                {
                    if (ea != null && ea.Body.Length > 0)
                    {
                        CqrsEvent cqrs = null;
                        try
                        {
                            var body    = ea.Body;
                            var message = Encoding.UTF8.GetString(body.ToArray());
                            cqrs = ObjectSerialization.Deserialize <CqrsEvent>(message);
                        }
                        catch (Exception ex)
                        {
                            _channel.BasicNack(ea.DeliveryTag, false, false);
                            Logging.LogException(ex, Encoding.UTF8.GetString(ea.Body.ToArray()));
                        }

                        try
                        {
                            if (cqrs != null)
                            {
                                if (CqrsEventQueueReceived != null)
                                {
                                    await CqrsEventQueueReceived.Invoke(cqrs);

                                    _channel.BasicAck(ea.DeliveryTag, false);
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            Logging.LogException(ex);
                            if (RetryQueueItem(ea, ex))
                            {
                                _channel.BasicAck(ea.DeliveryTag, false);
                            }
                            else
                            {
                                _channel.BasicNack(ea.DeliveryTag, false, true);
                            }
                        }
                    }
                };

                var paymentEventQueueReceivedConsumer = new EventingBasicConsumer(_channel);
                paymentEventQueueReceivedConsumer.Received += async(model, ea) =>
                {
                    if (ea != null && ea.Body.Length > 0)
                    {
                        CqrsEvent cqrs = null;
                        try
                        {
                            var body    = ea.Body;
                            var message = Encoding.UTF8.GetString(body.ToArray());
                            cqrs = ObjectSerialization.Deserialize <CqrsEvent>(message);
                        }
                        catch (Exception ex)
                        {
                            _channel.BasicNack(ea.DeliveryTag, false, false);
                            Logging.LogException(ex, Encoding.UTF8.GetString(ea.Body.ToArray()));
                        }

                        try
                        {
                            if (cqrs != null)
                            {
                                if (PaymentEventQueueReceived != null)
                                {
                                    await PaymentEventQueueReceived.Invoke(cqrs);

                                    _channel.BasicAck(ea.DeliveryTag, false);
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            Logging.LogException(ex);
                            if (RetryQueueItem(ea, ex))
                            {
                                _channel.BasicAck(ea.DeliveryTag, false);
                            }
                            else
                            {
                                _channel.BasicNack(ea.DeliveryTag, false, true);
                            }
                        }
                    }
                };


                String callQueueReceivedConsumerTag = _channel.BasicConsume(
                    queue: SetQueueNameForEnv(ServiceBusConfig.CallBroadcastQueueName),
                    autoAck: false,
                    consumer: callQueueReceivedConsumer);

                String messageQueueReceivedConsumerTag = _channel.BasicConsume(
                    queue: SetQueueNameForEnv(ServiceBusConfig.MessageBroadcastQueueName),
                    autoAck: false,
                    consumer: messageQueueReceivedConsumer);

                String distributionListQueueReceivedConsumerTag = _channel.BasicConsume(
                    queue: SetQueueNameForEnv(ServiceBusConfig.EmailBroadcastQueueName),
                    autoAck: false,
                    consumer: distributionListQueueReceivedConsumer);

                String notificationQueueReceivedConsumerTag = _channel.BasicConsume(
                    queue: SetQueueNameForEnv(ServiceBusConfig.NotificaitonBroadcastQueueName),
                    autoAck: false,
                    consumer: notificationQueueReceivedConsumer);

                String shiftNotificationQueueReceivedConsumerTag = _channel.BasicConsume(
                    queue: SetQueueNameForEnv(ServiceBusConfig.ShiftNotificationsQueueName),
                    autoAck: false,
                    consumer: shiftNotificationQueueReceivedConsumer);

                String cqrsEventQueueReceivedConsumerTag = _channel.BasicConsume(
                    queue: SetQueueNameForEnv(ServiceBusConfig.SystemQueueName),
                    autoAck: false,
                    consumer: cqrsEventQueueReceivedConsumer);

                String paymentEventQueueReceivedConsumerTag = _channel.BasicConsume(
                    queue: SetQueueNameForEnv(ServiceBusConfig.PaymentQueueName),
                    autoAck: false,
                    consumer: paymentEventQueueReceivedConsumer);
            }
        }
コード例 #19
0
        public async Task <Tuple <bool, string> > ProcessQueueMessage(Message message, CancellationToken token)
        {
            bool   success = true;
            string result  = "";

            if (message != null)
            {
                MessageQueueItem mqi = null;

                try
                {
                    var body = message.GetBody <string>();

                    if (!String.IsNullOrWhiteSpace(body))
                    {
                        try
                        {
                            mqi = ObjectSerialization.Deserialize <MessageQueueItem>(body);
                        }
                        catch (Exception ex)
                        {
                            success = false;
                            result  = "Unable to parse message body Exception: " + ex.ToString();
                            //message.Complete();
                            await _client.CompleteAsync(message.SystemProperties.LockToken);
                        }

                        await ProcessMessageQueueItem(mqi);
                    }

                    try
                    {
                        if (success)
                        {
                            await _client.CompleteAsync(message.SystemProperties.LockToken);
                        }
                        //message.Complete();
                    }
                    catch (MessageLockLostException)
                    {
                    }
                }
                catch (Exception ex)
                {
                    result = ex.ToString();

                    if (mqi != null)
                    {
                        ex.Data.Add("DepartmentId", mqi.DepartmentId);

                        if (mqi.Message != null)
                        {
                            ex.Data.Add("MessageId", mqi.Message.MessageId);
                            ex.Data.Add("SendingUserId", mqi.Message.SendingUserId);
                            ex.Data.Add("RecievingUserId", mqi.Message.ReceivingUserId);
                        }
                    }

                    ex.Data.Add("MQI", JsonConvert.SerializeObject(mqi));

                    Logging.LogException(ex);
                    await _client.AbandonAsync(message.SystemProperties.LockToken);

                    //message.Abandon();
                }
            }

            return(new Tuple <bool, string>(success, result));
        }