Skip to content

04.Callback功能|EL表达式来动态断言执行成功还是失败

yuzd edited this page Jun 10, 2021 · 4 revisions

image

如上图 可以自行添加 Success 或者 Fail 作为callback回调

如果定义了Success 那么父job执行成功没有报错则运行 Success定义的回调

如果定义了Fail 那么父job执行失败 则运行 Fail定义的回调

Success 里面还可以定义 Success 和 Fail

Fail 里面还可以定义 Success 和 Fail

image

回调的Json参数

字段 说明
Url 请求Url
Method Post,Get
Data Post时可以填,支持占位符(具体请看下面的介绍)
ContentType application/json
Timeout 超时(毫秒)
BasicUserName basicauth用户名
BasicPassword basicauth密码
AgentClass 基于jobAgent开发的httpjob需要填
Headers key:value 的jsonstring "{"key":,"value"}"
CallbackEL el表达式来判断返回体是否成功还是失败,请查看wiki专门针对这个功能的介绍

回调执行的逻辑

注意:回调不是作为新的的HangfireHttpJob执行的,是依附在最顶级的父Job的!

举例:

image

如果:JobA -》 Fail B -> Success BB

JobA本身执行错误的话则会走重试逻辑(如果开启重试的话),重试到顶后 进入 Fail B, Fail B 执行成功 则进入 Success BB。如果Success BB 执行成功,那么 JobA 则认为是成功的,否则认为失败!

如果:JobA -》 Fail B -> Fail BB

JobA本身执行错误的话则会走重试逻辑(如果开启重试的话),重试到顶后 进入 Fail B, Fail B 执行失败 则进入 Fail BB 。Fail BB 执行失败,那么 JobA 认为失败!

Fail B 执行成功 进入 Success C, Success C,执行成功 认为 JobA 认为成功,否则 Job A 认为失败!

总结:如果有回调 则会按照回调一路走下去,看最后一个回调是否成功。如果成功 则认为整个链路执行成功,否则认为失败!

占位符(placeholder)功能

首先要介绍下 dashbord里面的 全局配置 功能 如下图:

  • 全局配置 :存储在当前目录下的 hangfire_global.json 文件(可以在StartUp代码修改HangfireHttpJobOptions.GlobalSettingJsonFilePath值指定其他地方)

image

image

占位符功能采用Spring.EL表达式实现的。

字符串中placeholder替换逻辑

  • 第一步:把字符串中的 ${xxx} 的xxx全部替换成 全局配置里面的值
  • 第二步:把字符串中的 #{yyy} 的yyy则是el表达式,会按照SpringEL表达式逻辑运行后的值进行替换

例如:使用父job的返回值传给 callback

image

如果运行失败传给callback是报错信息

例如:使用时间替换

可以直接在 #{} 方法里面用DateTime这个变量 这个变量和c#一样的功能

比如

  • #{DateTime.Now} 代表运行时的当前时间+时分秒
  • #{DateTime.Today} 代表运行时的当天
  • #{DateTime.Today.AddDays(-1)} 代表运行时的昨天
  • #{DateTime.Today.AddDays(1)} 代表运行时的明天

image

CallbackEL如何来动态判断返回体是成功还是失败呢?

是采用Spring.EL表达式实现的。 CallbackEL表达式的返回类型是布尔类型

返回体在表达式里面是有下面3个变量:

  • #StatusCode 是请求的Response的StatusCode int类型
  • #resultBody 是返回体的 string
  • #result 是返回体的 json体(根据上面转的,如果上面是非json格式的那就不能使用这个变量了)

如果说我调用的请求的返回不是200的我统统认为是错的 那么我断言的表达式可以这么写 "CallbackEL": "#StatusCode == 200"

比如说我调用的httpjob 返回体是

{"Success":false,"Info":"test"}

那么我可以这么写

"CallbackEL": "#result.Success"

也可以这么写,Info是string 可以用csharp里面的string所有的方法

"CallbackEL": "#result.Info.Equals('ok')"

还可以组合起来 "CallbackEL": "#StatusCode == 200 and #result.Info.Equals('ok')"

EL表达式很强大,更多EL表达式写法请查看Spring.EL

EL表达式内置变量 说明
#resultBody 是返回体的 string
#result 是返回体的 json体(根据返回体的 string转的,如果上面是非json格式的那就不能使用这个变量了)
#StatusCode 是Response的状态code 例如 200 是ok 404 是not found 。。。
#parentBody 是上一级返回体的string
#parent 是上一级返回体的 json体(根据上一级返回体string转的)

20210610新增SpelVarDictionary配置

在HangfireHttpJobOptions里面新添加了一个SpelVarDictionary配置,用来满足希望post内容里面采用SPEL表达式的变量,支持普通变量也支持静态方法变量 举个例子

image

dataTime 是动态的当前时间

callData 是调用了通过SpelVarDictionary注册的方法 key为你需要调用方法的别名,value是方法委托

举个例子?

 //定义一个委托
 public delegate string MethodA(string arg1, string arg2);

image

我在callData的值用了SPEL表达式:

"#{#methodA('a','dd')}"

这个methodA 就是上图通过SpelVarDictionary注册了一个方法叫methodA 它接收2个string类型的参数 返回的是一个String

执行日志可以看出来 SPEL表达式正确执行并且掉了你注册的方法

image