/// <summary> /// 对象关闭时登记 /// </summary> public static void OnObjectFailed(IService obj) { Logger.Information("[OnObjectFailed] {0}", obj.ServiceName); bool can; lock (FailedObjects) { FailedObjects.Add(obj); } can = ActiveObjects.Count + FailedObjects.Count == FlowServices.Length; if (can) { ActiveSemaphore.Release(); //发出完成信号 } }
/// <summary> /// 重新启动未正常启动的项目 /// </summary> public static void StartFailed() { if (Interlocked.Increment(ref inFailed) != 1) { return; } var faileds = FailedObjects.ToArray(); if (faileds.Length == 0) { Logger.Information("[StartFailed] all service is runing,no action"); return; } Logger.Information("[StartFailed>>"); FailedObjects.Clear(); foreach (var service in faileds) { try { Logger.Information("[StartFailed] {0}", service.ServiceName); service.Open(); } catch (Exception e) { Logger.Exception(e, "[StartFailed] {0}", service.ServiceName); } } //等待所有对象信号(全开或全关) ActiveSemaphore.Wait(); Interlocked.Decrement(ref inFailed); Logger.Information("<<StartFailed]"); }