Skip to content

Snail-job 工作流回调节点

回调通知

  1. 可以配置相对应的api接口及秘钥做相应通知

  2. 当前支持两种请求类型:

    1. “ application/json”
    2. “application/x-www-form-urlencoded”
  3. 支持传递当前工作流的上下文

Tip:目前回调通知使用的是同步调度,执行耗时较长的回调通知会影响工作流整体的执行周期和服务端的稳健性,预计在1.3.0版本下线回调节点,请使用内置的Http执行器以任务节点的形式配置回调通知,内置的Http执行器在工作流模式下,默认支持传递上下文(以K,V形式封装在请求头中)

使用介绍

页面配置

image-20240918154230292

相关接口

java
// 此时页面需要配置的webhook地址为 http://{ip}:{port}/workflow/callback
// 即可完成回调通知

@RestController
@RequestMapping("/workflow")
@Slf4j
@Tag(name = "工作流回调", description = "工作流回调")
public class WorkflowCallbackController {

    @PostMapping("/callback")
    public void callback(@RequestBody CallbackParamsDTO object, @RequestHeader HttpHeaders headers) {
        // object 对象可以获取到当前回调通知之前的上下文内容
        log.info("callback: {}, secret:{} secret:{}", object, "secret", headers.getFirst("secret"));
    }
}

新版本Http内置执行器 —— 回调使用

新增回调节点

​ 按照自定义http内置执行器配置,配置详情参考官网内置执行器配置详情。

Tip若需要在回调节点中传递含有中文字符的上下文,会对对应上下文中的值进行base64编码,后续使用时,需要自己解码一下;注意上下文中的Key不能使用中文

image-20240918154230292

工作流配置Demo

工作流页面配置

image-20240918154230292

工作流初始化参数

image-20240918154230292

动态上下文(job demo)

java
@Component
@JobExecutor(name = "testJobExecutor")
public class TestAnnoJobExecutor {
    @Autowired
    private SnailJobProperties snailJobProperties;

    public ExecuteResult jobExecute(JobArgs jobArgs) {
        System.out.println(jobArgs.getWfContext());
        System.out.println(jobArgs.getJobParams());
        // 动态插入
        jobArgs.appendContext("testCode", "test新增成功test");
        return ExecuteResult.success("测试成功" + snailJobProperties.getPort());
    }
}

回调节点

java
@RestController
public class TestCallback {

    @PostMapping("/testCallback")
    public void testCallback(@RequestHeader HttpHeaders httpHeaders){
        // 解析中文编码的上下文
        // 进行Base64解码
        byte[] decodedBytes = Base64.getDecoder().decode(httpHeaders.getFirst("testCode"));
        String decodedString = new String(decodedBytes);
        System.out.println("中文解码后的: " + decodedString);
        Map<String, String> singleValueMap = httpHeaders.toSingleValueMap();
        for (Map.Entry<String, String> entry : singleValueMap.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
    }
}

控制台输出内容

shell
中文解码后的: testCode/test新增成功test
testcode: dGVzdOaWsOWinuaIkOWKn3Rlc3Q=
testboolean: false
accept: text/html,application/json,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
testnumber: 123
testcallback: callback
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36 Hutool
namespace: 764d604ec6fc45f68cd92514c40e9e1a
accept-encoding: gzip, deflate
content-length: 2
group: unit_shard_group
token: SJ_09h0LUDxcnUKt3oVCYTnwpHb0PuaO2AB
content-type: application/json
cache-control: no-cache
pragma: no-cache
host: 127.0.0.1:9000
connection: keep-alive