Пример #1
0
 public override async Task Execute(SqlConnection dbconnection, SSSBMessage message, CancellationToken token)
 {
     foreach (var handler in _resultHandlers)
     {
         await handler.Execute(dbconnection, message, token);
     }
 }
Пример #2
0
 public ExecutorArgs(OnDemandTaskManager tasksManager, TaskInfo taskInfo, SSSBMessage message, MessageAtributes messageAtributes)
 {
     this.TasksManager = tasksManager;
     this.TaskInfo     = taskInfo;
     this.Message      = message;
     this.Atributes    = messageAtributes;
 }
Пример #3
0
 public ErrorMessageEventArgs(SSSBMessage message, ISSSBService svc, Exception processingException, CancellationToken cancellation)
 {
     this._message             = message;
     this._service             = svc;
     this._processingException = processingException;
     this._cancellation        = cancellation;
 }
 public ErrorMessageEventArgs(SSSBMessage message, BaseSSSBService svc, Exception processingException, CancellationToken cancellation)
 {
     this._message = message;
     this._service = svc;
     this._processingException = processingException;
     this._cancellation = cancellation;
 }
 /// <summary>
 /// Стандартная обработка сообщения об ошибке
 /// </summary>
 /// <param name="receivedMessage"></param>
 public static void ErrorMessageHandler(SqlConnection dbconnection, SSSBMessage receivedMessage)
 {
     if (receivedMessage.ConversationHandle.HasValue)
     {
         ServiceBrokerHelper.EndConversation(dbconnection, receivedMessage.ConversationHandle.Value);
         _log.Error(string.Format(ServiceBrokerResources.ErrorMessageReceivedErrMsg, receivedMessage.ConversationHandle.Value, Encoding.Unicode.GetString(receivedMessage.Body)));
     }
 }
 public ServiceMessageEventArgs(SSSBMessage message, BaseSSSBService svc, CancellationToken cancellation)
 {
     _message = message;
     _service = svc;
     _cancellation = cancellation;
     _endConversationAfterProcessing = false;
     _rollbackQue = false;
     _ex = null;
     _taskID = -1;
 }
Пример #7
0
 /// <summary>
 /// Стандартная обработка сообщения об ошибке
 /// </summary>
 /// <param name="message"></param>
 public async Task ErrorMessageHandler(SqlConnection dbconnection, SSSBMessage message)
 {
     try
     {
         _logger.LogError($"ErrorMessageHandler: {message.ConversationHandle} {message.MessageType} {message.ServiceName} {message.GetMessageXML()}");
     }
     finally
     {
         await _serviceBrokerHelper.EndConversation(dbconnection, message.ConversationHandle);
     }
 }
Пример #8
0
        protected virtual async Task HandleAsyncProcessingResult(SSSBMessage message, CancellationToken token, Task <HandleMessageResult> completionTask)
        {
            token.ThrowIfCancellationRequested();

            using (TransactionScope transactionScope = new TransactionScope(TransactionScopeOption.RequiresNew, TransactionScopeAsyncFlowOption.Enabled))
                using (var dbconnection = await _connectionManager.CreateSSSBConnectionAsync(token))
                {
                    await HandleSyncProcessingResult(dbconnection, message, token, completionTask);

                    transactionScope.Complete();
                }
        }
Пример #9
0
        public override async Task Execute(SqlConnection dbconnection, SSSBMessage message, CancellationToken token)
        {
            Guid conversationHandle = _conversationHandle.HasValue ? _conversationHandle.Value : message.ConversationHandle;

            if (!string.IsNullOrEmpty(_error))
            {
                await _serviceBrokerHelper.EndConversationWithError(dbconnection, conversationHandle, _errorCode.HasValue?_errorCode.Value : 1, _error);
            }
            else
            {
                await _serviceBrokerHelper.EndConversation(dbconnection, conversationHandle);
            }
        }
