|
|
@@ -108,11 +108,6 @@ namespace YSAI.Core.relay
|
|
|
/// </summary>
|
|
|
private ConcurrentQueue<QueueData> DataQueue;
|
|
|
|
|
|
- /// <summary>
|
|
|
- /// 全局TOKEN
|
|
|
- /// </summary>
|
|
|
- private CancellationTokenSource tokenSource;
|
|
|
-
|
|
|
/// <summary>
|
|
|
/// 队列里面的数据
|
|
|
/// </summary>
|
|
|
@@ -142,16 +137,17 @@ namespace YSAI.Core.relay
|
|
|
//起一个新线程
|
|
|
return Task.Factory.StartNew(() =>
|
|
|
{
|
|
|
- //程序集
|
|
|
- if (TypeIoc == null)
|
|
|
+ //打开失败监控
|
|
|
+ if (OnFailToken == null)
|
|
|
{
|
|
|
- TypeIoc = new ConcurrentDictionary<string, Type>();
|
|
|
+ OnFailToken = new CancellationTokenSource();
|
|
|
+ OnFailTask = OnFailTaskHandler(OnFailToken);
|
|
|
}
|
|
|
|
|
|
- //生命周期
|
|
|
- if (tokenSource == null)
|
|
|
+ //程序集
|
|
|
+ if (TypeIoc == null)
|
|
|
{
|
|
|
- tokenSource = new CancellationTokenSource();
|
|
|
+ TypeIoc = new ConcurrentDictionary<string, Type>();
|
|
|
}
|
|
|
|
|
|
if (basics != null)
|
|
|
@@ -558,6 +554,60 @@ namespace YSAI.Core.relay
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 打开失败的实例对象,用于重新打开使用
|
|
|
+ /// </summary>
|
|
|
+ private ConcurrentDictionary<string, IRelay> OnFailIoc = new ConcurrentDictionary<string, IRelay>();
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 打开失败处理任务的生命周期
|
|
|
+ /// </summary>
|
|
|
+ private CancellationTokenSource OnFailToken;
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 打开失败任务处理间隔
|
|
|
+ /// </summary>
|
|
|
+ private int OnFailTaskHandlerInterval = 1000;
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 打开失败的任务
|
|
|
+ /// </summary>
|
|
|
+ private Task OnFailTask;
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 打开失败重新打开的任务
|
|
|
+ /// </summary>
|
|
|
+ /// <returns></returns>
|
|
|
+ private Task OnFailTaskHandler(CancellationTokenSource tokenSource)
|
|
|
+ {
|
|
|
+ return Task.Factory.StartNew(() =>
|
|
|
+ {
|
|
|
+ //打开成功的SN
|
|
|
+ List<string> OnSucceedSN = new List<string>();
|
|
|
+ while (!tokenSource.IsCancellationRequested)
|
|
|
+ {
|
|
|
+ //重新打开
|
|
|
+ foreach (var item in OnFailIoc)
|
|
|
+ {
|
|
|
+ if (item.Value.On().State)
|
|
|
+ {
|
|
|
+ OnSucceedSN.Add(item.Key);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //打开成功后从失败的IOC中移除
|
|
|
+ foreach (var item in OnSucceedSN)
|
|
|
+ {
|
|
|
+ OnFailIoc.Remove(item, out _);
|
|
|
+ }
|
|
|
+ //清空打开成功的数组
|
|
|
+ OnSucceedSN.Clear();
|
|
|
+ //休眠时间
|
|
|
+ Thread.Sleep(OnFailTaskHandlerInterval);
|
|
|
+ }
|
|
|
+ }, tokenSource.Token);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// 通过配置创建实例
|
|
|
/// </summary>
|
|
|
@@ -579,8 +629,14 @@ namespace YSAI.Core.relay
|
|
|
//自动打开
|
|
|
if (basics.AutoOn)
|
|
|
{
|
|
|
- //执行打开方法
|
|
|
+ //执行打开方法
|
|
|
OperateResult operateResult = instance.On();
|
|
|
+ //如果打开状态为失败
|
|
|
+ if (!operateResult.State)
|
|
|
+ {
|
|
|
+ //添加到打开失败重新打开流程中
|
|
|
+ OnFailIoc.AddOrUpdate(InstanceIocSN, instance, (k, v) => instance);
|
|
|
+ }
|
|
|
//抛出信息
|
|
|
OnEventHandler(this, new EventResult(operateResult.State, $"{InstanceIocSN} 实例创建成功,自动打开{(operateResult.State ? "成功" : "失败")}"));
|
|
|
}
|
|
|
@@ -741,6 +797,12 @@ namespace YSAI.Core.relay
|
|
|
/// </summary>
|
|
|
public void Dispose()
|
|
|
{
|
|
|
+ if (OnFailToken != null)
|
|
|
+ {
|
|
|
+ OnFailToken.Cancel();
|
|
|
+ OnFailTask.Wait();
|
|
|
+ OnFailTask.Dispose();
|
|
|
+ }
|
|
|
//任务清空
|
|
|
if (TaskArray != null)
|
|
|
{
|