[永洪方案库]
干货分享-永洪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请求。
图1-超链接设置界面
很不巧datax和DolphinScheduler触发任务的接口都是POST请求,所以这时候我们就得写一个get请求,来封装ETL工具提供的post请求。代码这里就不提供啦,大家可以动用AI和搜索引擎去找一下。
图2 -datax触发任务接口
图3 -DolphinScheduler触发任务接口
如图1所示,接口都改为get请求后,在超链接中输入接口URL,下方设置接口调用时需要传递的参数,如果报表中已经定义好了参数,则需要勾选下方传递报告参数,就可以直接将报告的参数也传递给服务器。目标窗口最好选新窗口,其他的效果都不太好。全部内容设置好之后,我们点击按钮就可以触发ETL任务执行了。
至此就是该方法的所有步骤,感谢大家的阅读,有兴趣的朋友可以一起学习交流。
注意:
1)永洪服务器需要和接口服务器打通,保证两个服务器连接是互通的。
2)本文方法只可发送请求,无法接收接口返回值。
3)适用版本:永洪9以上
|
|
|
|
|
yhbi老6了
显示全部楼层
发表于 2024-9-12 15:28:32
|
|
|
|
oscarxu
显示全部楼层
发表于 2024-9-12 15:30:07
|
|
|
|
朝花夕拾
显示全部楼层
发表于 2024-9-12 15:31:57
|
|
|
|
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
|
|
|
|