private async Task <ResultCode> ProcessJobAsync(ExampleMessageType message)
 {
     try
     {
         _logger.LogInformation($"Processing OrderID: {message.OrderID}");
         // POST order to third party system here
         return(ResultCode.Success);
     }
     catch (CustomException ex)
     {
         //  Handle and log exception from your third party System
         LogFailure($"Third Party Error: {ex.Message} Third Party Code: {ex.ErrorCode} {ex.StackTrace}");
         return(IsTransientError(ex.HttpStatus) ? ResultCode.TemporaryFailure : ResultCode.PermanentFailure);
     }
     catch (OrderCloudException ex)
     {
         //  Handle and log exception from OrderCloud
         LogFailure($"{ex.InnerException?.Message} {ex?.InnerException?.InnerException?.Message} { JsonConvert.SerializeObject(ex.Errors) } {ex.StackTrace }");
         return(IsTransientError(ex.HttpStatus) ? ResultCode.TemporaryFailure : ResultCode.PermanentFailure);
     }
     catch (Exception ex)
     {
         //  Catch all for other exceptions
         LogFailure($"{ex.Message} {ex?.InnerException?.Message} {ex.StackTrace}");
         return(ResultCode.PermanentFailure);
     }
 }
 private async Task <ResultCode> TryProcessJobAsync(ExampleMessageType message)
 {
     try
     {
         return(await ProcessJobAsync(message));
     }
     catch (Exception ex)
     {
         LogFailure($"Unhandled exception in ProcessJobAsync - {ex.Message} {ex.InnerException.Message} {ex.StackTrace}");
         return(ResultCode.PermanentFailure);
     }
 }
        public async Task <OrderSubmitResponse> HandleOrderReleased(OrderCalculatePayload <CheckoutConfig> payload)
        {
            // Send email to the purchaser
            var toEmail = payload.OrderWorksheet.Order.FromUser.Email;

            // Forward order to an ERP or fullfilment system
            var message = new ExampleMessageType
            {
                OrderID = payload.OrderWorksheet.Order.ID
            };
            await _serviceBus.SendMessage(_settings.ServiceBusSettings.OrderProcessingQueueName, message, afterMinutes : 1);

            // Return response
            return(new OrderSubmitResponse()
            {
                HttpStatusCode = 200,
                xp = new
                {
                    NeedsAttention = false,
                    OrderSubmitResponseCode = 200
                }
            });
        }