Пример #10
0
        /// <summary>
        /// Отправка отложенного сообщения. Сообщение содержит информацию о типе, идентификатор диалога и пр. необходимую для отправки информацию.
        /// </summary>
        /// <param name="fromService"></param>
        /// <param name="message"></param>
        /// <param name="lifetime"></param>
        /// <param name="isWithEncryption"></param>
        /// <param name="activationTime"></param>
        /// <param name="objectID"></param>
        public async Task <long?> SendPendingMessage(SqlConnection dbconnection,
                                                     SSSBMessage message,
                                                     string fromService,
                                                     TimeSpan lifetime,
                                                     bool isWithEncryption,
                                                     DateTime activationTime,
                                                     string objectID,
                                                     int attemptNumber)
        {
            Debug($"Executing method SendPendingMessage(ConversationHandle: {message.ConversationHandle}, fromService: {fromService}, activationTime: {activationTime: dd.MM.yyyy HH:mm:ss}");
            try
            {
                XElement xmessage = new XElement("DeferedMessage",
                                                 new XAttribute("conversationHandle", message.ConversationHandle),
                                                 new XAttribute("conversationGroupID", message.ConversationGroupID),
                                                 new XAttribute("messageType", message.MessageType),
                                                 new XAttribute("serviceName", message.ServiceName),
                                                 new XAttribute("contractName", message.ContractName),
                                                 new XAttribute("sequenceNumber", message.SequenceNumber),
                                                 new XAttribute("validationType", message.ValidationType),
                                                 new XAttribute("attemptNumber", attemptNumber),
                                                 new XElement("body", Convert.ToBase64String(message.Body))
                                                 );

                byte[] body = xmessage.ConvertToBytes();

                long?pendingMessageID = await _manager.SendPendingMessage(
                    dbconnection,
                    objectID,
                    activationTime,
                    fromService,
                    message.ServiceName,
                    message.ContractName,
                    (int)lifetime.TotalSeconds,
                    isWithEncryption,
                    body,
                    "PPS_DeferedMessageType");

                return(pendingMessageID);
            }
            catch (SqlException ex)
            {
                DBWrapperExceptionsHelper.ThrowError(ex, ServiceBrokerResources.PendingMessageErrMsg, _logger);
            }
            catch (Exception ex)
            {
                _logger.LogError(ErrorHelper.GetFullMessage(ex));
                throw new PPSException(ServiceBrokerResources.PendingMessageErrMsg, ex);
            }
            return(null);
        }
Пример #11
0
 /// <summary>
 /// Отправка сообщения. Сообщение содержит информацию о типе, идентификатор диалога и пр. необходимую для отправки информацию.
 /// </summary>
 /// <param name="message"></param>
 public async Task SendMessage(SqlConnection dbconnection, SSSBMessage message)
 {
     Debug($"Executing method SendMessage({message.MessageType}: {message.ConversationHandle})");
     try
     {
         await _manager.SendMessage(dbconnection, message.ConversationHandle, message.MessageType, message.Body);
     }
     catch (SqlException ex)
     {
         DBWrapperExceptionsHelper.ThrowError(ex, ServiceBrokerResources.SendMessageErrMsg, _logger);
     }
     catch (Exception ex)
     {
         _logger.LogError(ErrorHelper.GetFullMessage(ex));
         throw new PPSException(ServiceBrokerResources.SendMessageErrMsg, ex);
     }
 }
Пример #12
0
        private Task _HandleProcessingResult(SqlConnection dbconnection, ServiceMessageEventArgs serviceArgs, bool isSync)
        {
            SSSBMessage       message = serviceArgs.Message;
            CancellationToken token   = serviceArgs.Token;

            Task processTask = serviceArgs.Completion.ContinueWith(async(antecedent) =>
            {
                try
                {
                    if (isSync)
                    {
                        await this.HandleSyncProcessingResult(dbconnection, message, token, antecedent);
                    }
                    else
                    {
                        await this.HandleAsyncProcessingResult(message, token, antecedent);
                    }
                }
                catch (OperationCanceledException)
                {
                    // NOOP
                }
                catch (PPSException)
                {
                    // Already Logged
                }
                catch (Exception ex)
                {
                    _logger.LogError(ErrorHelper.GetFullMessage(ex));
                }
            }, isSync ? TaskContinuationOptions.ExecuteSynchronously : TaskContinuationOptions.None).Unwrap();

            var disposeTask = processTask.ContinueWith((antecedent) =>
            {
                try
                {
                    this.OnDispose(serviceArgs);
                }
                catch (Exception ex)
                {
                    _logger.LogError(ErrorHelper.GetFullMessage(ex));
                }
            }, TaskContinuationOptions.ExecuteSynchronously);

            return(processTask);
        }
