SpringBoot执行含子转换的Pentaho Job时路径参数报错咨询
已成功通过SpringBoot执行Pentaho任务(Job)和转换(Transformation),但执行包含通过${Internal.Job.Filename.Directory}参数关联子转换的Pentaho Job时出现异常。该配置在Pentaho PDI中可正常运行,但在SpringBoot代码中执行时,出现转换路径无效的报错:
2022/10/10 10:51:04 - data-fetch - Starting entry [Check S3 DB Connections] 2022-10-10T10:51:04.632+0530 (org.pentaho.di.job.Job) [http-nio-8085-exec-10] INFO - [src/main/resources/pentaho/data-fetch.kjb] Starting entry [Check S3 DB Connections] 2022/10/10 10:51:14 - data-fetch - Starting entry [S3-Transformation] 2022-10-10T10:51:14.828+0530 (org.pentaho.di.job.Job) [http-nio-8085-exec-10] INFO - [src/main/resources/pentaho/data-fetch.kjb] Starting entry [S3-Transformation] 2022/10/10 10:51:14 - S3-Transformation - ERROR (version 9.0.0.1-497, build 9.0.0.1-497 from 2020-03-19 08.25.00 by buildguy) : Unable to run job data-fetch. The S3-Transformation has an error. The transformation path ${Internal.Job.Filename.Directory}/S3-fetch.ktr is invalid, and will not run successfully. 2022/10/10 10:51:14 - S3-Transformation - ERROR (version 9.0.0.1-497, build 9.0.0.1-497 from 2020-03-19 08.25.00 by buildguy) : org.pentaho.di.core.exception.KettleXMLException: 2022/10/10 10:51:14 - S3-Transformation - The transformation path ${Internal.Job.Filename.Directory}/S3-fetch.ktr is invalid, and will not run successfully.
疑问:是否需要使用其他参数来解决该问题?
核心原因:SpringBoot执行场景下,Pentaho无法正确解析
${Internal.Job.Filename.Directory}——这个内部变量依赖Job文件的物理文件系统路径,但SpringBoot打包后资源文件位于Jar包内部,不存在真实的磁盘目录;或者Job加载方式未触发该参数的自动初始化。可行解决办法:
自定义参数替代内部变量
在SpringBoot代码中手动定义一个自定义参数(比如JOB_DIR),指定子转换的实际路径(可以是Jar内资源路径或外部目录路径):JobMeta jobMeta = new JobMeta(jobPath, null); // 替换为你的Job文件所在的实际路径 jobMeta.setParameterValue("JOB_DIR", "/opt/pentaho-jobs/"); Job job = new Job(null, jobMeta); job.start();然后在Pentaho Job中,将子转换的路径修改为
${JOB_DIR}/S3-fetch.ktr。将Pentaho资源移至外部目录
把kjb和ktr文件从SpringBoot的resources目录迁移到服务器的外部目录(比如/opt/pentaho-resources/),这样${Internal.Job.Filename.Directory}就能正确指向该外部目录,无需修改参数配置。手动初始化内部参数
在加载Job时直接给Internal.Job.Filename.Directory赋值:JobMeta jobMeta = new JobMeta(jobPath, null); // 设置为Job文件所在的实际目录路径 jobMeta.setParameterValue("Internal.Job.Filename.Directory", getJobDirectory()); Job job = new Job(null, jobMeta); job.start();
内容的提问来源于stack exchange,提问作者Leofierus

