Exemplo n.º 1
0
        public static int GetNextHumanActivity(HeContext heContext, Transaction tran, IEnumerable <Pair <int, ActivityKind> > nextActivities, int userId)
        {
            var humanActivitiesIds = nextActivities.Where(pair => pair.Second == ActivityKind.HumanActivity)
                                     .Select(pair => pair.First);

            if (!humanActivitiesIds.IsEmpty())
            {
                return(BPMRuntime.GetAllowedActivities(heContext, tran, humanActivitiesIds, userId).FirstIfSingleOrDefault());
            }
            return(BuiltInFunction.NullIdentifier());
        }
Exemplo n.º 2
0
 public bool SetProcessSuspension(HeContext heContext, int processId, bool suspend, out string failureMessage)
 {
     return(SafeExecuteAction(() => BPMRuntime.SuspendProcessInstance(heContext, processId, suspend), out failureMessage));
 }
Exemplo n.º 3
0
 public bool ProcessTerminate(HeContext heContext, int processId, out string failureMessage)
 {
     return(SafeExecuteAction(() => BPMRuntime.TerminateProcessInstance(heContext, this, processId), out failureMessage));
 }
Exemplo n.º 4
0
        public int ProcessLaunch(HeContext heContext, int parentActivityId, int parentProcessId, List <Pair <string, object> > inputs, out List <Pair <int, ActivityKind> > nextActIds)
        {
            nextActIds = new List <Pair <int, ActivityKind> >();
            //Sanity check to make sure we dont get here with the singleton process instance for the "definitions"
            if (Object.ReferenceEquals(((IProcess)this).Instance, this))
            {
                return(NewInstance().ProcessLaunch(heContext, parentActivityId, parentProcessId, inputs, out nextActIds));
            }

            int tenantId = heContext.AppInfo.Tenant.Id;
            Pair <int, ObjectKey> startActivity;

            processIdOverride = BPMRuntime.CreateProcessInstance(heContext, tenantId, GlobalKey.OwnerKey, GlobalKey.Key, parentActivityId, parentProcessId, out startActivity);

            var inputDefinitions = AllProcessInputsDefinitions;
            Dictionary <ObjectKey, IActivityVariable> inputsProcessed = new Dictionary <ObjectKey, IActivityVariable>(inputDefinitions.Count);
            IActivityVariable curInput;

            foreach (Pair <string, object> input in inputs)
            {
                ObjectKey key = ObjectKey.Parse(input.First);
                if (inputDefinitions.TryGetValue(key, out curInput))
                {
                    inputsProcessed[key] = curInput.NewInstance(input.Second);
                }
            }

            using (Transaction trans = DatabaseAccess.ForSystemDatabase.GetRequestTransaction()) {
                foreach (var input in inputsProcessed.Values)
                {
                    DBRuntimePlatform.Instance.AddProcessInput(trans, ProcessId, tenantId, input);
                    this.ProcessInputs[input.Key] = input;
                }
            }

            Debugger.SetRequestName("Launch '" + Name + "'");

            OnProcessStartCallback(heContext);

            //#586734 Check if the process was created.
            //A rollback in the OnProcessStart can delete the process that was created.
            using (Transaction trans = DatabaseAccess.ForSystemDatabase.GetRequestTransaction()) {
                if (!DBRuntimePlatform.Instance.CheckProcessExists(trans, ProcessId))
                {
                    throw new InvalidOperationException("Failed to created process " + ProcessId);
                }
            }

            int previousTenantId = tenantId;

            tenantId = heContext.AppInfo.Tenant.Id;
            if (previousTenantId != tenantId)
            {
                //Do not use the same variable as above because that transaction can already be commited
                using (Transaction trans = DatabaseAccess.ForSystemDatabase.GetRequestTransaction()) {
                    DBRuntimePlatform.Instance.SwitchProcessTenant(trans, ProcessId, previousTenantId, tenantId);
                }
            }

            SaveProcessOutputs(heContext);
            DatabaseAccess.CommitAllTransactions();

            try {
                IProcessActivity startActivityInstance;
                if (GetProcessActivityInstance(ProcessId, startActivity.First, startActivity.Second, true, out startActivityInstance))
                {
                    var nextActivities = startActivityInstance.StartWork(heContext, false, ActivityStatus.Created)
                                         .Select(nextAct => Pair.Create(nextAct.First, nextAct.Second));

                    nextActIds = new List <Pair <int, ActivityKind> >(nextActivities);

                    //TODO #124852
                    //if (!nextActivities.IsEmpty()) {
                    //    //Do not use the same variable as above because that transaction will already be commited
                    //    nextHumanActivity = BPMRuntime.GetNextHumanActivity(heContext,
                    //        DBTransactionManager.Current.SystemConnectionManager.GetMainTransaction(), nextActivities, heContext.Session.UserId);
                    //}
                }
            } catch (Exception e) {
                // This should only happen if there are problems getting the next human activity, but we still want to return the process Id that was already created.
                Log.ErrorLog.StaticWrite(DateTime.Now, "", heContext.AppInfo.eSpaceId, heContext.AppInfo.Tenant.Id,
                                         heContext.Session.UserId, e.Message, e.StackTrace, "BPM");
            }


            return(ProcessId);
        }
Exemplo n.º 5
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();
                }
            }
        }