Пример #13
0
 public override Task Execute(SqlConnection dbconnection, SSSBMessage message, CancellationToken token)
 {
     return(Task.CompletedTask);
 }
Пример #14
0
        public override async Task <ServiceMessageEventArgs> HandleMessage(ISSSBService sender, ServiceMessageEventArgs serviceMessageArgs)
        {
            MessageAtributes messageAtributes = null;
            SSSBMessage      originalMessage  = null;

            try
            {
                serviceMessageArgs.Token.ThrowIfCancellationRequested();
                XElement envelopeXml         = serviceMessageArgs.Message.GetMessageXML();
                byte[]   originalMessageBody = Convert.FromBase64String(envelopeXml.Element("body").Value);
                XElement originalMessageXml  = originalMessageBody.GetMessageXML();
                messageAtributes               = originalMessageXml.GetMessageAttributes();
                messageAtributes.isDefered     = true;
                messageAtributes.attemptNumber = (int)envelopeXml.Attribute("attemptNumber");
                string messageType    = (string)envelopeXml.Attribute("messageType");
                string serviceName    = (string)envelopeXml.Attribute("serviceName");
                string contractName   = (string)envelopeXml.Attribute("contractName");
                long   sequenceNumber = (long)envelopeXml.Attribute("sequenceNumber");
                MessageValidationType validationType = (MessageValidationType)Enum.Parse(typeof(MessageValidationType), envelopeXml.Attribute("validationType").Value);
                Guid conversationHandle  = Guid.Parse(envelopeXml.Attribute("conversationHandle").Value);
                Guid conversationGroupID = Guid.Parse(envelopeXml.Attribute("conversationGroupID").Value);

                originalMessage = new SSSBMessage(conversationHandle, conversationGroupID, validationType, contractName);
                originalMessage.SequenceNumber = sequenceNumber;
                originalMessage.ServiceName    = serviceName;
                originalMessage.Body           = originalMessageBody;
            }
            catch (OperationCanceledException)
            {
                serviceMessageArgs.TaskCompletionSource.TrySetCanceled(serviceMessageArgs.Token);
                return(serviceMessageArgs);
            }
            catch (PPSException ex)
            {
                serviceMessageArgs.TaskCompletionSource.TrySetException(ex);
                return(serviceMessageArgs);
            }
            catch (Exception ex)
            {
                this.Logger.LogError(ErrorHelper.GetFullMessage(ex));
                serviceMessageArgs.TaskCompletionSource.TrySetException(new PPSException(ex));
                return(serviceMessageArgs);
            }

            OnDemandTaskManager taskManager = serviceMessageArgs.Services.GetRequiredService <OnDemandTaskManager>();

            try
            {
                serviceMessageArgs.Token.ThrowIfCancellationRequested();
                var task = await taskManager.GetTaskInfo(messageAtributes.TaskID.Value);

                serviceMessageArgs.TaskID = messageAtributes.TaskID.Value;
                var executorArgs = new ExecutorArgs(taskManager, task, originalMessage, messageAtributes);
                await ExecuteTask(executorArgs, serviceMessageArgs);
            }
            catch (OperationCanceledException)
            {
                serviceMessageArgs.TaskCompletionSource.TrySetCanceled(serviceMessageArgs.Token);
            }
            catch (PPSException ex)
            {
                serviceMessageArgs.TaskCompletionSource.TrySetException(ex);
            }
            catch (Exception ex)
            {
                Logger.LogCritical(ErrorHelper.GetFullMessage(ex));
                serviceMessageArgs.TaskCompletionSource.TrySetException(new PPSException(ex));
            }

            return(serviceMessageArgs);
        }
