Exemple #1
0
        protected virtual void ProcessLocalServiceTarget(TransactionStatus transactionStatus, ScheduledItem scheduledItem,
                                                         Activity activity)
        {
            DataService dataService =
                ServiceManager.ValidateDataService(scheduledItem.TargetId, ServiceType.Submit);

            // Load the service plugin
            ISubmitProcessor submitPlugin = null;
            IPluginDisposer  disposer;
            string           flowName = FlowManager.GetDataFlowNameById(dataService.FlowId);

            try
            {
                disposer = PluginLoader.LoadSubmitProcessor(dataService, out submitPlugin);
            }
            catch (Exception e)
            {
                throw new NotImplementedException(string.Format("Failed to load the target submit service \"{0}\" for the scheduled item \"{1}\"",
                                                                dataService.Name, scheduledItem.Name), e);
            }
            using (disposer)
            {
                LogActivity(activity, "Calling ProcessSubmit()");
                try
                {
                    ISubmitProcessorEx submitPluginEx = submitPlugin as ISubmitProcessorEx;
                    if (submitPluginEx != null)
                    {
                        string submitTransactionStatusDetail;
                        submitPluginEx.ProcessSubmitAndReturnStatus(transactionStatus.Id,
                                                                    out submitTransactionStatusDetail);
                    }
                    else
                    {
                        submitPlugin.ProcessSubmit(transactionStatus.Id);
                    }
                }
                finally
                {
                    activity.Append(submitPlugin.GetAuditLogEvents());
                }
                LogActivity(activity, "Called ProcessSubmit()");
            }
        }
Exemple #2
0
        protected void ProcessSubmitTransaction(string transactionId)
        {
            using (INodeProcessorMutex mutex = GetMutex(transactionId))
            {
                if (!mutex.IsAcquired)
                {
                    LOG.Debug("Exiting ProcessTransactionRequest(), could not acquire mutex for transaction {0}",
                              transactionId);
                    return;     // Another thread is already working on this transaction, get out of here
                }
                // Make sure the transaction has not been processed yet
                string transactionModifiedBy;
                if (!TransactionManager.IsUnprocessed(transactionId, out transactionModifiedBy))
                {
                    LOG.Debug("Exiting ProcessSubmitTransaction(), transaction {0} has already been processed",
                              transactionId);
                    return;
                }
                DateTime startTime = DateTime.Now;
                Activity activity  =
                    new Activity(NodeMethod.Submit, null, null, ActivityType.Info, transactionId, NetworkUtils.GetLocalIp(),
                                 "Start processing submit transaction: \"{0}\"", transactionId);
                activity.ModifiedById = transactionModifiedBy;

                try
                {
                    TransactionManager.SetTransactionStatus(transactionId, CommonTransactionStatusCode.Pending,
                                                            "Processing submit transaction", false);
                    // Get the document processing service
                    string      flowName, operation;
                    DataService submitService =
                        TransactionManager.GetSubmitDocumentServiceForTransaction(transactionId, out flowName,
                                                                                  out operation);
                    if (submitService == null)
                    {
                        if (!string.IsNullOrEmpty(operation))
                        {
                            throw new ArgumentException(string.Format("A valid Submit service was not found for the flow \"{0}\" and operation \"{1}\"",
                                                                      flowName, operation));
                        }
                        // Let empty operation pass through, even without a valid service, per Mark
                    }
                    else if (!submitService.IsActive)
                    {
                        throw new ArgumentException(string.Format("The Submit service is not active for the flow \"{0}\" and operation \"{1}\"",
                                                                  flowName, operation));
                    }
                    if (submitService == null)
                    {
                        activity.Append("No service found for Submit transaction");
                        TransactionStatus transactionStatus =
                            TransactionManager.SetTransactionStatusIfNotStatus(transactionId, CommonTransactionStatusCode.ReceivedUnprocessed,
                                                                               "Received unprocessed submit transaction",
                                                                               CommonTransactionStatusCode.Received, true);
                        activity.AppendFormat("Transaction status set to \"{0}\"", transactionStatus.Status.ToString());
                    }
                    else
                    {
                        CommonTransactionStatusCode submitTransactionStatus = CommonTransactionStatusCode.Processed;
                        string           submitTransactionStatusDetail      = "Finished processing submit transaction";
                        ISubmitProcessor submitProcessor;
                        using (IPluginDisposer disposer = PluginLoader.LoadSubmitProcessor(submitService, out submitProcessor))
                        {
                            TransactionManager.SetTransactionStatus(transactionId, CommonTransactionStatusCode.Processing,
                                                                    "Processing submit transaction", true);
                            activity.Append("Set transaction status to Processing");
                            activity.AppendFormat("Processing Submit transaction for flow \"{0}\" and operation \"{1}\" using plugin \"{2}\"",
                                                  flowName, operation, submitProcessor.GetType().FullName);

                            try
                            {
                                ISubmitProcessorEx submitProcessorEx = submitProcessor as ISubmitProcessorEx;
                                if (submitProcessorEx != null)
                                {
                                    submitTransactionStatus =
                                        submitProcessorEx.ProcessSubmitAndReturnStatus(transactionId,
                                                                                       out submitTransactionStatusDetail);
                                    activity.AppendFormat("Submit processing plugin returned status of \"{0}\"",
                                                          submitTransactionStatus.ToString());
                                }
                                else
                                {
                                    submitProcessor.ProcessSubmit(transactionId);
                                }
                            }
                            finally
                            {
                                activity.Append(submitProcessor.GetAuditLogEvents());
                            }

                            TimeSpan processLength = DateTime.Now - startTime;
                            activity.AppendFormat("Process time: {0}", processLength.ToString());
                        }
                        activity.Append("Finished processing submit transaction");
                        TransactionStatus transactionStatus =
                            TransactionManager.SetTransactionStatusIfNotStatus(transactionId, submitTransactionStatus,
                                                                               submitTransactionStatusDetail,
                                                                               CommonTransactionStatusCode.Received |
                                                                               CommonTransactionStatusCode.Completed |
                                                                               CommonTransactionStatusCode.Failed, true);
                        activity.AppendFormat("Transaction status set to \"{0}\"", transactionStatus.Status.ToString());
                        activity.AppendFormat(TransactionManager.DoTransactionNotifications(transactionId));
                    }
                }
                catch (Exception e)
                {
                    LOG.Error("ProcessSubmitTransaction() threw an exception.", e);
                    TransactionStatus transactionStatus =
                        TransactionManager.SetTransactionStatusIfNotStatus(transactionId, CommonTransactionStatusCode.Failed,
                                                                           e.Message, CommonTransactionStatusCode.Received, true);

                    activity.AppendFormat("Transaction status set to \"{0}\"", transactionStatus.Status.ToString());
                    activity.Append(ExceptionUtils.ToShortString(e));
                    activity.Type = ActivityType.Error;
                    activity.AppendFormat(TransactionManager.DoTransactionNotifications(transactionId));
                }
                finally
                {
                    ActivityManager.Log(activity);
                }
            }
        }