找文章 / 找答案
  • 发帖数762
  • 粉丝7

此人很懒,什么也没有留下

精选问答 更多内容

[永洪方案库] 干货分享-永洪BI开发小技巧之报表中调用接口

朝花夕拾白银三 显示全部楼层 发表于 2024-9-12 15:20:52 |阅读模式 打印 上一主题 下一主题
本帖最后由 朝花夕拾 于 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请求。

超链接设置.png
图1-超链接设置界面

        很不巧datax和DolphinScheduler触发任务的接口都是POST请求,所以这时候我们就得写一个get请求,来封装ETL工具提供的post请求。代码这里就不提供啦,大家可以动用AI和搜索引擎去找一下。

WPS图片(1).png
图2 -datax触发任务接口

WPS图片.png
图3 -DolphinScheduler触发任务接口

        如图1所示,接口都改为get请求后,在超链接中输入接口URL,下方设置接口调用时需要传递的参数,如果报表中已经定义好了参数,则需要勾选下方传递报告参数,就可以直接将报告的参数也传递给服务器。目标窗口最好选新窗口,其他的效果都不太好。全部内容设置好之后,我们点击按钮就可以触发ETL任务执行了。

        至此就是该方法的所有步骤,感谢大家的阅读,有兴趣的朋友可以一起学习交流。


        注意:
            1)永洪服务器需要和接口服务器打通,保证两个服务器连接是互通的。
            2)本文方法只可发送请求,无法接收接口返回值。
            3)适用版本:永洪9以上


回复

使用道具 举报

精彩评论35

yhbi老6了青铜四 显示全部楼层 发表于 2024-9-12 15:28:32
好!!!让我顿悟了一下
回复 支持 反对

使用道具 举报

东海老四白银一 显示全部楼层 发表于 2024-9-12 15:30:07
666
回复

使用道具 举报

朝花夕拾白银三 显示全部楼层 发表于 2024-9-12 15:31:57
yhbi老6了 发表于 2024-9-12 15:28
好!!!让我顿悟了一下

哈哈  相互学习
回复 支持 反对

使用道具 举报

puffs 显示全部楼层 发表于 2024-9-12 15:44:01
厉害厉害,学习了
回复 支持 反对

使用道具 举报

我是卡拉米青铜四 显示全部楼层 发表于 2024-9-12 16:09:12
小卡拉米带着板凳来学习了
回复 支持 反对

使用道具 举报

happypanda白银三 显示全部楼层 发表于 2024-9-12 16:37:21
厉害
回复

使用道具 举报

防超白银三 显示全部楼层 发表于 2024-9-12 16:56:39
给力
回复

使用道具 举报

yhdata青铜一 显示全部楼层 发表于 2024-9-12 16:59:33
厉害
回复

使用道具 举报

yhdata_白银一 显示全部楼层 发表于 2024-9-12 17:42:04
正好用上
回复

使用道具 举报

高级模式
您需要登录后才可以回帖 登录 | 免费注册

  • 官方微信

    欢迎关注永洪服务号!收费为0,价值无限

    扫码关注
  • 新浪微博

    让每位用户轻松挖掘数据价值!

    访问新浪微博
  • 智能客服
50W

会员等你来哦

Copyright   ©2012-2024  北京永洪商智科技有限公司  (京ICP备12050607) 京公网安备110110802011451号 |《永洪社区协议》
返回顶部