永洪社区
标题: 干货分享-永洪BI开发小技巧之报表中调用接口 [打印本页]
作者: 朝花夕拾 时间: 2024-9-12 15:20
标题: 干货分享-永洪BI开发小技巧之报表中调用接口
本帖最后由 朝花夕拾 于 2024-9-12 15:31 编辑
大家好,今天给大家带了一个永洪报表开发中的小技巧。日常开发中,我们偶尔会有在报表中调用接口的需求。拿我们的项目来说,报表数据大多数是通过ETL工具离线写好后,再到永洪做报表呈现,这样避免了在永洪服务器进行计算,既减少了永洪资源消耗,又大大加快了报表的加载速度。但是离线的方式大多数是每天定时执行的,实时性方面会达不到用户的需求。用户通过填报组件上传更新数据后,希望看到最新的经过计算的数据,这时候因为定时任务一般设置在凌晨,所以正常情况下用户第二天才能看到更新后的数据。
所以我们想了一个方案来解决这个问题,给用户一个可以主动触发ETL任务的功能,让用户可以在填报完成后,自己决定什么时候更新计算数据。那如何从报表来触发ETL执行呢?调用接口。我们用过kettle、DolphinScheduler、datax等ETL工具。其中datax和DolphinScheduler有自带的触发任务执行接口,但是kettle没有,kettle是通过在服务器设置crontab定时来执行的,所以kettle得多一步封装接口的操作,通过java代码或者其他方式,将执行服务器shell文件的命令封装到接口中,供报表调用。
这里放一小段执行shell脚本的关键代码。各位可以实现其他很多功能,现在AI发展这么迅速,就算你不懂代码,只要把想法跟它说,它就会提供给你完整的代码。所以实现一个功能,代码不是最重要的,它只是一个实现的工具,有太多的方式可以选择,想法和创意才是最重要的。
- @GetMapping(value = "report")
- public String Report(@RequestParam(name = "operator",defaultValue = "robot") String operator){
- String path = "/opt/kettle/cron_job/java";
- String command = "./spring_kettle.sh";
- logInfo.info("开始执行");
- Boolean isSuccess = reportShell.autoRunShell(path, command, operator);
- logInfo.info("任务结束");
- return isSuccess?"成功":"失败";
- }
复制代码
- /**
- * 自动执行shell脚本
- * @param paths 文件路径
- * @param commands 执行命令 以及参数
- * 参数commands从String修改为String...
- * @return 执行成功与否
- */
- public static Boolean autoRunShell(String paths,String... commands){
- Boolean isSuccess = null;
- try {
- logInfo.info("autoRunShell start...");
- // 1.执行命令,要先切换目录
- ProcessBuilder processBuilder = new ProcessBuilder();
- // 切换目标目录
- processBuilder.directory(new File(paths));
- logInfo.info("目录地址:"+paths);
- // 添加要执行的命令
- logInfo.info("将要执行的命令:"+ Arrays.toString(commands));
- processBuilder.command(commands);
- Process ps = processBuilder.start();
- // 阻塞,直到上述命令执行完,返回为0则表示执行成功
- int execStatus = ps.waitFor();
- logInfo.info("autoRunShell execStatus:" + execStatus + ",返回为0表示执行成功");
- logInfo.info("autoRunShell stop...");
- if (execStatus == 0)
- isSuccess = true;
- else
- isSuccess = false;
- } catch (Exception e) {
- isSuccess=false;
- logInfo.info(e.toString());
- }
- return isSuccess;
- }
复制代码 接口的事搞定了,那接下来是如何调用接口的问题。回到报表,我们希望用户点击提交按钮的同时,既将填报数据提交成功,又触发ETL任务执行。但是很遗憾,我们暂时无法实现。经过数次实验得知,永洪的提交组件只能在脚本、超链接、提交操作中三选一,配置了两种以上的功能,在点击按钮时只有一种会生效。也希望永洪后续可以优化一下这一块。
所以我们需要单独用一个按钮来设置超链接,触发ETL任务。经过测试,当调用post请求时,内嵌参数中的参数无法传回到服务器。只有使用get请求时,下方的参数才会传回到服务器,所以我们在定义接口的时候,需要将接口定义为get请求。