kettle与Springboot的集成方法,完整支持大数据组件

目录

    • 概要
    • 整体架构流程
    • 技术名词解释
    • 技术细节
    • 小结

概要

在现代数据处理和ETL(提取、转换、加载)流程中,Kettle(Pentaho Data Integration, PDI)作为一种强大的开源ETL工具,被广泛应用于各种数据处理场景。然而,将Kettle集成到Spring Boot项目中时,开发者常常面临诸多挑战。目前网上常见的集成方法大多采用依赖的方式,直接在Spring Boot项目的pom.xml文件中引入Kettle的相关依赖。

然而,这种集成方式存在诸多问题。首先,Kettle底层采用了OSGI(Open Services Gateway Initiative)模块化组件加载方式,这使得一些大数据组件无法完整集成。其次,Kettle自身引用了大量第三方包,导致依赖冲突频繁出现,严重影响项目的稳定性和可维护性。

为了解决这些问题,我尝试了多种集成方法,并找到了一种相对完善的解决方案。该方案的核心思想是通过自定义的加载机制绕过Kettle的OSGI限制,同时对依赖进行精细化管理,避免不必要的冲突。

集成策略

这种集成方式是基于了解Springboot的类加载以及Kettle的类加载方式,找到的一种能够两者都兼容起来的加载方式。

Spring Boot的类加载机制基于JDK的类加载器层级结构,通过LaunchedURLClassLoader支持嵌套JAR文件的加载,并优化了类加载顺序,避免依赖冲突。而Kettle的OSGI机制则通过动态加载和隔离插件模块,实现灵活的功能扩展。传统集成方式中,Spring Boot的类加载器与Kettle的OSGI机制相互冲突,导致部分组件无法正常加载。

因此分析得出Springboot的类加载是自己实现的一套基于LaunchedURLClassLoader的加载,而Kettle的类加载主要是依赖的系统的类加载器。这样的情况下我们可以采用替换系统类加载器的方式实现一套自定义的类加载器对kettle的类加载进行单独处理。

技术细节

这里我们实现一个自定义的类加载器,让他继承URLClassLoader这个加载器,重新实现这个类加载器中的一些方法。

在实现中让类加载单独加载Kettle下的lib和classes目录。

实现这个自定义的类加载器以后,我们还要在启动脚本中添加一些参数,用来替换系统的类加载器

java -Djava.system.class.loader=custloader.CustUrlClassloader -cp ./custloader-0.0.1-SNAPSHOT.jar;“${springboo启动jar包}”  -Dloader.path=./config,./lib

至于kettle和Springboot之间的交互,还需要定义一套交互接口,在Springboot启动的时候通过反射的方式来启动Kettle,需要写一个第三方的代理包用于实现交互接口进行Springboot和Kettle的交互实现。下面是部分关键代码

