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()"); } }
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); } } }