Пример #15
0
		/// <summary>
		/// Отправка сообщения. Сообщение содержит информацию о типе, идентификатор диалога и пр. необходимую для отправки информацию.
		/// </summary>
		/// <param name="message"></param>
		public static void SendMessage(SqlConnection dbconnection, SSSBMessage message)
		{
			_log.Info("Выполнение метода SendMessage(message)");
			try
			{

                SSSBManager.SendMessage(dbconnection, message.ConversationHandle, message.MessageType, message.Body);
			}
            catch (SqlException ex)
            {
                DBWrapperExceptionsHelper.ThrowError(ex, ServiceBrokerResources.SendMessageErrMsg, _log);
            }
            catch (Exception ex)
            {
                throw new PPSException(ServiceBrokerResources.SendMessageErrMsg, ex, _log);
            }
		}
Пример #16
0
		/// <summary>
		/// Отправка отложенного сообщения. Сообщение содержит информацию о типе, идентификатор диалога и пр. необходимую для отправки информацию.
		/// </summary>
		/// <param name="fromService"></param>
		/// <param name="message"></param>
		/// <param name="lifetime"></param>
		/// <param name="isWithEncryption"></param>
		/// <param name="activationTime"></param>
		/// <param name="objectID"></param>
		public static long SendPendingMessage(SqlConnection dbconnection, string fromService, SSSBMessage message, TimeSpan lifetime, bool isWithEncryption, Guid? initiatorConversationGroupID, DateTime activationTime, string objectID)
		{
			_log.Info("Выполнение метода SendPendingMessage(..)");
			try
			{
                long? pendingMessageID = null;
                SSSBManager.SendPendingMessage(dbconnection, objectID, activationTime, fromService, message.ServiceName, message.ContractName, (int)lifetime.TotalMilliseconds, isWithEncryption, message.ConversationGroupID, message.ConversationHandle, message.Body, message.MessageType, initiatorConversationGroupID, ref pendingMessageID);
                return pendingMessageID.Value;
            }
            catch (SqlException ex)
            {
                DBWrapperExceptionsHelper.ThrowError(ex, ServiceBrokerResources.PendingMessageErrMsg, _log);
                return 0;
            }
            catch (Exception ex)
            {
                throw new PPSException(ServiceBrokerResources.PendingMessageErrMsg, ex, _log);
            }
		}
Пример #17
0
 public override Task Execute(SqlConnection dbconnection, SSSBMessage message, CancellationToken token)
 {
     return(_serviceBrokerHelper.SendPendingMessage(dbconnection, message, _fromService, _lifeTime, false, _activationTime, null, _attemptNumber));
 }
 /// <summary>
 /// Отправка ответного сообщения о завершении задачи
 /// </summary>
 /// <param name="receivedMessage"></param>
 public static void SendStepCompleted(SqlConnection dbconnection, SSSBMessage receivedMessage)
 {
     if (receivedMessage.ConversationHandle.HasValue)
         ServiceBrokerHelper.SendStepCompletedMessage(dbconnection, receivedMessage.ConversationHandle.Value);
 }