public void initStart(String[] args,java.util.Map<String,String> databaseinfo) {ClassLoader classLoader=ClassLoader.getSystemClassLoader();//获取系统加载器System.out.println(classLoader.getClass().getName());if(classLoader.getClass().getName().equals("sun.misc.Launcher$AppClassLoader")) {String tip_home = System.getProperty(KETTLE_HOME);String libsPath = tip_home + File.separator + "lib";String classesPath=tip_home + File.separator + "classes";File classesFile=new File(classesPath);if(classesFile.exists()) {System.out.println("load classes libraries from: " + classesPath);//LoadJarsHelper.loadClasses(classesPath);LoadJarsHelper.loadClasses(classesPath);}System.out.println("load libs-jars from: " + libsPath);//LoadJarsHelper.loadJars(libsPath);File libsPathFile=new File(libsPath);if(libsPathFile.exists()) {LoadJarsHelper.loadJars(libsPath);}String os = System.getProperty("os.name");  String bit=System.getProperty("sun.arch.data.model");String swtpath=tip_home+File.separator +"libswt/win64";if(os.toLowerCase().startsWith("win")){  if(bit.equalsIgnoreCase("32")) {swtpath=tip_home+File.separator +"libswt/win32";}else {swtpath=tip_home+File.separator +"libswt/win64";}}else if (os.startsWith("Mac OS")){swtpath=tip_home+File.separator +"libswt/osx64";}else {if(bit.equalsIgnoreCase("32")) {swtpath=tip_home+File.separator +"libswt/linux/x86";}else {swtpath=tip_home+File.separator +"libswt/linux/x86_64";}}System.out.println("load swt from: " + swtpath);File swtpathFile=new File(swtpath);if(swtpathFile.exists()) {LoadJarsHelper.loadJars(swtpath);}}Thread kettleThread=new Thread(new Runnable() {public void run() {try {Thread.currentThread().setContextClassLoader(classLoader);Class<?> clazz = classLoader.loadClass("xx.xx.xx.KettleService");IKettleService instance = (IKettleService) clazz.newInstance();Method mainMethod  =  clazz.getMethod("start", String[].class,Map.class);if(args.length>1) {List<String> objs=new ArrayList<String>();for(int i=1;i<args.length;i++) {if(i==1) {if(!args[i].equals("")) {objs.add(args[i]);}}else {objs.add(args[i]);}}String[] o=objs.toArray(new String[objs.size()]);mainMethod.invoke(instance,  (Object)o,databaseinfo);}else {String[] objs=new String[0];mainMethod.invoke(instance,  (Object)objs,databaseinfo);}KettleService.setDatabaseManager(instance.getDatabaseManager());//接口实现KettleService.setJobManager(instance.getJobManager());KettleService.setMetaManager(instance.getMetaManager());KettleService.setModelManager(instance.getModelManager());KettleService.setRepositoryDirectoryManager(instance.getRepositoryDirectoryManager());KettleService.setTransManager(instance.getTransManager());KettleService.setLogManager(instance.getLogManager());KettleService.setJmxService(instance);		              KettleService.addLogListener();} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (NoSuchMethodException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (SecurityException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalArgumentException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (InvocationTargetException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (InstantiationException e) {// TODO Auto-generated catch blocke.printStackTrace();}}});kettleThread.start();}

小结

通过上述技术细节,我成功实现了一种兼容Spring Boot和Kettle的类加载机制。这种集成方式不仅解决了传统依赖集成的诸多弊端,还实现了Kettle功能的完整扩展,为Spring Boot项目中的数据处理提供了更灵活、高效的解决方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/6294.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux探秘坊-------5.git

1.git介绍 1.版本控制器 为了能够更⽅便我们管理这些不同版本的⽂件&#xff0c;便有了版本控制器。所谓的版本控制器&#xff0c;就是能让你了解到⼀个⽂件的历史&#xff0c;以及它的发展过程的系统。通俗的讲就是⼀个可以记录⼯程的每⼀次改动和版本迭代的⼀个管理系统&am…

Linux网络之TCP

Socket编程--TCP TCP与UDP协议使用的套接字接口比较相似, 但TCP需要使用的接口更多, 细节也会更多. 接口 socket和bind不仅udp需要用到, tcp也需要. 此外还要用到三个函数: 服务端 1. int listen(int sockfd, int backlog); 头文件#include <sys/socket.h> 功能: …

【2024年华为OD机试】 (C卷,200分)- 字符串拼接(JavaScriptJava PythonC/C++)

一、问题描述 问题描述 给定一个字符列表&#xff08;字符范围为 a-z&#xff0c;且字符数量 M 满足 0 < M ≤ 30&#xff09;&#xff0c;从中选取字符&#xff08;每个字符只能使用一次&#xff09;拼接成长度为 N&#xff08;0 < N ≤ 5&#xff09;的字符串。要求拼…

AIGC专栏18——EasyAnimateV5.1版本详解 应用Qwen2 VL作为文本编码器,支持轨迹控制与相机镜头控制

AIGC专栏18——EasyAnimateV5.1版本详解 应用Qwen2 VL作为文本编码器&#xff0c;支持轨迹控制与相机镜头控制 学习前言相关地址汇总源码下载地址HF测试链接MS测试链接 测试效果Image to VideoText to Video轨迹控制镜头控制 EasyAnimate详解技术储备Qwen2 VLStable Diffusion …

软件测试 —— 性能测试(jmeter)

软件测试 —— 性能测试&#xff08;jmeter&#xff09; 什么是jmeter安装jmeterjmeter常用组件线程组取样器结果树 我们之前学习了接口测试工具Postman&#xff0c;我们今天要学习的是性能测试工具——jmeter 什么是jmeter Apache JMeter 是一个开源的性能测试工具&#xff…

vs code为不同项目设置不同的背景图

vs code不同项目显示不同的背景图 效果展示 项目1-图 {"background.enabled": true, "background.interval": 0,"background.customImages": ["file:///C:/Users/Administrator/Pictures/bg.png"],"background.style": {&q…

防火墙安全策略

目录 一.拓扑信息 二.需求分析 三.命令行详细配置信息 1.配置IP 2.交换机配置 3.修改安全区域 4.安全策略 四.web界面详细配置 1.配置IP和设置安全区域 2.交换机配置 3.安全策略 五.测试 一.拓扑信息 二.需求分析 1.VLAN 2属于办公区域&#xff1b;VLAN 3属于生…

OpenStack基础架构

openstack是一套IaaS云的解决方案&#xff0c;是一个开源的云计算管理平台 每一台物理机上都会有一个nova服务器 虚拟化其实是在nova主机里启用的 COW技术&#xff1a; 这么来看&#xff0c;3个物理机上产生10个虚拟机&#xff0c;所以把服务分散到10个虚拟机上和分散到4个虚拟…

[论文阅读] (36)CS22 MPSAutodetect:基于自编码器的恶意Powershell脚本检测模型

《娜璋带你读论文》系列主要是督促自己阅读优秀论文及听取学术讲座&#xff0c;并分享给大家&#xff0c;希望您喜欢。由于作者的英文水平和学术能力不高&#xff0c;需要不断提升&#xff0c;所以还请大家批评指正&#xff0c;非常欢迎大家给我留言评论&#xff0c;学术路上期…

如何实现各种类型的进度条

文章目录 1 概念介绍2 使用方法3 示例代码 我们在上一章回中介绍了浮动按钮相关的内容&#xff0c;,本章回中将介绍进度条相关的Widget,闲话休提&#xff0c;让我们一起Talk Flutter吧。 1 概念介绍 进度条是常用的组件之一&#xff0c;它主要用来显示某种动作的完成进度。Flu…

arcgis短整型变为长整型的处理方式

1.用QGIS的重构字段工具进行修改&#xff0c;亲测比arcgis的更改字段工具有用 2.更换低版本的arcgis10.2.2&#xff0c;亲测10.5和10.6都有这个毛病&#xff0c;虽然官方文档里面说的是10.6.1及以上 Arcgis10.2.2百度链接&#xff1a;https://pan.baidu.com/s/1HYTwgnBJsBug…

C#,入门教程(04)——Visual Studio 2022 数据编程实例:随机数与组合

上一篇&#xff1a; C#&#xff0c;入门教程(03)——Visual Studio 2022编写彩色Hello World与动画效果https://blog.csdn.net/beijinghorn/article/details/123478581 C#&#xff0c;入门教程(01)—— Visual Studio 2022 免费安装的详细图文与动画教程https://blog.csdn.net…

【前端】Hexo 部署指南_hexo-deploy-git·GitHub Actions·Git Hooks

文章目录 前言基于 hexo-deploy-git基于 GitHub Actions基于 Git Hooks云平台端服务器端Git HooksSSHNginx 本地机端原理参考 前言 原文地址&#xff1a;https://blog.dwj601.cn/FrontEnd/Hexo/hexo-deployment/ #mermaid-svg-dfuCXqzZCx5I07IO {font-family:"trebuchet …

双指针+前缀和习题(一步步讲解)

前言&#xff1a;如果解决下面这几道题有些问题&#xff0c;或者即使看了我画的过程图也不理解的可以去看看我的上一篇文章&#xff0c;有可能会对你有帮助。 一、《数值元素的目标和》---来自AcWing 数组元素的目标和 给定两个升序排序的有序数组 A和 B&#xff0c;以及一个…

springboot 配置redis

环境配置 springboot3.4 redis5.0.14 redis准备参考下面文章 window下安装redis以及启动 redis客户端安装 引入依赖 <!-- 集成redis依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-…

TODO: Linux 中的装机硬件测试工具

TODO: Linux 中的装机硬件测试工具 装机时需要测一些硬件参数&#xff0c;希望选择一些跨平台的开源软件。 https://linux.do/t/topic/22175 https://www.baeldung-cn.com/linux/system-testing-tools https://blog.csdn.net/weixin_45358801/article/details/142701279

LabVIEW 太阳能光伏发电系统智能监控

本文介绍了基于 LabVIEW 的太阳能光伏发电监控系统的设计与实现&#xff0c;着重探讨了其硬件配置、软件架构以及系统的实现方法。该系统能够有效提高太阳能光伏发电的监控效率和精确性&#xff0c;实现了远程监控和数据管理的智能化。 ​ 项目背景 在当前能源紧张与环境污染…

doris:Broker Load

Broker Load 通过 MySQL API 发起&#xff0c;Doris 会根据 LOAD 语句中的信息&#xff0c;主动从数据源拉取数据。Broker Load 是一个异步导入方式&#xff0c;需要通过 SHOW LOAD 语句查看导入进度和导入结果。 Broker Load 适合源数据存储在远程存储系统&#xff0c;比如对…

WPF5-x名称空间

1. x名称空间2. x名称空间内容3. x名称空间内容分类 3.1. x:Name3.2. x:Key3.3. x:Class3.4. x:TypeArguments 4. 总结 1. x名称空间 “x名称空间”的x是映射XAML名称空间时给它取的名字&#xff08;取XAML的首字母&#xff09;&#xff0c;里面的成员&#xff08;如x:Class、…

网站HTTP改成HTTPS

您不仅需要知道如何将HTTP转换为HTTPS&#xff0c;还必须在不妨碍您的网站自成立以来建立的任何搜索排名权限的情况下进行切换。 为什么应该从HTTP转换为HTTPS&#xff1f; 与非安全HTTP于不同&#xff0c;安全域使用SSL&#xff08;安全套接字层&#xff09;服务器上的加密代…