Пример #1
0
        public static void FlushPendingActivityEvent(int activityId, out int processedEvents)
        {
            if (activityId == 0)
            {
                processedEvents = 0;
                return;
            }

            processedEvents = 0;

            int    eId         = 0;
            int    eActivityId = 0;
            string eDataId     = "";

            using (Transaction trans = DatabaseAccess.ForSystemDatabase.GetCommitableTransaction()) {
                using (IDataReader reader = DBRuntimePlatform.Instance.DequeueNormalEvent(trans, 1, "", activityId)) {
                    if (reader.Read())
                    {
                        eId         = reader.SafeGet <int>("Id");
                        eActivityId = reader.SafeGet <int>("Activity_Id");
                        eDataId     = reader.SafeGet <string>("Data_Id");
                    }
                }
                trans.Commit();
            }

            if (eId == 0)
            {
                // No pending event
                return;
            }

            try{
                string       url;
                int          tenantId;
                int          processId;
                ActivityKind activityKind;
                string       activityName;
                string       SSKey;
                BPMRuntime.GetActivityDataForWS(eActivityId, out processId, out activityKind, out activityName, out SSKey, out url, out tenantId);


                int timeoutInSecs = 0;
                if (Debugger.IsRunning)
                {
                    timeoutInSecs = Debugger.REQUEST_TIMEOUT_IN_SECONDS;
                }
                else
                {
                    using (Transaction trans = DatabaseAccess.ForSystemDatabase.GetCommitableTransaction()) {
                        timeoutInSecs = Settings.GetInt(Settings.Configs.Scheduler_ActivitiesTimeout, trans);
                    }
                }
                using (IActivityHandler activityHandler = ActivityHandlerFactory.Current.GetActivityHandler(url)) {
                    activityHandler.Timeout = (int)(1.2 * timeoutInSecs) * 1000;
                    activityHandler.ExecuteOnEvent(SSKey, eActivityId, processId, tenantId, eDataId, /*advanceProcess*/ true);
                }

                using (Transaction trans = DatabaseAccess.ForSystemDatabase.GetCommitableTransaction()) {
                    DBRuntimePlatform.Instance.DeleteEvent(trans, eId);
                    processedEvents = 1;
                    trans.Commit();
                }
            } catch {
                using (Transaction trans = DatabaseAccess.ForSystemDatabase.GetCommitableTransaction()) {
                    DBRuntimePlatform.Instance.RequeueEvent(trans, eId, true);
                    trans.Commit();
                }
            }
        }