Пример #19
0
        protected virtual async Task HandleSyncProcessingResult(SqlConnection dbconnection, SSSBMessage message, CancellationToken token, Task <HandleMessageResult> completionTask)
        {
            HandleMessageResult handleMessageResult = null;

            try
            {
                handleMessageResult = await completionTask;

                await handleMessageResult.Execute(dbconnection, message, token);
            }
            catch (OperationCanceledException)
            {
                await _standardMessageHandlers.EndDialogMessageWithErrorHandler(dbconnection, message, $"Operation on Service: '{message.ServiceName}', MessageType: '{message.MessageType}', ConversationHandle: '{message.ConversationHandle}', is Cancelled", 1);
            }
            catch (PPSException ex)
            {
                await _standardMessageHandlers.EndDialogMessageWithErrorHandler(dbconnection, message, $"Operation on Service: '{message.ServiceName}', MessageType: '{message.MessageType}', ConversationHandle: '{message.ConversationHandle}', ended with Error: {ex.Message}", 2);
            }
            catch (Exception ex)
            {
                try
                {
                    _logger.LogError(new EventId(0, message.ServiceName), ErrorHelper.GetFullMessage(ex));
                }
                finally
                {
                    await _standardMessageHandlers.EndDialogMessageWithErrorHandler(dbconnection, message, $"Operation on Service: '{message.ServiceName}', MessageType: '{message.MessageType}', ConversationHandle: '{message.ConversationHandle}', ended with Error: {ex.Message}", 3);
                }
            }
        }
 /// <summary>
 /// Завершение диалога с отправкой сообщения об ошибке
 /// </summary>
 /// <param name="receivedMessage"></param>
 public static void EndDialogMessageWithErrorHandler(SqlConnection dbconnection, SSSBMessage receivedMessage, string message, int? errorNumber)
 {
     ServiceBrokerHelper.EndConversationWithError(dbconnection, receivedMessage.ConversationHandle.Value, errorNumber, message);
 }
 /// <summary>
 /// Стандартная обработка сообщения о завершении диалога
 /// </summary>
 /// <param name="receivedMessage"></param>
 public static void EndDialogMessageHandler(SqlConnection dbconnection, SSSBMessage receivedMessage)
 {
     if (receivedMessage.ConversationHandle.HasValue)
         ServiceBrokerHelper.EndConversation(dbconnection, receivedMessage.ConversationHandle.Value);
 }
 /// <summary>
 /// Стандартная обработка ECHO сообщения
 /// </summary>
 /// <param name="receivedMessage"></param>
 public static void EchoMessageHandler(SqlConnection dbconnection, SSSBMessage receivedMessage)
 {
     ServiceBrokerHelper.SendMessage(dbconnection, receivedMessage);
 }
 /// <summary>
 /// Завершение диалога с отправкой сообщения об ошибке
 /// </summary>
 /// <param name="receivedMessage"></param>
 public Task EndDialogMessageWithErrorHandler(SqlConnection dbconnection, SSSBMessage receivedMessage, string message, int errorNumber)
 {
     return(_serviceBrokerHelper.EndConversationWithError(dbconnection, receivedMessage.ConversationHandle, errorNumber, message));
 }
Пример #24
0
        public override Task Execute(SqlConnection dbconnection, SSSBMessage message, CancellationToken token)
        {
            Guid conversationHandle = _conversationHandle.HasValue ? _conversationHandle.Value : message.ConversationHandle;

            return(_serviceBrokerHelper.SendMessage(dbconnection, conversationHandle, _messageType, _xmlBody));
        }
        /// <summary>
        /// Стандартная обработка сообщения об ошибке
        /// </summary>
        /// <param name="receivedMessage"></param>
        public async Task ErrorMessageHandler(SqlConnection dbconnection, SSSBMessage receivedMessage)
        {
            await _serviceBrokerHelper.EndConversation(dbconnection, receivedMessage.ConversationHandle);

            _logger.LogError(string.Format(ServiceBrokerResources.ErrorMessageReceivedErrMsg, receivedMessage.ConversationHandle, Encoding.Unicode.GetString(receivedMessage.Body)));
        }
 /// <summary>
 /// Стандартная обработка ECHO сообщения
 /// </summary>
 /// <param name="receivedMessage"></param>
 public Task EchoMessageHandler(SqlConnection dbconnection, SSSBMessage receivedMessage)
 {
     return(_serviceBrokerHelper.SendMessage(dbconnection, receivedMessage));
 }
 /// <summary>
 /// Стандартная обработка сообщения о завершении диалога
 /// </summary>
 /// <param name="receivedMessage"></param>
 public Task EndDialogMessageHandler(SqlConnection dbconnection, SSSBMessage receivedMessage)
 {
     return(_serviceBrokerHelper.EndConversation(dbconnection, receivedMessage.ConversationHandle));
 }
Пример #28
0
 public abstract Task Execute(SqlConnection dbconnection, SSSBMessage message, CancellationToken token);