永洪社区

标题: 干货分享-永洪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发展这么迅速,就算你不懂代码,只要把想法跟它说,它就会提供给你完整的代码。所以实现一个功能,代码不是最重要的,它只是一个实现的工具,有太多的方式可以选择,想法和创意才是最重要的。
  1. @GetMapping(value = "report")
  2. public String Report(@RequestParam(name = "operator",defaultValue = "robot") String operator){
  3.   String path = "/opt/kettle/cron_job/java";
  4.   String command = "./spring_kettle.sh";
  5.   logInfo.info("开始执行");
  6.   Boolean isSuccess = reportShell.autoRunShell(path, command, operator);
  7.   logInfo.info("任务结束");
  8.   return isSuccess?"成功":"失败";
  9. }
复制代码

  1. /**
  2.    * 自动执行shell脚本
  3.    * @param paths 文件路径
  4.    * @param commands 执行命令 以及参数
  5.    * 参数commands从String修改为String...
  6.    * @return 执行成功与否
  7.    */
  8. public static Boolean autoRunShell(String paths,String... commands){
  9.   Boolean isSuccess = null;
  10.   try {
  11.     logInfo.info("autoRunShell start...");
  12.     // 1.执行命令,要先切换目录
  13.     ProcessBuilder processBuilder = new ProcessBuilder();
  14.     // 切换目标目录
  15.     processBuilder.directory(new File(paths));
  16.     logInfo.info("目录地址:"+paths);
  17.     // 添加要执行的命令
  18.     logInfo.info("将要执行的命令:"+ Arrays.toString(commands));
  19.     processBuilder.command(commands);
  20.     Process ps = processBuilder.start();
  21.     // 阻塞,直到上述命令执行完,返回为0则表示执行成功
  22.     int execStatus = ps.waitFor();
  23.     logInfo.info("autoRunShell execStatus:" + execStatus + ",返回为0表示执行成功");
  24.     logInfo.info("autoRunShell stop...");
  25.     if (execStatus == 0)
  26.       isSuccess = true;
  27.     else
  28.       isSuccess = false;
  29.   } catch (Exception e) {
  30.     isSuccess=false;
  31.     logInfo.info(e.toString());
  32.   }
  33.   return isSuccess;
  34. }
复制代码
        接口的事搞定了,那接下来是如何调用接口的问题。回到报表,我们希望用户点击提交按钮的同时,既将填报数据提交成功,又触发ETL任务执行。但是很遗憾,我们暂时无法实现。经过数次实验得知,永洪的提交组件只能在脚本、超链接、提交操作中三选一,配置了两种以上的功能,在点击按钮时只有一种会生效。也希望永洪后续可以优化一下这一块。

        所以我们需要单独用一个按钮来设置超链接,触发ETL任务。经过测试,当调用post请求时,内嵌参数中的参数无法传回到服务器。只有使用get请求时,下方的参数才会传回到服务器,所以我们在定义接口的时候,需要将接口定义为get请求。

(, 下载次数: 0)