mirror of
https://gitee.com/langsisi_admin/serein-flow
synced 2026-03-02 15:50:47 +08:00
1. 修改了FlowResult的创建方式,新增了IsSuccess与Message,为后续进行流程日志追踪准备。
2. 修复了删除节点时,没有正确消除与之相关的参数获取关系。 3. IFlowNode新增了StartFlowAsync方法。 4. Library项目中FlowNodeExtension拓展类转移到了NodeFlow项目中。 5. 修改了Script自定义参数保存,对参数类型、返回值类型进行保存。 6. Library.Utils.BenchmarkHelpter中添加了Task、Task<>的重载方法。 7. NodeFlow项目中,FlowEnvironment默认使用通过NewtonsoftJson实现的JSON门户类。 8. NodeFlow项目中,FlowControl缓存了 FlowWorkOptions 选项实体,并且对于 FlowWorkManagement 进行了池化管理(但后续的项目中考虑重构流程任务运行时)。
This commit is contained in:
@@ -265,7 +265,8 @@ namespace Serein.Library.Api
|
||||
}
|
||||
else
|
||||
{
|
||||
Result = value.ToString();
|
||||
var type = value.GetType();
|
||||
Result = $"{type.FullName}::{value}";
|
||||
}
|
||||
}
|
||||
public void UploadParameters(object[] values = null)
|
||||
|
||||
@@ -120,5 +120,13 @@ namespace Serein.Library.Api
|
||||
/// <param name="token"></param>
|
||||
/// <returns></returns>
|
||||
Task<FlowResult> ExecutingAsync(IFlowContext context, CancellationToken token);
|
||||
|
||||
/// <summary>
|
||||
/// 以该节点开始执行流程,通常用于流程的入口节点。
|
||||
/// </summary>
|
||||
/// <param name="context"></param>
|
||||
/// <param name="token"></param>
|
||||
/// <returns></returns>
|
||||
Task<FlowResult> StartFlowAsync(IFlowContext context, CancellationToken token);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -224,7 +224,7 @@ namespace Serein.Library
|
||||
/// <param name="data"></param>
|
||||
public void AddOrUpdate(string nodeModel, object data)
|
||||
{
|
||||
var flowData = new FlowResult(nodeModel, this, data);
|
||||
var flowData = FlowResult.OK(nodeModel, this, data);
|
||||
dictNodeFlowData.AddOrUpdate(nodeModel, _ => flowData, (o, n) => flowData);
|
||||
}
|
||||
|
||||
|
||||
@@ -31,23 +31,35 @@ namespace Serein.Library
|
||||
/// </summary>
|
||||
/// <param name="nodeGuid"></param>
|
||||
/// <param name="context"></param>
|
||||
public FlowResult(string nodeGuid, IFlowContext context, object value)
|
||||
public static FlowResult OK(string nodeGuid, IFlowContext context, object value)
|
||||
{
|
||||
this.SourceNodeGuid = nodeGuid;
|
||||
this.ContextGuid = context.Guid;
|
||||
this.Value = value;
|
||||
FlowResult flowResult = new FlowResult
|
||||
{
|
||||
SourceNodeGuid = nodeGuid,
|
||||
ContextGuid = context.Guid,
|
||||
Value = value,
|
||||
IsSuccess = true,
|
||||
};
|
||||
return flowResult;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 空返回值
|
||||
/// 失败
|
||||
/// </summary>
|
||||
/// <param name="nodeGuid"></param>
|
||||
/// <param name="context"></param>
|
||||
public FlowResult(string nodeGuid, IFlowContext context)
|
||||
/// <param name="message"></param>
|
||||
public static FlowResult Fail(string nodeGuid, IFlowContext context, string message)
|
||||
{
|
||||
this.SourceNodeGuid = nodeGuid;
|
||||
this.ContextGuid = context.Guid;
|
||||
this.Value = Unit.Default;
|
||||
FlowResult flowResult = new FlowResult
|
||||
{
|
||||
SourceNodeGuid = nodeGuid,
|
||||
ContextGuid = context.Guid,
|
||||
Value = Unit.Default,
|
||||
IsSuccess = true,
|
||||
Message = message,
|
||||
};
|
||||
return flowResult;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -72,16 +84,26 @@ namespace Serein.Library
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 指示是否成功
|
||||
/// </summary>
|
||||
public bool IsSuccess { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 执行结果消息(提示异常)
|
||||
/// </summary>
|
||||
public string Message { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 来源节点Guid
|
||||
/// </summary>
|
||||
public string SourceNodeGuid{ get; }
|
||||
public string SourceNodeGuid{ get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// 来源上下文Guid
|
||||
/// </summary>
|
||||
public string ContextGuid { get; }
|
||||
public string ContextGuid { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// 数据值
|
||||
/// </summary>
|
||||
|
||||
@@ -300,7 +300,7 @@ namespace Serein.Library
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
flowResult = new FlowResult(currentNode.Guid, context);
|
||||
flowResult = FlowResult.Fail(currentNode.Guid, context, ex.Message);
|
||||
context.Env.WriteLine(InfoType.ERROR, $"节点[{currentNode}]异常:" + ex);
|
||||
context.NextOrientation = ConnectionInvokeType.IsError;
|
||||
context.ExceptionOfRuning = ex;
|
||||
|
||||
@@ -55,6 +55,7 @@
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Compile Remove="Extension\FlowModelExtension.cs" />
|
||||
<Compile Remove="FlowNode\Attribute.cs" />
|
||||
<Compile Remove="FlowNode\NodeModelBaseData.cs" />
|
||||
<Compile Remove="FlowNode\NodeModelBaseFunc.cs" />
|
||||
|
||||
@@ -74,6 +74,36 @@ namespace Serein.Library.Utils
|
||||
SereinEnv.WriteLine(InfoType.INFO, $"最小耗时:{min} 毫秒");
|
||||
SereinEnv.WriteLine(InfoType.INFO, $"平均耗时:{avg} 毫秒");
|
||||
}
|
||||
/// <summary>
|
||||
/// 运行指定异步方法多次并输出耗时的最大、最小和平均值。
|
||||
/// </summary>
|
||||
/// <param name="task">需要执行的异步方法</param>
|
||||
/// <param name="count">执行次数,默认10000</param>
|
||||
public static async Task BenchmarkAsync(Task task, int count = 10000)
|
||||
{
|
||||
double max = double.MinValue;
|
||||
double min = double.MaxValue;
|
||||
double total = 0;
|
||||
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
var sw = Stopwatch.StartNew();
|
||||
await task;
|
||||
sw.Stop();
|
||||
|
||||
double ms = sw.Elapsed.TotalMilliseconds;
|
||||
if (ms > max) max = ms;
|
||||
if (ms < min) min = ms;
|
||||
total += ms;
|
||||
}
|
||||
|
||||
double avg = total / count;
|
||||
SereinEnv.WriteLine(InfoType.INFO, $"运行 {count} 次:");
|
||||
SereinEnv.WriteLine(InfoType.INFO, $"总耗时 :{total} 毫秒:");
|
||||
SereinEnv.WriteLine(InfoType.INFO, $"最大耗时:{max} 毫秒");
|
||||
SereinEnv.WriteLine(InfoType.INFO, $"最小耗时:{min} 毫秒");
|
||||
SereinEnv.WriteLine(InfoType.INFO, $"平均耗时:{avg} 毫秒");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 运行指定异步方法多次并输出耗时的最大、最小和平均值。
|
||||
@@ -99,6 +129,38 @@ namespace Serein.Library.Utils
|
||||
//Console.WriteLine($"第{count}次: 耗时 {ms} ms");
|
||||
}
|
||||
|
||||
double avg = total / count;
|
||||
SereinEnv.WriteLine(InfoType.INFO, $"运行 {count} 次:");
|
||||
SereinEnv.WriteLine(InfoType.INFO, $"总耗时 :{total} 毫秒:");
|
||||
SereinEnv.WriteLine(InfoType.INFO, $"最大耗时:{max} 毫秒");
|
||||
SereinEnv.WriteLine(InfoType.INFO, $"最小耗时:{min} 毫秒");
|
||||
SereinEnv.WriteLine(InfoType.INFO, $"平均耗时:{avg} 毫秒");
|
||||
return result;
|
||||
}
|
||||
/// <summary>
|
||||
/// 运行指定异步方法多次并输出耗时的最大、最小和平均值。
|
||||
/// </summary>
|
||||
/// <param name="task">需要执行的异步方法</param>
|
||||
/// <param name="count">执行次数,默认10000</param>
|
||||
public static async Task<TReult> BenchmarkAsync<TReult>(Task<TReult> task, int count = 10000)
|
||||
{
|
||||
double max = double.MinValue;
|
||||
double min = double.MaxValue;
|
||||
double total = 0;
|
||||
TReult result = default;
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
var sw = Stopwatch.StartNew();
|
||||
result = await task;
|
||||
sw.Stop();
|
||||
|
||||
double ms = sw.Elapsed.TotalMilliseconds;
|
||||
if (ms > max) max = ms;
|
||||
if (ms < min) min = ms;
|
||||
total += ms;
|
||||
//Console.WriteLine($"第{count}次: 耗时 {ms} ms");
|
||||
}
|
||||
|
||||
double avg = total / count;
|
||||
SereinEnv.WriteLine(InfoType.INFO, $"运行 {count} 次:");
|
||||
SereinEnv.WriteLine(InfoType.INFO, $"总耗时 :{total} 毫秒:");
|
||||
|
||||
Reference in New Issue
Block a user