/// <summary> /// 从Json中获取对象 /// </summary> /// <param name="packet">消息报文</param> /// <param name="jsonSerilizer">json序列化对象,可以使用 Never.JsonNet.JsonNetSerializer对象 </param> /// <returns></returns> public static T FromJson <T>(MessagePacket packet, Never.Serialization.IJsonSerializer jsonSerilizer) { if (packet == null) { return(default(T)); } if (string.IsNullOrEmpty(packet.ContentType) || string.IsNullOrEmpty(packet.Body)) { return(default(T)); } var type = Type.GetType(packet.ContentType); if (type == null) { return(default(T)); } return(jsonSerilizer.Deserialize <T>(packet.Body)); }
/// <summary> /// 发送一条消息 /// </summary> /// <param name="message">消息</param> public void Send(MessagePacket message) { this.Send(message, null); }
/// <summary> /// 开始工作 /// </summary> private bool ExecuteMeanwhile(ITaskschedStrategy strategy, TaskschedNode task, ExecutingNode[] nodes, ExecutingNode node, IList<KeyValueTuple<IWorkStep, string>> worksteps, WorkContext context, IWorkStepMessage preMsg) { var finishNodes = new List<ExecutingNode>(nodes.Count()); var messages = new MeanwhileWorkStepMessage(); var msgs = new List<IWorkStepMessage>(nodes.Count()); messages.TaskId = task.TaskId; IWorkStepMessage msg = null; var timeSpan = TimeSpan.Zero; Exception lastException = null; foreach (var workstep in worksteps) { try { msg = workstep.Key.Execute(context, preMsg); if (msg != null) { task.AttachState = msg.AttachState; } } catch (Exception ex) { lastException = ex; node.ExecutingMessage = ex.GetInnerException().GetFullMessage(); node.FailTimes++; timeSpan = strategy.NextTime(task, node, ex); } if (msg is EmptyAndAbortedWorkStepMessage) { foreach (var t in nodes.Where(t => t.OrderNo >= node.OrderNo)) { if (t.OrderNo == 0 || t.OrderNo == nodes.Length - 1) { continue; } t.ExecutingMessage = string.Format("当前步骤{0}执行了中断行为,消息结果为:{1}", node.OrderNo, ((EmptyAndAbortedWorkStepMessage)msg).Message); finishNodes.Add(t); } this.executingRepository.Abort(task, finishNodes.ToArray()); if (this.MessagePublisher != null) { try { this.MessagePublisher.PublishMessageAsync(msg); } catch { } } return false; } if (msg is EmptyButWaitingWorkStepMessage) { var span = strategy.NextWorkTimeOnMessageIsWaiting(task, node); node.ExecutingMessage = ((EmptyButWaitingWorkStepMessage)msg).Message; task.NextTime = task.NextTime.HasValue ? task.NextTime.Value.Add(span) : DateTime.Now.Add(span); this.executingRepository.NextWork(task, node); if (this.MessagePublisher != null) { try { this.MessagePublisher.PublishMessageAsync(msg); } catch { } } return false; } if (lastException != null && this.MessagePublisher != null) { try { this.MessagePublisher.PublishMessageAsync(new ExecutingErrorWorkStepMessage() { TaskId = task.TaskId, CommandType = task.CommandType, UserSign = task.UserSign, Exception = lastException, PushMessage = task.PushMessage }); } finally { } } if (timeSpan != TimeSpan.Zero) { task.NextTime = task.NextTime.HasValue ? task.NextTime.Value.Add(timeSpan) : DateTime.Now.Add(timeSpan); this.executingRepository.Exception(task, node); return false; } if (msg == null) { timeSpan = strategy.NextWorkTimeOnMessageIsNull(task, node, node.WaitTimes + 1); if (timeSpan != TimeSpan.Zero) { node.WaitTimes++; task.NextTime = task.NextTime.HasValue ? task.NextTime.Value.Add(timeSpan) : DateTime.Now.Add(timeSpan); this.executingRepository.NextWork(task, node); return false; } foreach (var t in nodes.Where(t => t.OrderNo >= node.OrderNo)) { if (t.OrderNo == 0 || t.OrderNo == nodes.Length - 1) { continue; } t.ExecutingMessage = string.Format("当前步骤{0}协同方式为全部,但工作实例{1}返回空消息,执行中断", node.OrderNo, workstep.Value); finishNodes.Add(t); } this.executingRepository.Abort(task, finishNodes.ToArray()); return false; } if (msg.TaskId == Guid.Empty) { this.SetMessageTaskId(msg, task); } msgs.Add(msg); messages.Messages.Add(this.engine.JsonSerializer.Serialize(new Never.Messages.MessagePacket() { ContentType = Never.Messages.MessagePacket.GetContentType(msg), Body = this.engine.JsonSerializer.Serialize(msg) })); } var mulitePacket = new Never.Messages.MessagePacket() { ContentType = Never.Messages.MessagePacket.GetContentType(messages), Body = this.engine.JsonSerializer.Serialize(messages), }; context.StepClear(); node.ResultMessage = this.engine.JsonSerializer.Serialize(mulitePacket); node.FinishTime = DateTime.Now; task.ProcessPercent = task.StepCount <= 0 ? 100m : ((100 * (task.NextStep) / ((decimal)task.StepCount)).FormatR(2)); if (task.NextStep == task.StepCount) { task.FinishTime = DateTime.Now; this.executingRepository.AllDone(task, node); } else { task.NextStep = task.NextStep + 1; this.executingRepository.Done(task, node); } if (this.MessagePublisher != null) { try { foreach (var m in msgs) { this.MessagePublisher.PublishMessageAsync(m); } } catch { } } return true; }
/// <summary> /// 从Json中获取对象 /// </summary> /// <param name="packet">消息报文</param> /// <returns></returns> public static T FromJson <T>(MessagePacket packet) { return(FromJson <T>(packet, Never.Serialization.SerializeEnvironment.JsonSerializer)); }