/// <summary>
        /// 推送异常队列
        /// </summary>
        /// <param name="ex">异常</param>
        /// <param name="queueMessage">队列消息</param>
        /// <param name="desc">描述</param>
        /// <returns>是否推送成功</returns>
        protected bool PublishExceptionQueue(Exception ex, object queueMessage, string desc = null)
        {
            if (BusinessExceptionProducer == null)
            {
                return(BusinessExceptionReturnAck);
            }

            string queueMessageJson = null;

            if (queueMessage != null)
            {
                queueMessageJson = JsonUtil.SerializeIgnoreNull(queueMessage);
            }

            var busEx = new BusinessExceptionInfo()
            {
                Time                   = DateTime.Now,
                ServiceName            = AppConfig["MessageQueue:Consumer:ServiceName"],
                ExceptionString        = ex.ToString(),
                ExceptionMessage       = ex.Message,
                Exchange               = rabbitMessageQueueInfo.Exchange,
                Queue                  = rabbitMessageQueueInfo.Queue,
                QueueMessageJsonString = queueMessageJson,
                Desc                   = desc,
                ServerMachineName      = Environment.MachineName,
                ServerIP               = NetworkUtil.LocalIP
            };

            BusinessExceptionProducer.Publish(busEx, BusinessExceptionProducerRouteKey);

            return(true);
        }
Пример #2
0
        /// <summary>
        /// 处理业务异常
        /// </summary>
        /// <param name="businessException">业务异常</param>
        /// <returns>是否处理成功</returns>
        public bool Handle(BusinessExceptionInfo businessException)
        {
            if (businessException == null || dicExceptionHandleProducers.IsNullOrCount0())
            {
                return(false);
            }

            foreach (var item in dicExceptionHandleProducers)
            {
                item.Key.Publish(businessException, item.Value);
            }

            return(true);
        }
Пример #3
0
        /// <summary>
        /// Raises the exception event.
        /// </summary>
        /// <param name="context">The context for the action.</param>
        public override void OnException(HttpActionExecutedContext context)
        {
            // --- Log this information to the trace log
            var logItem = new TraceLogItem
            {
                Type            = TraceLogItemType.Error,
                OperationType   = "WebAPI",
                Message         = "Exception",
                DetailedMessage = context.Exception.ToString()
            };

            Tracer.Log(logItem);

            var businessEx = context.Exception as BusinessOperationException;

            if (businessEx != null)
            {
                // --- This is a business issue
                var info = new BusinessExceptionInfo
                {
                    reasonCode  = businessEx.ReasonCode,
                    isBusiness  = true,
                    message     = businessEx.Message,
                    errorObject = businessEx.Notifications.Items
                };
                throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.InternalServerError)
                {
                    Content = new StringContent(JsonConvert.SerializeObject(info))
                });
            }

            // --- This is an infrastructure issue
            var infraInfo = new InfrastructureExceptionInfo
            {
                reasonCode = "Unexpected",
                isBusiness = false,
                message    = context.Exception.Message
            };

            throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.InternalServerError)
            {
                Content = new StringContent(JsonConvert.SerializeObject(infraInfo))
            });
        }
Пример #4
0
        /// <summary>
        /// 生成业务异常信息
        /// </summary>
        /// <param name="ex">异常</param>
        /// <param name="queueMessage">队列消息</param>
        /// <param name="amqpQueue">AMQP队列信息</param>
        /// <param name="log">日志</param>
        /// <param name="desc">描述</param>
        /// <returns>业务异常信息</returns>
        public static BusinessExceptionInfo BuilderBusinessException(Exception ex, object queueMessage, AmqpQueueInfo amqpQueue, ILogable log, string desc = null)
        {
            if (log == null)
            {
                throw new ArgumentNullException("日志不能为null");
            }
            string queueMessageJson = null;

            if (queueMessage != null)
            {
                try
                {
                    queueMessageJson = queueMessage.ToJsonString();
                }
                catch (Exception ex1)
                {
                    log.ErrorAsync("JSON序列化业务异常信息出错", ex1, typeof(AmqpUtil).Name);

                    return(null);
                }
            }

            var busEx = new BusinessExceptionInfo()
            {
                ExId                   = snowflakeId.New(),
                HostId                 = amqpQueue.HostId,
                Time                   = DateTime.Now,
                ServiceName            = string.IsNullOrWhiteSpace(amqpQueue.ExceptionHandle.ServiceName) ? App.AppServiceName : amqpQueue.ExceptionHandle.ServiceName,
                ExceptionString        = ex.ToString(),
                ExceptionMessage       = ex.Message,
                Exchange               = amqpQueue.ExchangeName,
                Queue                  = amqpQueue.Queue.Name,
                QueueMessageJsonString = queueMessageJson,
                Desc                   = desc,
                ServerMachineName      = Environment.MachineName,
                ServerIP               = NetworkUtil.LocalIP
            };

            return(busEx);
        }