Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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();
            }
        }