예제 #1
0
        private void BatchSendMessage(object dataBuffer)
        {
            IDataBuffer buffer = dataBuffer as IDataBuffer;

            if (buffer != null && buffer.Count > 0)
            {
                List <PushMessage> list = buffer.GetList <PushMessage>();
                try
                {
                    Process.Info("消息通知批量发送接口", "BatchSendMessage", "", string.Format("批次【{0}】,数量【{1}】", ++callCount, list.Count), "");
                    JinRi.Notify.ServiceAgent.SenderSendServiceSOA.SendServiceClient client = new JinRi.Notify.ServiceAgent.SenderSendServiceSOA.SendServiceClient();
                    PushMessageResult result = client.ReceiveList(list.ToArray());
                    Process.Info("消息通知批量发送接口_返回", "BatchSendMessage", "", result.Success + "", "");
                }
                catch (Exception ex)
                {
                    //如果推送异常,去掉标示的推送缓存
                    foreach (PushMessage message in list)
                    {
                        string cacheKey = string.Format(CacheKeys.PushMessageToSender_Arg2, message.PushId, message.PushCount);
                        DistributedCache.Delete(cacheKey);
                    }
                    Process.Error("消息通知批量发送接口", "BatchSendMessage", "", "异步发送推送消息到消息通知接口出现异常:" + ex.GetString(), "Error");
                }
            }
        }
예제 #2
0
        public void SendPushMessage(PushMessage message, bool isWriteToBuffer, out bool isSended)
        {
            isSended = IsSending(message);
            if (!isSended)
            {
                if (isWriteToBuffer)
                {
                    _sendMessagePool.Write(message);
                }
                else
                {
                    while (m_sendMessageCDE.CurrentCount > 1000)
                    {
                        Process.Info(message.PushId, "消息通知单条发送接口", "SendPushMessage", "", "m_sendMessageCDE:" + m_sendMessageCDE.CurrentCount.ToString(), "阻塞");
                        Thread.Sleep(100);
                    }

                    ThreadPool.QueueUserWorkItem((o) =>
                    {
                        try
                        {
                            Process.Info(message.PushId, "消息通知单条发送接口", "SendPushMessage", "", string.Format("批次【{0}】,数量【{1}】", ++callCount, 1), "");
                            m_sendMessageCDE.TryAddCount(1);
                            m_client.Receive(message);
                            if (m_sendMessageCDE.CurrentCount > 0)
                            {
                                m_sendMessageCDE.TryAddCount(-1);
                            }
                            Process.Info(message.PushId, "消息通知单条发送接口_返回", "SendPushMessage", "", string.Format("批次【{0}】,数量【{1}】", ++callCount, 1), "");
                        }
                        catch (Exception ex)
                        {
                            if (m_sendMessageCDE.CurrentCount > 0)
                            {
                                m_sendMessageCDE.TryAddCount(-1);
                            }
                            if (m_client.State == CommunicationState.Closed ||
                                m_client.State == CommunicationState.Faulted)
                            {
                                m_client = new ServiceAgent.SenderSendServiceSOA.SendServiceClient();
                            }
                            //如果推送异常,去掉标示的推送缓存
                            string cacheKey = string.Format(CacheKeys.PushMessageToSender_Arg2, message.PushId, message.PushCount);
                            DistributedCache.Delete(cacheKey);
                            Process.Error(message.PushId, "消息通知单条发送接口", "SendPushMessage", "", "异步发送推送消息到消息通知接口出现异常:" + ex.GetString(), "Error");
                        }
                    });
                }
            }
        }
예제 #3
0
        private void RepeatUpdatePushMessage(object dataBuffer)
        {
            IDataBuffer buffer = dataBuffer as IDataBuffer;

            if (buffer != null && buffer.Count > 0)
            {
                List <PushMessageModel> list = buffer.GetList <PushMessageModel>();
                foreach (PushMessageModel message in list)
                {
                    int  count = m_repeatUpdateTimes[message.PushId];
                    bool ret   = _pushMessageBus.Edit(message);
                    if (!ret)
                    {
                        if (count < 5)
                        {
                            m_repeatUpdateTimes[message.PushId] = count + 1;
                            _repeatUpdatePool.Write(message);
                        }
                        else
                        {
                            //如果是待推送状态,怎去掉缓存,以便进行下一次推送
                            if (message.PushStatus == PushStatusEnum.UnPush)
                            {
                                string cacheKey = string.Format(CacheKeys.SendToMessageHandler_Arg2, message.PushId, message.PushCount - 1);
                                DistributedCache.Delete(cacheKey);
                            }
                            lock (m_repeatUpdateTimesLockObj)
                            {
                                m_repeatUpdateTimes.Remove(message.PushId);
                            }
                        }
                    }
                    else
                    {
                        lock (m_repeatUpdateTimesLockObj)
                        {
                            m_repeatUpdateTimes.Remove(message.PushId);
                        }
                    }
                    Process.Debug(message.PushId, "消息补偿更新推送记录", "RepeatUpdatePushMessage", message.PushId, string.Format("更新次数:【{0}】,更新结果:【{1}】", count + 1, ret), "");
                    Thread.Sleep(100);
                }
            }
        }
        /// <summary>
        /// 指令清理缓存
        /// </summary>
        /// <param name="task"></param>
        private static void ClearCache(TaskMessage task)
        {
            if (task == null)
            {
                return;
            }
            string key = task.TaskParam;

            if (!string.IsNullOrEmpty(key))
            {
                if (DataCache.KeyExists(key) != null)     //HttpRuntime缓存
                {
                    DataCache.Delete(key);
                }
                if (DistributedCache.KeyExists(key) != null)    //分布式缓存
                {
                    DistributedCache.Delete(key);
                }
            }
        }
