-
Notifications
You must be signed in to change notification settings - Fork 188
04.Callback功能|EL表达式来动态断言执行成功还是失败
如果定义了Success 那么父job执行成功没有报错则运行 Success定义的回调
如果定义了Fail 那么父job执行失败 则运行 Fail定义的回调
Success 里面还可以定义 Success 和 Fail
Fail 里面还可以定义 Success 和 Fail
字段 | 说明 |
---|---|
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的!
举例:
JobA本身执行错误的话则会走重试逻辑(如果开启重试的话),重试到顶后 进入 Fail B, Fail B 执行成功 则进入 Success BB。如果Success BB 执行成功,那么 JobA 则认为是成功的,否则认为失败!
JobA本身执行错误的话则会走重试逻辑(如果开启重试的话),重试到顶后 进入 Fail B, Fail B 执行失败 则进入 Fail BB 。Fail BB 执行失败,那么 JobA 认为失败!
Fail B 执行成功 进入 Success C, Success C,执行成功 认为 JobA 认为成功,否则 Job A 认为失败!
首先要介绍下 dashbord里面的 全局配置 功能 如下图:
- 全局配置 :存储在当前目录下的 hangfire_global.json 文件(可以在StartUp代码修改HangfireHttpJobOptions.GlobalSettingJsonFilePath值指定其他地方)
占位符功能采用Spring.EL表达式实现的。
字符串中placeholder替换逻辑
- 第一步:把字符串中的 ${xxx} 的xxx全部替换成 全局配置里面的值
- 第二步:把字符串中的 #{yyy} 的yyy则是el表达式,会按照SpringEL表达式逻辑运行后的值进行替换
如果运行失败传给callback是报错信息
可以直接在 #{} 方法里面用DateTime这个变量 这个变量和c#一样的功能
比如
- #{DateTime.Now} 代表运行时的当前时间+时分秒
- #{DateTime.Today} 代表运行时的当天
- #{DateTime.Today.AddDays(-1)} 代表运行时的昨天
- #{DateTime.Today.AddDays(1)} 代表运行时的明天
是采用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转的) |
在HangfireHttpJobOptions里面新添加了一个SpelVarDictionary配置,用来满足希望post内容里面采用SPEL表达式的变量,支持普通变量也支持静态方法变量 举个例子
dataTime 是动态的当前时间
callData 是调用了通过SpelVarDictionary注册的方法 key为你需要调用方法的别名,value是方法委托
//定义一个委托
public delegate string MethodA(string arg1, string arg2);
我在callData的值用了SPEL表达式:
"#{#methodA('a','dd')}"
这个methodA 就是上图通过SpelVarDictionary注册了一个方法叫methodA 它接收2个string类型的参数 返回的是一个String
执行日志可以看出来 SPEL表达式正确执行并且掉了你注册的方法