public void FetchPersistQueueTest() { WfPersistQueueAdapter.Instance.ClearQueue(); WfPersistQueueAdapter.Instance.ClearArchivedQueue(); IWfProcess process = ProcessHelper.CreateSimpleProcessDescriptor().StartupProcess(); ProcessHelper.OutputExecutionTime(() => WfRuntime.PersistWorkflows(), "保存简单流程"); Assert.AreEqual(0, WfProcessCurrentAssigneeAdapter.Instance.Load(process.ID).Count); Assert.AreEqual(0, WfProcessRelativeParamsAdapter.Instance.Load(process.ID).Count); Assert.IsNull(WfProcessDimensionAdapter.Instance.Load(process.ID)); Console.WriteLine(process.ID); WfPersistQueue pq = WfPersistQueueAdapter.Instance.FetchQueueItemsAndDoOperation(1).FirstOrDefault(); Assert.IsTrue(WfProcessCurrentAssigneeAdapter.Instance.Load(pq.ProcessID).Count > 0); Assert.AreEqual(process.RelativeParams.Count, WfProcessRelativeParamsAdapter.Instance.Load(pq.ProcessID).Count); Assert.IsNull(WfPersistQueueAdapter.Instance.Load(pq.ProcessID)); WfPersistQueue pqArchieved = WfPersistQueueAdapter.Instance.LoadArchived(pq.ProcessID); Assert.IsNotNull(pqArchieved); Assert.AreEqual(pq.UpdateTag, pqArchieved.UpdateTag); WfProcessDimension pd = WfProcessDimensionAdapter.Instance.Load(pq.ProcessID); Assert.IsNotNull(pd); Console.WriteLine(pd.Data); }
public void PersistQueueBasicTest() { IWfProcess process = ProcessHelper.CreateSimpleProcessDescriptor().StartupProcess(); ProcessHelper.OutputExecutionTime(() => WfRuntime.PersistWorkflows(), "保存简单流程"); WfPersistQueue pq = WfPersistQueue.FromProcess(process); Console.WriteLine(pq.ProcessID); Assert.AreEqual(0, WfProcessCurrentAssigneeAdapter.Instance.Load(pq.ProcessID).Count); Assert.AreEqual(0, WfProcessRelativeParamsAdapter.Instance.Load(pq.ProcessID).Count); Assert.IsNull(WfProcessDimensionAdapter.Instance.Load(pq.ProcessID)); WfPersistQueueAdapter.Instance.DoQueueOperation(pq); Assert.IsTrue(WfProcessCurrentAssigneeAdapter.Instance.Load(pq.ProcessID).Count > 0); Assert.AreEqual(process.RelativeParams.Count, WfProcessRelativeParamsAdapter.Instance.Load(pq.ProcessID).Count); WfProcessDimension pd = WfProcessDimensionAdapter.Instance.Load(pq.ProcessID); Assert.IsNotNull(pd); Console.WriteLine(pd.Data); }
protected void Regen_ExecuteStep(object data) { string processID = (string)data; try { IWfProcess process = WfRuntime.GetProcessByProcessID(processID); WfPersistQueue pq = WfPersistQueue.FromProcess(process); WfPersistQueueAdapter.Instance.DoQueueOperation(pq); } catch (System.Exception ex) { string message = string.Format("生成流程{0}的数据异常: {1}", processID, ex.Message); throw new ApplicationException(message, ex); } }
public WfPersistQueue LoadArchived(string processID) { ORMappingItemCollection mappingInfo = ORMapping.GetMappingInfo(typeof(WfPersistQueue)); processID.CheckStringIsNullOrEmpty("processID"); string sql = string.Format("SELECT * FROM {0} WHERE PROCESS_ID = {1}", "WF.PERSIST_QUEUE_ARCHIEVED", TSqlBuilder.Instance.CheckUnicodeQuotationMark(processID) ); DataTable table = DbHelper.RunSqlReturnDS(sql, GetConnectionName()).Tables[0]; WfPersistQueue result = null; if (table.Rows.Count > 0) { result = new WfPersistQueue(); ORMapping.DataRowToObject(table.Rows[0], result); } return result; }
private static string GetInsertSql(WfPersistQueue pq) { ORMappingItemCollection mappingInfo = ORMapping.GetMappingInfo(pq.GetType()); string sql = string.Format("INSERT INTO {0}(PROCESS_ID, UPDATE_TAG, TENANT_CODE) SELECT INSTANCE_ID, UPDATE_TAG, TENANT_CODE FROM WF.PROCESS_INSTANCES WHERE INSTANCE_ID = {1}", mappingInfo.TableName, TSqlBuilder.Instance.CheckUnicodeQuotationMark(pq.ProcessID)); return sql; }
private static string GetUpdateSql(WfPersistQueue pq) { ORMappingItemCollection mappingInfo = ORMapping.GetMappingInfo(pq.GetType()); UpdateSqlClauseBuilder uBuilder = ORMapping.GetUpdateSqlClauseBuilder(pq, mappingInfo, "UpdateTag"); uBuilder.AppendItem("UPDATE_TAG", "WF.PROCESS_INSTANCES.UPDATE_TAG", "=", true); WhereSqlClauseBuilder wBuilder = new WhereSqlClauseBuilder(); wBuilder.AppendItem("PROCESS_ID", pq.ProcessID); wBuilder.AppendTenantCode(); string sql = string.Format("UPDATE {0} SET {1} FROM {0} INNER JOIN WF.PROCESS_INSTANCES ON INSTANCE_ID = PROCESS_ID WHERE {2}", mappingInfo.TableName, uBuilder.ToSqlString(TSqlBuilder.Instance), wBuilder.ToSqlString(TSqlBuilder.Instance)); return sql; }
private static string GetUpdatePersistQueueSql(WfPersistQueue pq) { StringBuilder sql = new StringBuilder(); //仅仅插入数据 //sql.Append(GetUpdateSql(pq)); //sql.Append(TSqlBuilder.Instance.DBStatementSeperator); //sql.Append("IF @@ROWCOUNT = 0"); //sql.Append(TSqlBuilder.Instance.DBStatementBegin); sql.Append(GetInsertSql(pq)); //sql.Append(TSqlBuilder.Instance.DBStatementEnd); return sql.ToString(); }
/// <summary> /// 执行队列项的操作,并且移动到已完成中 /// </summary> /// <param name="pq"></param> public void DoQueueOperationAndMove(WfPersistQueue pq) { using (TransactionScope scope = TransactionScopeFactory.Create()) { try { DoQueueOperation(pq); } catch (System.Exception ex) { if (ex is TransactionException || ex is DbException) throw; pq.StatusText = ex.ToString(); } MoveQueueItemToArchived(pq); scope.Complete(); } }
public void MoveQueueItemToArchived(WfPersistQueue pq) { pq.NullCheck("pq"); ORMappingItemCollection mappingInfo = ORMapping.GetMappingInfo(typeof(WfPersistQueue)); InsertSqlClauseBuilder builder = ORMapping.GetInsertSqlClauseBuilder(pq, mappingInfo); builder.AppendItem("SORT_ID", pq.SortID); builder.AppendItem("PROCESS_TIME", "GETDATE()", "=", true); StringBuilder sql = new StringBuilder(); sql.AppendFormat("DELETE {0} WHERE SORT_ID = {1}", "WF.PERSIST_QUEUE_ARCHIEVED", pq.SortID); sql.Append(TSqlBuilder.Instance.DBStatementSeperator); sql.AppendFormat("INSERT INTO {0}{1}", "WF.PERSIST_QUEUE_ARCHIEVED", builder.ToSqlString(TSqlBuilder.Instance)); sql.Append(TSqlBuilder.Instance.DBStatementSeperator); sql.AppendFormat("DELETE {0} WHERE PROCESS_ID = {1}", mappingInfo.TableName, TSqlBuilder.Instance.CheckUnicodeQuotationMark(pq.ProcessID)); DbHelper.RunSqlWithTransaction(sql.ToString(), GetConnectionName()); }
/// <summary> /// 执行一项队列操作 /// </summary> /// <param name="pq"></param> public void DoQueueOperation(WfPersistQueue pq) { pq.NullCheck("pq"); Dictionary<object, object> context = new Dictionary<object, object>(); IWfProcess process = WfRuntime.GetProcessByProcessID(pq.ProcessID); try { WfQueuePersistenceSettings.GetConfig().GetPersisters().SaveData(process, context); } finally { WfRuntime.ClearCache(); } }