예제 #5
0
        private void CallbackInternal(PushMessageResult result)
        {
            Check.IsNull(result, "CallbackInternal的参数Obj");
            PushMessageModel model = new PushMessageModel();

            Check.IsNull(result.PushId, "PushMessageResult.PushId");
            PushMessage pushMsg = result.ReferObject as PushMessage;

            Check.IsNull(pushMsg, "PushId查找到的PushMessageModel对象");
            model.PushCount           = pushMsg.PushCount;
            model.SettingId           = pushMsg.SettingId;
            RequestProfile.RequestKey = result.PushId + "_" + pushMsg.PushCount.ToString();
            RequestProfile.MessageKey = result.PushId;

            switch (result.PushStatus)
            {
            case PushResultEnum.Abort:
                model.PushId     = result.PushId;
                model.PushStatus = PushStatusEnum.Abort;
                model.PushCount++;
                model.Memo = string.Format("Abort:{0},{1:yyyy-MM-dd HH:mm:ss};{2}", result.ErrMsg, DateTime.Now, Environment.NewLine);
                break;

            case PushResultEnum.Success:
                model.PushId     = result.PushId;
                model.PushStatus = PushStatusEnum.Pushed;
                model.PushCount++;
                model.Memo = string.Format("Success:{0},{1:yyyy-MM-dd HH:mm:ss};{2}", result.ErrMsg, DateTime.Now, Environment.NewLine);
                break;

            case PushResultEnum.Failed:
                model.PushId     = result.PushId;
                model.PushStatus = PushStatusEnum.Failed;
                bool isPushNext = false;
                //model.PushCount == 3
                //第四次推送的返回
                model.PushCount++;
                model.NextPushTime = ComputePushTimeBusiness.ComputeNextPushTime(model, out isPushNext);
                if (isPushNext)
                {
                    model.PushStatus = PushStatusEnum.UnPush;
                }
                model.Memo = string.Format("Failed:{0},B-{1:yyyy-MM-dd HH:mm:ss},N-{2:yyyy-MM-dd HH:mm:ss};{3}", result.ErrMsg, DateTime.Now, model.NextPushTime, Environment.NewLine);
                break;

            case PushResultEnum.Pushing:
                model.PushId     = result.PushId;
                model.PushStatus = PushStatusEnum.Pushing;
                model.Memo       = string.Format("Pushing:{0},{1:yyyy-MM-dd HH:mm:ss};{2}", result.ErrMsg, DateTime.Now, Environment.NewLine);
                break;

            default:
                break;
            }
            if (!string.IsNullOrWhiteSpace(model.PushId) &&
                (model.PushStatus &
                 (PushStatusEnum.Abort |
                  PushStatusEnum.Pushed |
                  PushStatusEnum.Failed |
                  PushStatusEnum.UnPush |
                  PushStatusEnum.Pushing)) == model.PushStatus)
            {
                model.LastModifyTime = DateTime.Now;
                bool ret = _pushMessageBus.Edit(model);
                if (!ret)
                {
                    lock (m_repeatUpdateTimesLockObj)
                    {
                        //进入补偿更新队列
                        m_repeatUpdateTimes[model.PushId] = 1;
                    }
                    _repeatUpdatePool.Write(model);
                }
                else
                {
                    if (model.PushStatus == PushStatusEnum.UnPush)
                    {
                        string cacheKey = string.Format(CacheKeys.SendToMessageHandler_Arg2, model.PushId, model.PushCount - 1);
                        DistributedCache.Delete(cacheKey);
                    }
                }
                Process.Debug(result.PushId, "消息推送记录", "Callback", result.PushId, string.Format("推送状态:【{0}】,推送结果:【{1}】,更新结果:【{2}】", result.PushStatus.ToString(), result.ErrMsg, ret), "");
            }
        }