void ReloadOption() { var old = ServiceMap.Keys.ToArray(); ServiceMap.Clear(); try { var section = ConfigurationHelper.Root.GetSection("MessageMVC:ParallelService"); if (section != null && section.Exists()) { foreach (var ch in section.GetChildren()) { ServiceMap.TryAdd(ch.Key, ch.Value.Split(new char[] { ',' }, System.StringSplitOptions.RemoveEmptyEntries)); } } } catch (System.Exception ex) { logger.Exception(ex); } foreach (var o in ServiceMap.Keys) { if (!old.Contains(o)) { MessagePoster.RegistPoster(this, o); } } }
/// <summary> /// 生产消息 /// </summary> /// <param name="message">消息</param> /// <returns></returns> async Task <IMessageResult> IMessagePoster.Post(IInlineMessage message) { if (!ZeroAppOption.Instance.IsAlive) { message.State = MessageState.Cancel; return(null); } if (!ServiceMap.TryGetValue(message.Service, out var map) || map == null || map.Length == 0) { return(new MessageResult { ID = message.ID, Trace = message.TraceInfo, State = MessageState.Cancel }); } try { ZeroAppOption.Instance.BeginRequest(); var tasks = new Task <IInlineMessage> [map.Length]; for (int i = 0; i < map.Length; i++) { string service = map[i]; var clone = message.Clone(); clone.Service = service; tasks[i] = MessagePoster.Post(clone); } await Task.WhenAll(tasks); var results = new List <IMessageResult>(); foreach (var task in tasks) { if (task.Result.State == MessageState.Success) { results.Add(task.Result.ToMessageResult(true)); } else { results.Add(new MessageResult { ID = message.ID, Trace = message.TraceInfo, State = task.Result.State }); } } return(new MessageResult { ID = message.ID, Trace = message.TraceInfo, State = MessageState.Success, ResultData = results }); } finally { ZeroAppOption.Instance.EndRequest(); } }