/// <summary> /// 监控消费 /// </summary> /// <param name="listener">消费事件</param> /// <param name="autoAck">是否自动确认,默认false</param> public void Start(IListenerMessage listener, bool autoAck = false) { _listener = listener; _autoAck = autoAck; Connect(_listener, _autoAck); CheckStatsAndConnect(); }
/// <summary> /// 持续消费,并检查连接状态并自动恢复 /// </summary> private void Connect(IListenerMessage listener, bool autoAck = false) { Connect(); _channel.BasicQos(0, (ushort)_consumeThreadNums, false); var consumer = new EventingBasicConsumer(_channel); consumer.Received += (model, ea) => { bool result = true; string?message = Encoding.UTF8.GetString(ea.Body.ToArray()); try { listener.Consumer(message, model, ea); _lastAckAt = DateTime.Now; } catch (AlreadyClosedException e) // rabbit被关闭了,重新打开链接 { ReStart(); //IocCollection.GetService<ILoggerFactory>() // .CreateLogger(listener.GetType()) // .LogError(e, e.ToString()); } catch (Exception e) { // 全局异常处理 IocCollection.GetService <IGlobalException>()?.Handle(e, message); // 消费失败后处理 //IocCollection.GetService<ILoggerFactory>() // .CreateLogger(listener.GetType()) // .LogError(e, e.ToString()); try { result = listener.FailureHandling(message, model, ea); } catch (Exception exception) { //IocCollection.GetService<ILoggerFactory>() // .CreateLogger(listener.GetType()) // .LogError(exception, "失败处理出现异常:" + listener.GetType().FullName); result = false; } } finally { if (!autoAck) { if (result) { _channel.BasicAck(ea.DeliveryTag, false); } else { _channel.BasicReject(ea.DeliveryTag, true); } } } }; // 消费者开启监听 _channel.BasicConsume(queue: _queueName, autoAck: autoAck, consumer: consumer); }
public ReceiverServiceBase(ILogger logger) { try { _logger = logger; _logger.WriteInfo(new LogMessage("Init Vecomsoftware.ServiceBus.Receiver"), LogCategories); _logger.WriteInfo(new LogMessage("Create new Message Factory"), LogCategories); MessagingFactory factory = MessagingFactory.CreateFromConnectionString(ReceiverConfiguration.QueueConnectionString); _logger.WriteInfo(new LogMessage(string.Concat("Create new Message Receiver -> ", ReceiverConfiguration.QueueName)), LogCategories); MessageReceiver receiver = factory.CreateMessageReceiver(ReceiverConfiguration.QueueName, ReceiveMode.PeekLock); _logger.WriteInfo(new LogMessage("Start listening message"), LogCategories); AppDomain listenerDomain = Thread.GetDomain(); listenerDomain.AssemblyResolve += ListenerDomain_AssemblyResolve; IWebAPIClient webApiClient = new WebAPIClient(logger, ReceiverConfiguration.AddressesJsonConfigWebAPI); _directoryInfo = new DirectoryInfo(Path.Combine(listenerDomain.BaseDirectory, "Listener")); _logger.WriteDebug(new LogMessage(string.Concat("DirectoryInfo: ", _directoryInfo.FullName, " (", _directoryInfo.EnumerateFiles().Count(), ")")), LogCategories); _logger.WriteDebug(new LogMessage(string.Concat("Searching ... ", ReceiverConfiguration.ListenerAssemblyFullName)), LogCategories); Assembly externalAssembly = listenerDomain.Load(File.ReadAllBytes(_directoryInfo.EnumerateFiles() .Single(f => f.Name.Equals(ReceiverConfiguration.ListenerAssemblyFullName)).FullName)); Type currentListener = externalAssembly.GetTypes().Single(f => _type_iListenerMessage.IsAssignableFrom(f)); bool containsBiblosDocumentClient = currentListener.GetConstructors().Single().GetParameters().Any(f => f.ParameterType.Equals(_type_biblosClient)); bool containsStampaConformeClient = currentListener.GetConstructors().Single().GetParameters().Any(f => f.ParameterType.Equals(_type_stampaConformeClient)); bool containsServiceBusClient = currentListener.GetConstructors().Single().GetParameters().Any(f => f.ParameterType.Equals(_type_serviceBusClient)); List <object> constructorParameters = new List <object> { receiver, _logger, webApiClient }; if (containsBiblosDocumentClient) { constructorParameters.Add(new BiblosDS.BiblosClient()); } if (containsStampaConformeClient) { constructorParameters.Add(new StampaConforme.StampaConformeClient()); } if (containsServiceBusClient) { constructorParameters.Add(new ServiceBus.ServiceBusClient(logger)); } _listener = (IListenerMessage)Activator.CreateInstance(currentListener, constructorParameters.ToArray()); } catch (ReflectionTypeLoadException r_ex) { foreach (Exception ex in r_ex.LoaderExceptions) { _logger.WriteError(ex, LogCategories); } throw r_ex; } catch (Exception ex) { _logger.WriteError(ex, LogCategories); throw ex; } }