惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

L
LangChain Blog
阮一峰的网络日志
阮一峰的网络日志
WordPress大学
WordPress大学
博客园 - 司徒正美
罗磊的独立博客
D
Docker
Last Week in AI
Last Week in AI
爱范儿
爱范儿
M
MIT News - Artificial intelligence
V
V2EX
Google DeepMind News
Google DeepMind News
小众软件
小众软件
Apple Machine Learning Research
Apple Machine Learning Research
Microsoft Security Blog
Microsoft Security Blog
T
Tailwind CSS Blog
MyScale Blog
MyScale Blog
V
Visual Studio Blog
博客园 - 叶小钗
B
Blog RSS Feed
A
About on SuperTechFans
F
Fortinet All Blogs
T
The Blog of Author Tim Ferriss
Martin Fowler
Martin Fowler
P
Proofpoint News Feed

博客园 - Hey,Coder!

微信小程序 web方案实现调音器功能 systemctl slice配置docker最大占用cpu 内存 pipenv环境变量配置 .net8验证码 数据库差异对比工具 docker部署prometheus grafana pgexporter Alertmanager ubuntu24 换源 ssh配置 ubuntu24 Harbor部署 ubuntu24 kvm部署 cockpit web管理界面 .net api代理 Ubuntu 24.04 DMAR IOMMU 报错修复 uniapp iOS App 上架 vs文件软链接 Docker 网络别名 .net8通用中间件处理公共返回值结构 .net环境下OpenTelemetry Body 读取注意事项 jaeger界面显示异常 .net opentelemetry collector jaeger c# opentelemetry 自定义export c# opentelemetry 自定义export c# 生成对象的初始化代码 Elasticsearch ILM 与 Data Stream 概念及实例说明文档 portainer httphelper封装 Ocelot + Consul + SignalR 粘性会话 正交软件架构 docker postgresql17 主从复制 rabbitmq总结与c#示例 docker rabbitmq quartz dashboard
elsa 3.5 中间件记录最后执行的节点数据
Hey,Coder! · 2026-05-12 · via 博客园 - Hey,Coder!

获取最后执行的节点信息

 public class WorkflowCompletionMiddleware : IWorkflowExecutionMiddleware
 {
     private readonly WorkflowMiddlewareDelegate _next;

     public WorkflowCompletionMiddleware(WorkflowMiddlewareDelegate next)
     {
         this._next = next;
     }

     public async ValueTask InvokeAsync(WorkflowExecutionContext context)
     {
         try
         {
             // 调用下一个中间件
             await _next(context);
         }
         catch (System.Exception)
         {
             //TODO 记录异常日志
             //TODO 更新流程执行异常状态

         }

         //记录流程执行结果
         if (context.Status == WorkflowStatus.Finished)
         {
             var vari = context.Workflow.Variables.ToList();
             var result = context.Variables.ToList();

             var instanceId = context.Id;
             var status = (int)context.SubStatus;

             //此处需要根据实际情况将公共的最外层的流程去掉,只保留业务相关的实际节点
             var lastNode = context.ExecutionLog.LastOrDefault(f => f.ActivityType != "Elsa.Workflow" && f.ActivityType != "Elsa.Flowchart");
             if (lastNode == null)
             {
                 return;
             }

             var activityID = lastNode.ActivityId;
             var activityName = lastNode.ActivityName;

             long startTime = 0;
             long endTime = 0;
             if (lastNode.EventName == "Completed")
             {
                 endTime = lastNode.Timestamp.ToUnixTimeMilliseconds();

                 var startNode = context.ExecutionLog.FirstOrDefault(f => f.ActivityId == lastNode.ActivityId && f.EventName == "Started");
               
                 if (startNode != null)
                 {
                     startTime = startNode.Timestamp.ToUnixTimeMilliseconds();
                 }
             }
             else
             {
                 startTime = lastNode.Timestamp.ToUnixTimeMilliseconds();
             }
         }
     }
 }

记录所有的变量数据

通过定义一个输出变量将所有数据返回,考虑到unicode、特殊字符等问题将数据json之后再base64处理

  var vari = context.Workflow.Variables.ToList();
  var result = context.Variables.ToList();
  var sugar = context.GetService<ISqlSugarClient>();


  var dic = new Dictionary<string, object>();
  foreach (var item in vari)
  {
      var v = JsonConvert.SerializeObject(item.Value);
      dic.Add(item.Name, item.Value);
  }

  var json = JsonConvert.SerializeObject(dic);
  var plainTextBytes = Encoding.UTF8.GetBytes(json);
  var base64Str = Convert.ToBase64String(plainTextBytes);
  context.Output.Add("Out__Result", base64Str);