public void CreateFlowNodeInstance() { var messageContainer = new MessageContainer("CreateFlowNodeInstance"); var instances = _flowRepository.GetInstanceFlow(); messageContainer.Debug("共需处理CreateFlowNodeInstance的记录条数:{0}", instances.Count); instances.ToList().ForEach(instance => { try { CreateSingleFlowNodeInstance(instance, messageContainer); } catch (Exception exception) { messageContainer.Error("在处理CreateFlowNodeInstance时id={0}时出错ex={1}", instance.Id, exception); } }); messageContainer.Log4Net(); }
public void DealFlow() { var messageContainer = new MessageContainer("DealFlow"); var flows = _flowRepository.GetUnFinisheds(); messageContainer.Debug("共需处理DealFlow的记录条数:{0}", flows.Count); flows.ToList().ForEach(flow => { try { DealSingleFlowNode(flow, messageContainer); } catch (Exception exception) { messageContainer.Error("在处理DealFlow时id={0}时出错ex={1}", flow.Id, exception); } }); messageContainer.Log4Net(); }
public void DealFlowNodeFlowTo() { var messageContainer = new MessageContainer("DealFlowNodeFlowTo"); var flowNodeInstances = _flowNodeInstanceRepository.GetUnDeals(); messageContainer.Debug("共需处理DealFlowNodeFlowTo的记录条数:{0}", flowNodeInstances.Count); flowNodeInstances.ToList().ForEach(flowNodeInstance => { try { DealSingleFlowNodeFlowTo(flowNodeInstance, messageContainer); } catch (Exception exception) { messageContainer.Error("在处理DealFlowNodeFlowTo时id={0}时出错ex={1}", flowNodeInstance.Id, exception); } }); messageContainer.Log4Net(); }
private void DealSingleFlowNode(Flow flow, MessageContainer messageContainer) { if (!flow.IsCompleted()) return; flow.Finished(); _flowRepository.Save(flow); }
private void DealSingleFlowNodeFlowTo(FlowNodeInstance flowNodeInstance, MessageContainer messageContainer) { var trans = TransactionManager.BeginTransaction(); try { //判断流程对象是否ActionCompleted if (!flowNodeInstance.TriggerActionCompletedRule()) return; var nextNode = flowNodeInstance.GetNextNodeTypeWhenActioned(); flowNodeInstance.Finished(); flowNodeInstance.FlowNodeInstanceTasks.ToList().ForEach(task => { if (task.RecordDescription.IsUpdated) { _flowNodeInstanceTaskRepository.Save(task); } }); _flowNodeInstanceRepository.Save(flowNodeInstance); //如果不存在下一个节点表示流程完成 if (nextNode == null) { Finished(flowNodeInstance.BelongsFlow); trans.Commit(); return; } if (nextNode.IsServerNode) DealServerNodeLoop(flowNodeInstance.BelongsFlow, nextNode, messageContainer); else DealClientNode(flowNodeInstance.BelongsFlow, nextNode, messageContainer); trans.Commit(); } catch (Exception) { trans.Rollback(); throw; } }
private void DealServerNodeLoop(Flow flow, FlowNode targetFlowNode, MessageContainer messageContainer) { var nodes = new Stack<FlowNodeInstance>(); var node = DealServerNode(flow, targetFlowNode, messageContainer); if (node == null) { Finished(flow); return; } nodes.Push(node); while (nodes.Any()) { //这里循环处理,主要是为了使服务器节点无延迟的即时处理,因为服务器节点仅依赖流程变量与客户无关 //而客户节点肯定是依赖于客户的操作来处理 var tempFlowNodeInstance = nodes.Pop(); if (!tempFlowNodeInstance.BelongsFlowNode.IsServerNode) { DealClientNode(flow, tempFlowNodeInstance.GetNextNodeTypeWhenActioned(), messageContainer); return; } var returnNodeInstanace = DealServerNode(flow, tempFlowNodeInstance.GetNextNodeTypeWhenActioned(), messageContainer); //服务端与客户端的区别,服务端的处理完之后就已经Finished了,所以直接接着处理下一个节点, //如果是客户端则需要生成客户端任务,服务端则继续执行服务端的处理 if (returnNodeInstanace == null) { Finished(flow); return; } nodes.Push(returnNodeInstanace); } }
private FlowNodeInstance DealServerNode(Flow flow, FlowNode targetFlowNode, MessageContainer messageContainer) { if (targetFlowNode == null) return null; //生成服务端节点实例 var newFlowInstanceOfServer = new FlowNodeInstance(); newFlowInstanceOfServer.BelongsFlow = flow; newFlowInstanceOfServer.BelongsFlowNode = targetFlowNode; newFlowInstanceOfServer.TimeOfFinished = DateTime.Now; newFlowInstanceOfServer.Execute(); newFlowInstanceOfServer.InstanceStatus = InstanceStatus.Finished; _flowNodeInstanceRepository.Save(newFlowInstanceOfServer); return newFlowInstanceOfServer; }
private FlowNodeInstance DealClientNode(Flow flow, FlowNode targetFlowNode, MessageContainer messageContainer) { //创建新节点实例 var newFlowInstance = new FlowNodeInstance(); newFlowInstance.BelongsFlow = flow; newFlowInstance.BelongsFlowNode = targetFlowNode; var newTasks = newFlowInstance.BuilderTasksAndReturnNewTasks(); _flowNodeInstanceRepository.Save(newFlowInstance); newTasks.ToList().ForEach(task => _flowNodeInstanceTaskRepository.Save(task)); return newFlowInstance; }
private void CreateSingleFlowNodeInstance(Flow flow, MessageContainer messageContainer) { var trans = TransactionManager.BeginTransaction(); try { var flowNode = flow.FlowType.GetFirstNode(); if (flowNode == null) throw new ApplicationException("流程不存在任务节点,流程 id=" + flow.Id); if (flowNode.IsServerNode) DealServerNodeLoop(flow, flowNode, messageContainer); else DealClientNode(flow, flowNode, messageContainer); flow.FlowStatus = FlowStatus.Start; flow.RecordDescription.DateOfLastestModify = DateTime.Now; _flowRepository.Save(flow); trans.Commit(); } catch (Exception) { trans.Rollback(); throw; } }
/// <summary> /// 合并其它消息容器 /// </summary> /// <param name="messageContainer"></param> /// <param name="alias"></param> public void Merge(MessageContainer messageContainer, string alias = "") { alias = string.IsNullOrEmpty(alias) ? messageContainer.Name : alias; if (alias == messageContainer.Name) throw new ArgumentException("并入的MessageContainer.Name与当前容器重名,请使用别名来区分"); Messages = messageContainer.Messages.OrderBy(o => o.InsertTime).ToList(); }