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"); } } }
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"); } }); } } }
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); } } }
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), ""); } }