public Task StartAsync(CancellationToken cancellationToken) { try { _manager = new MQServcieManager(); foreach (var dbMapping in _rabitMqOption.DbTables) { _manager.AddService(new ConsumeService(_rabitMqOption, dbMapping, _dbTypeMapper) { OnAction = OnActionOutput }); } _manager.OnAction = OnActionOutput; _manager.Start(); AppDomain.CurrentDomain.ProcessExit += CurrentDomainOnProcessExit; _logger.LogInformation("rabit consume client start succ..."); } catch (Exception ex) { _logger.LogError(ex, "rabit consume client start error..."); } return(Task.CompletedTask); }
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory factory, IApplicationLifetime lifeTime) { serviceManager = new MQServcieManager(this.Configuration, factory.CreateLogger <MQServcieManager>()); lifeTime.ApplicationStarted.Register(() => { serviceManager.Start(); }); lifeTime.ApplicationStopping.Register(() => { serviceManager.Stop(); }); if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Home/Error"); } app.UseStaticFiles(); app.UseCookiePolicy(); app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); }
/// <summary> /// 主线程 /// 控制多线程 /// </summary> /// <param name="mqManager"></param> /// <param name="config"></param> private static void ThreadMain(MQServcieManager mqManager, MQConfig config) { int threadCount = 1; Int32.TryParse(ConfigurationManager.AppSettings["ThreadCount"], out threadCount); for (int i = 0; i < threadCount; i++) { Thread t = new Thread(() => MonitorResult(mqManager, config)); t.Start(); } }
private static void UseRabbitMQ(IConfiguration configuration) { mqManager = new MQServcieManager(logWriter, filterService, configuration, logger); lifeTime.ApplicationStarted.Register(() => { mqManager.Start(); }); lifeTime.ApplicationStopping.Register(() => { mqManager.Stop(); }); }
/// <summary> /// 监听“付款数据”的队列 /// </summary> /// <param name="mqManager"></param> /// <param name="config"></param> private static void MonitorPayData(MQServcieManager mqManager, MQConfig config) { MQQueueInfo mQQueueInfo11 = new MQQueueInfo() { QueueName = MQManufacturerCode + "PayDataQueue.YunPark", RoutingKey = "PayData4007004008", ExchangeType = RabbitMQ.Client.ExchangeType.Topic, ExchangeName = MQYunCameraExchange.TopicPushPayDataToYunParkExchange }; IMQService mQService = new CreateMQService(config, mQQueueInfo11); mqManager.AddServices(mQService); }
/// <summary> /// 监听“创建新地区”的队列 /// </summary> /// <param name="manager"></param> /// <param name="config"></param> private static void MonitorNewParking(MQServcieManager mqManager, MQConfig config) { MQQueueInfo mQQueueInfo11 = new MQQueueInfo() { QueueName = MQManufacturerCode + "NewCityCodeQueue", RoutingKey = "NewCityCode4007004008", ExchangeType = RabbitMQ.Client.ExchangeType.Direct, ExchangeName = MQYunCameraExchange.DirectDynamicAddNewCityCode }; IMQService mQService = new CreateMQService(config, mQQueueInfo11); mqManager.AddServices(mQService); }
/// <summary> /// 初始化每个地区创建独立监听队列 /// (区号 如:0755、0731) /// </summary> /// <param name="manager"></param> /// <param name="config"></param> private static void InitMonitorCityCode(MQServcieManager mqManager, MQConfig config, string cityCode) { //接收数据队列 MQQueueInfo mQQueueInfo1 = new MQQueueInfo() { QueueName = MQManufacturerCode + cityCode + "YunParkCameraQueue", RoutingKey = cityCode, ExchangeType = RabbitMQ.Client.ExchangeType.Topic }; IMQService mQService = new CreateMQService(config, mQQueueInfo1); mQService.Exchange = MQYunCameraExchange.TopicFuJiCaYunCameraParkPushExchange; mqManager.AddServices(mQService); }
/// <summary> /// 动态创建地区监听队列 /// </summary> /// <param name="mqManager"></param> /// <param name="config"></param> /// <param name="cityCode"></param> private static void DynamicAddMonitorCityCode(MQServcieManager mqManager, MQConfig config, string cityCode) { MQQueueInfo mQQueueInfo = new MQQueueInfo() { QueueName = MQManufacturerCode + cityCode + "YunParkCameraQueue", RoutingKey = cityCode, ExchangeType = RabbitMQ.Client.ExchangeType.Topic }; IMQService mQService = new CreateMQService(config, mQQueueInfo); mQService.Exchange = MQYunCameraExchange.TopicFuJiCaYunCameraParkPushExchange; MQChannel m_MQChannel3 = new MQChannel(mQQueueInfo.ExchangeType, mQQueueInfo.ExchangeName, mQQueueInfo.QueueName, mQQueueInfo.RoutingKey); Dictionary <IMQService, MQChannel> IMQServiceAndMQChannel3 = new Dictionary <IMQService, MQChannel>(); IMQServiceAndMQChannel3.Add(mQService, m_MQChannel3); mqManager.DynamicAddMQChannel.Enqueue(IMQServiceAndMQChannel3); }
public static void Execute() { //初始化mq连接参数对象 MQConfig config = new MQConfig() { Url = MQ_UrlParam, UserName = MQ_UserNameParam.Substring(5), Pwd = string.Concat(MQ_PwdParam.Substring(5, 9), System.Convert.ToInt64(MQ_PwdParam.Substring(14), 2).ToString()), }; MQServcieManager mqManager = new MQServcieManager(); //循环读取所有已存在的区号列表 List <string> citycodeList = CityCodeDataManager.GetAllCityCodeList(); foreach (var item in citycodeList) { InitMonitorCityCode(mqManager, config, item); } //监听“创建新地区”的队列 MonitorNewParking(mqManager, config); //监听“付款数据”的队列 MonitorPayData(mqManager, config); //日志记录 mqManager.OnShowClientAction = OnActionOutputLog; //动态添加新地区的回调 mqManager.AddClientBusAction = OnActionAddClientBus; //开始执行 mqManager.Start(); Thread tMain = new Thread(() => ThreadMain(mqManager, config)); tMain.IsBackground = true; tMain.Start(); }
static void Test() { MQConfig config = new MQConfig() { HostName = "172.16.1.219", Password = "******", Port = 5672, UserName = "******" }; MQServcieManager manager = new MQServcieManager(); manager.AddService(new DemoService(config)); manager.OnAction = OnActionOutput; manager.Start(); Console.WriteLine("服务已启动"); Console.ReadKey(); manager.Stop(); Console.WriteLine("服务已停止,按任意键退出..."); Console.ReadKey(); }
/// <summary> /// 子线程 /// 接收MQ返回的结果 /// </summary> /// <param name="mqManager"></param> /// <param name="config"></param> /// <param name="e"></param> private static void MonitorResult(MQServcieManager mqManager, MQConfig config) { while (true) { Thread.Sleep(300); while (MQOffLineCameraMsg.MQOffLineCameraMsgQueue != null && MQOffLineCameraMsg.MQOffLineCameraMsgQueue.Count > 0) { //循环读取返回数据 string mqMessage = string.Empty; MQOffLineCameraMsg.MQOffLineCameraMsgQueue.TryDequeue(out mqMessage); if (!string.IsNullOrEmpty(mqMessage)) { m_ilogger.LogInfo(LoggerLogicEnum.Tools, "", "", "", "Fujica.com.cn.MonitorService.MonitorMQData.MonitorResult", "接收到MQ的发送的命令:" + mqMessage); try { //Match routingkeyMatch = Regex.Match(mqMessage.RoutingKey, @"\.(?<cityCode>\d{4})\.(?<command>.*)"); //string cityCode = routingkeyMatch.Success ? routingkeyMatch.Groups["cityCode"].Value : ""; //string commandStr = routingkeyMatch.Success ? routingkeyMatch.Groups["command"].Value : ""; CommandEntity <object> mqCityCodeModel = m_serializer.Deserialize <CommandEntity <object> >(mqMessage); if (mqCityCodeModel != null && mqCityCodeModel.message != null) { string messageContent = Convert.ToString(mqCityCodeModel.message); if (mqCityCodeModel.command == BussineCommand.Broadcast) { //入场数据 EntryDataManager.RedisSetData(Convert.ToString(mqCityCodeModel.message), m_ilogger); } else if (mqCityCodeModel.command == BussineCommand.BroadcastOut) { //出场数据 ExitDataManager.RedisSetData(Convert.ToString(mqCityCodeModel.message), m_ilogger); } else if (mqCityCodeModel.command == BussineCommand.Inductance) { //压地感数据 ExitPayDataManager.RedisSetData(Convert.ToString(mqCityCodeModel.message), m_ilogger); } else if (mqCityCodeModel.command == BussineCommand.GateCatch) { //车道拦截数据 GateCatchDataManager.RedisSetData(Convert.ToString(mqCityCodeModel.message), m_ilogger); } else if (mqCityCodeModel.command == BussineCommand.HeartBeat) { //相机心跳数据 HeartBeatDataManager.RedisSetData(Convert.ToString(mqCityCodeModel.message), m_ilogger); } //else if (mqMessage.RoutingKey.IndexOf(BussineCommand.NewCityCode.ToString()) > 0) //{ // //创建新地区,则创建消费者监听该新地区的数据 // string newCityCode = mqMessage.Content; // DynamicAddMonitorCityCode(mqManager, config, newCityCode); //} else { m_ilogger.LogError(LoggerLogicEnum.Tools, "", "", "", "Fujica.com.cn.MonitorService.MonitorMQData.MonitorResult", "接收MQ无法识别命令类型:" + mqMessage); } } } catch (Exception ex) { //考虑redis挂掉,建立副数据库连接 m_ilogger.LogFatal(LoggerLogicEnum.Tools, "", "", "", "Fujica.com.cn.MonitorService.MonitorMQData.MonitorResult", "接收MQ返回的结果进行解析异常", ex.ToString()); } } } while (MQOnLineMsg.MQSaveCityCodeMsgQueue != null && MQOnLineMsg.MQSaveCityCodeMsgQueue.Count > 0) { string mqMessage = string.Empty; MQOnLineMsg.MQSaveCityCodeMsgQueue.TryDequeue(out mqMessage); if (!string.IsNullOrEmpty(mqMessage)) { MQPackongVehicleEntry mqModel = m_serializer.Deserialize <MQPackongVehicleEntry>(mqMessage); if (mqModel != null) { if (mqModel.rabbitMQType == RabbitMQProduserMsgType.YunParkPayData_topic) { //支付数据(月卡续费、储值卡充值) PayDataManager.RedisSetData(mqModel.json, m_ilogger); } else if (mqModel.rabbitMQType == RabbitMQProduserMsgType.Other01Type_direct) { CommandEntity <CityCodeModel> mqCityCodeModel = m_serializer.Deserialize <CommandEntity <CityCodeModel> >(mqModel.json); if (mqCityCodeModel != null && mqCityCodeModel.message != null) { if (!string.IsNullOrEmpty(mqCityCodeModel.message.CodeID)) { //创建新地区,则创建消费者监听该新地区的数据 DynamicAddMonitorCityCode(mqManager, config, mqCityCodeModel.message.CodeID); } } } } } } } }