文档章节

kettle-manager

马进举
 马进举
发布于 2017/06/18 23:53
字数 4722
阅读 21226
收藏 6

平台简介

出发点

专门为kettle这款优秀的ETL工具开发的web端管理工具。

kettle作为非常优秀的开源ETL工具得到了非常广泛的使用,一般的使用的都是使用客户端操作管理,但问题是当投入生产环境使用时,动辄上百或几百个job需要管理,这时在使用客户端管理已经很难完成了。我所知道的解决方案有用命令行的调用的,操作麻烦,总之还是很难用啦,还有就是开发web端管理工具,kettle自带了一个web端管理工具,界面极其简陋不说,还很难用,基本无法投入生产环境使用,其他没留意到还有没有较好对众多job进行管理的工具。

基于以上情况,和我近四年的kettle定制开发与使用经验。我设计并开发了这款kettle web端管理工具。

一些说明

  1. 本平台初版已经投入使用三年多了,我们公司已经在多地部署使用,开源以来,外部也有大量用户,所以基础的作业调度功能已经稳定,新添加的功能基本属于锦上添花,有些小bug也难免,欢迎反馈,让我们一起让他变得更好。
  2. 本系统是基于数据库资源库设计的,暂时不考虑支持文件资源库,当前支持oracle和mysql。
  3. 关于kettle版本的问题,我开发使用的是5.4版,用这个当然更好,其他版本也是可以的,我测试了5.1、5.4、7.0都是可以使用的,7.1是有问题的,以后测试,本系统只调用了kettle一些基础api,版本相差不是太大应该都是可以的。

关键信息

  1. 项目博客地址
  2. 项目源码地址
  3. 问题反馈邮箱:jinjuma@yeah.net。
  4. 项目交流qq群:320302530(已满勿加),交流2群:142104962(已满勿加),交流3群:142105082。
  5. qq群说明:群主也要上班,请自己多思考,大家相互帮助。本群主要支持如何更好的使用本平台,github上就是完整的源码,加上部署包中的jar肯定是可以运行起来的,这里不回答源码部署问题,都不看部署教程,直接上源码的可以退了,这不适合你。
  6. 项目网盘地址
  7. 群里已经有不少人运行起来开始使用了,也有部分人源码搞好了,可是很少有人回答新人问题,很少有人能做到相互帮助,我也很无奈,我哪里经得住天天问。只要你认真仔细阅读本博客大部分常见问题都能得到解决,可以在群里询问,偶尔也是有热心人回答得。
    

更新简介

刚开发完成的一些的功能完善和部分新功能的添加,还没有正式发布,现在放出0.3.0版的急速体验版。

以下就是0.3.0的更新日志:

  1. 优化结束功能。【之前偶有一些作业卡死的情况出现,停止结束都不行,只能重启平台,如果作业很多这会导致我们的作业一段时间的中断,毕竟重启也需要时间,特别是作业较多时,这里的优化是为了尽量减少重启的次数】。
  2. 支持配置作业在重启时的启动顺序,这样可以让紧急的任务优先启动。【这个是为了在我们迫不得已重启时优先启动紧急程度高的作业,然后慢慢启动不急的作业,从而减小重启对业务的影响】。
  3. 新增作业日志级别设置。【在kettle中运行时我们可以设置作业的日志级别,在调试发现问题时比较有用,现在本平台也支持为作业设置日志级别,方便查看更详细的日志,或减少不必要的日志】。
  4. 新增作业复制功能,很有用,此功能可用于很多参数化的作业。【即作业处理流程一致,通过修改参数重复使用的作业,这样的作业只需设计一个,然后就可以直接在管理页面复制,通过设置参数达到重复使用的目的】。
  5. 提供全量表对表作业、转换包装作业模板用于在管理页面复制,以支持直接在管理页面包装转换并运行、直接在管理页面配置表对表的全量抽取作业。【这里就是利用了上面的作业复制功能】。
  6. 新增转换查看功能。【支持查看资源库中的转换,结合上面的转换包装模板,可以直接在管理界面将转换包装为作业,然后就可以使用为作业开发的全部功能了】。
  7. 新增作业日志正则匹配预警日志生成。【对于一些自身作业设计不完善,没有考虑的异常等,本平台新增异常日志表,将通过正则匹配作业日志,出现异常将立即记录异常日志。实际体验感觉很不错,能加快发现作业错误】。
  8. 异常日志截取更加精准,一般不用下载完整日志文件就能看到具体异常信息
  9. 增加日志查看运行日志时自动刷新功能。
  10. 增加查看作业图和转换图功能。

极速体验

极速体验能让你尽快的体验本项目的功能,判断这是否是你所需要的。

当前提供了极速体验0.3.0版,是当前km的最新版本。

  1. 集成安装包直接集成了kettle、mysql、kettle-manager,这样能减低对部署人员的技术要求。
  2. 下载集成安装包,按安装包中的文档操作即可,很简单几步,还配有截图,应该算是没有难度了。
  3. 关键提示:执行init.bat脚本是要采用管理员模式运行,否则无法正常安装mysql服务。

平台部署

平台部署包简介

部署相关文件都会上传到网盘中,当前最新版为0.2.0,项目网盘地址

各版本间不能混用,要安装一个版本需要删除上一个版本的数据库和全部文件,全新的按照本教程安装。

image

以下就是0.2.0版解压后的包结构,我们需要关注的主要有default目录下配置文件和两个km启动脚本,脚本可以点开看一下,有助于你发现部署中的问题。

image

部署包中不包含kettle的jar,会通过环境变量KETTLE_HOME关联到你的kettle的jar,从而支持你下载的kettle版本,这一点从启动脚本可以看出来,所以部署时你需要创建这个环境变量。

以下是default目录下的配置文件的介绍,其中我们重点关注jdbc.config文件,这是数据库配置文件,其他文件大部分默认既可以,出问题再去看。

切记不要用windows的记事本编辑配置文件,否则会导致配置信息无法读取引发空指针异常。

image

基础环境

本平台需要jdk1.7及以上,请自行安装好,不会的请网上搜索。

数据库

本系统支持oracle和mysql数据库,所有你需要有一个oracle或mysql数据库。之前的集成安装包是集成了mysql数据库的,转念一想既然这是一个ETL管理系统,大家应该都是会搞数据库的,应该比我厉害得多,所以数据库还是你们自己搞吧。

Oracle

  1. 在oracle中创建本系统的数据库用户km。也可自定义使用其他已有用户,在修改数据配置时对应的将km用户改为你的用户。
  2. 先看以下脚本说明,脚本在部署包中的目录:doc\sql\oracle。 image
  3. KM的结构和数据执行km.sql导入即可。
  4. 原始kettle资源库的数据库中执行myNote.sql中的对应的sql脚本(若使用我提供的资源库建表语句kettle.sql则不用执行,已经包含了)。
  5. 配置文件修改,配置文件在部署包中的位置:default/jdbc.config,以下是oracle配置参考:

image

Mysql

  1. 在mysql中创建本系统的数据库km。也可自定义使用其他已有数据库,在修改数据配置时对应的将km数据库改为你的数据库。
  2. 先看以下脚本说明,与oracle一样,脚本在部署包中的目录:doc\sql\mysql。 image
  3. KM的结构和数据直接在km数据库中运行km.sql既可以。
  4. 原始kettle资源库的数据库中执行myNote.sql中的对应的sql脚本(若使用我提供的资源库建表语句kettle.sql则不用执行,已经包含了)。
  5. 配置文件修改,配置文件在部署包中的位置:default/jdbc.config,以下是mysql配置参考:

image

环境变量配置

设置环境变量:KETTLE_HOME=D:\NIS\data-integration5.4,具体的目录根据自己的实际情况设置,该变量用于在项目启动脚本中引用kettle的jar和关联你的kettle中的插件等。

win和linux都是需要配置。你也可以不配置,直接修改对应的启动脚本,去掉其中的KETTLE_HOME设置注释,在启动脚本中配置该变量。

参考下图验证环境变量是否生效,windows配置了环境变量需要重新打开cmd窗口才会生效哦。

image

这里的kettle推荐使用5.4,我开发时使用的5.4,遇到问题的概率要低些,其他版本遇到问题请反馈,我会在后续的版本中考虑。

我使用的kettle在网盘中也是有的。

Windows运行

Windows请运行km.bat脚本。 以下是默认展示的帮助信息。

image

Linux运行

Linux下运行km.sh脚本。 以下是默认展示的帮助信息。

image

平台访问

长点心吧,我上面截图的状态并没有运行项目,只是展示了命令行帮助信息,看下内容还能不知道怎么运行么???哎,km.bat -start

运行正常后就可以访问了,默认地址是:http://127.0.0.1:82 ,v0.2.0版的默认端口是86,若运行时修改了端口,这里对应修改即可。默认kettle账号:kettle/kettle。

功能介绍

主界面

image

参数设置

job运行参数设置,可以在页面上设置作业运行参数,每次运行作业时会用设置的参数覆盖默认值,这个很多人用不上。

image image

定时设置

操作界面与kettle中的开始控件界面一致,这个可能是最优用的功能之一。

image image

运行与停止

核心功能就不说了。

image

强制结束

强制结束等待的作业,针对正常停止无效的情况。

image

实时日志

实时查看作业运行日志,这个功能看起来不起眼,实际应该是很有用的。

image

作业目录

获取作业目录。

image

新建作业

支持页面新建特定类的作业,当前是四类。这些作业都支持页面修改。其中的KM作业是基于我的插件开发。这里的作业继承com.oss.job.AbsJob,这样的作业支持这里的KM作业,也支持下面的定时调度使用。

image image

删除作业

支持批量删除作业,这个很危险哦,小心使用,不会删除子转换和作业。

image

失败重启

支持配置失败自动重启、将job_version字段作为作业类别使用,便于分类管理。

image

定时调度

支持cron定时的调度,所有类必须继承:com.oss.job.AbsJob,作业支持参数配置,同一个类可以重复使用,传入不同的参数。这样开发的作业页支持用于上面的KM作业配置。

image image

con设计

引入一个cron辅助设计模块

image

按顺序运行

我已经开发好了一个上面的KM作业:com.oss.job.KettleJobRunner,这样的作业可以作为KM作业使用,也可以用于定时调度使用。

这个作业已经包含在项目中了,可以直接使用。

请参考KM作业示例和定时调度示例。

运行状态

作业的运行状态会定时反映到管理界面,我们可以通过多种条件筛选我们需要的作业进行批量运行或停止。

完成作业状态更新,日志文件记录的类:com.oss.job.JobManager,使用方式与按顺序运行的作业类似,请参考使用。

为了使部署简单,项目默认不依赖我开发的插件,你不使用KM作业功能,就不需要我开发的插件,项目默认已经在定时调度配置了该作业,并默认运行。

image

平台级日志

一般好的作业设计都会记录自己的日志表,详细记录作业运行状况,本平台提供了平台级日志功能,不涉及业务,记录了作业的开始停止时间,最终运行结果。

image

日志文件按天分文件夹存放,日志文件大小可以配置,若觉得占用空间,可以设计一个作业进行定时清理以前的日志文件,后续会提供该作业。也可以配置为不写日志文件。

该功能也是由com.oss.job.JobManager作业实现。与运行状态更新是同一个作业。

image

业务日志

Km数据库中有一张我设计的专门用于记录业务日志的表:METL_KETTLE_LOG,这个表是根据我们平常设计作业的经验设计的,需要作业设计人员在设计作业时填充此表数据,本平台已经默认提供了此表的查询。

此日志与平台级日志是互补关系,此日志更详细,涉及业务,平台级日志是后盾,主要用于问题排查等。

image image

KM作业示例

image

JS作业示例

该作业前部分操作基本与KM类似,区别在于具体的js基本配置

image

SQL作业示例

该作业前部分操作基本与KM类似,区别在于需要选择数据库,然后就是数据库脚本了

image

Shell作业示例

该作业前部分操作基本与KM类似,额外的需要配置脚本运行路径,默认:/tmp。

作业在linux上运行就写shell脚本,在windows上运行就写bat脚本。

都比较直观,就不多说了。

image

定时调度示例

image image

源码构建

  1. 一般都不需要自己开发,直接使用就行,若有bug或新功能需求,可以发邮件给我。
  2. 本项目基于开源项目EOVA开发:EOVA
  3. 若想进一步扩展功能,建议先搭建kettle开发环境,可以参考我的博文:kettle源码讲解
  4. 我的博客中还有多篇文章介绍kettle的源码等,可以作为参考。
  5. github上就是完整的源码,加上部署包中的jar肯定是可以运行起来的,都不看部署教程,先将部署包运行起来,直接上源码的可以撤了,这个不适合你。

常见问题

Kettle7.0注意事项

Kettle7会报如下错误信息:

image

这个错误不影响使用,但不好看不是。所以我还是说一下怎么消除这个错误。 网盘中有如下文件,解压到本应用的根目录就可以了。这个问题是因为kettle的一个日志插件没有找到日志配置文件。

image

怎么将作业添加到本平台

本平台是直接读取你数据库资源的v_job视图,这个视图包装了一下r_job表,你可以通过修改视图达到隐藏一些作业的目的。

R_job是kettle资源库的系统表,只要你连接这个资源库设计的作业,都会记录在这个表中,所以你只需按照平常的习惯,连接与本平台配置的相同的资源库设计作业即可,因为读取的是同一张表,所以不需要额外的操作,直接就可以在本平台中看到你的作业并进行调度。

有外部作业需要添加到本平台,你只需直接使用kettle的Spoon工具,连接同一个资源库进行导入操作,这个数据人员都很熟悉。

我觉得没必要在页面支持作业导入功能,不知是否有这样的需求,这个暂时不开发。

怎么查看运行转换

关于这个问题,我一直很困惑,为毛要直接查询运行转换,作业和转换可谓各司其职,我认为要运行转换就需要在其上包装一个作业,不管是否有其他流程依赖的需求。

当前新版本已经提供转换查看功能,支持直接在调度中将转换包装为作业进行运行。

注意事项

  1. 不要使用系统自带的记事本编辑配置文件,否则会导致系统无法正常读取你修改的配置文件,可以使用editpuls或notepad++。当出现奇葩问题时要想起这个提示。
  2. 相关文件最好不要存放在有空格或中文的目录下,避免不必要的麻烦。

后续计划

  1. 支持简单的表对表作业新增。
  2. 考虑新增转换管理,开发通用km作业支持转换运行。
  3. 一个job同时在多个km中运行还需要考虑,日志,状态等
  4. 任务管理在设置定时时可能需要人为分散定时,考虑生成时间-运行任务数的分析图辅助进行分散定时。
  5. 作业管理显示运行倒计时。
  6. 作业管理支持配置文件资源库运行。
  7. 改为支持文件资源库和更多数据库作为资源库。
  8. 权限管理,不同用户看到自己的作业,管理员看所有作业。
  9. 分布式、集群支持,考虑增加容灾机制。
  10. 根据日志加入一些统计功能

© 著作权归作者所有

共有 人打赏支持
马进举
粉丝 35
博文 6
码字总数 7987
作品 1
遂宁
私信 提问
加载中

评论(21)

w
wt25
您好,请问有0.4.0的源码吗?预览转换图和作业图怎么实现的,可否帮助一下。
shaowucao
shaowucao
运行的是mysql语句,选的也是mysql,结果提示oracle连接。
shaowucao
shaowucao
2018/11/14 22:55:13 - sqltest - 开始执行任务
2018/11/14 22:55:13 - sqltest - 开始项[sql]
2018/11/14 22:55:13 - sql - ERROR (version 5.4.0.1-130, build 1 from 2015-06-14_12-34-55 by buildguy) : 执行该作业项时发生了一个错误:
2018/11/14 22:55:13 - sql - Error occurred while trying to connect to the database
2018/11/14 22:55:13 - sql -
2018/11/14 22:55:13 - sql - Error connecting to database: (using class oracle.jdbc.driver.OracleDriver)
2018/11/14 22:55:13 - sql - no ocijdbc11 in java.library.path
2018/11/14 22:55:13 - sqltest - 完成作业项[sql] (结果=[false])
2018/11/14 22:55:13 - sqltest - 任务执行完毕
hh0000000
hh0000000

引用来自“hh0000000”的评论

ERROR [main - LogKit.java:75] java.lang.NullPointerException
  at com.eova.config.EovaConfig.configPlugin(EovaConfig.java:243)
  at com.jfinal.core.Config.configJFinal(Config.java:49)
  at com.jfinal.core.JFinal.init(JFinal.java:62)
  at com.jfinal.core.JFinalFilter.init(JFinalFilter.java:49)
  at org.eclipse.jetty.servlet.FilterHolder.doStart(FilterHolder.java:119)
  at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64)
  at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:724)
  at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:265)
  at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1250)
  at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:706)
  at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:492)
  at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64)
  at org.eclipse.jett 这个怎么解决
启动kettle-manager报的错
hh0000000
hh0000000
ERROR [main - LogKit.java:75] java.lang.NullPointerException
  at com.eova.config.EovaConfig.configPlugin(EovaConfig.java:243)
  at com.jfinal.core.Config.configJFinal(Config.java:49)
  at com.jfinal.core.JFinal.init(JFinal.java:62)
  at com.jfinal.core.JFinalFilter.init(JFinalFilter.java:49)
  at org.eclipse.jetty.servlet.FilterHolder.doStart(FilterHolder.java:119)
  at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64)
  at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:724)
  at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:265)
  at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1250)
  at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:706)
  at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:492)
  at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64)
  at org.eclipse.jett 这个怎么解决
康康爸爸
博主您好,kettleManage现在能不能连多个kettle资源数据库呢,如果不能怎么隐藏部分job呢?
R
Rock_et

引用来自“老王买房”的评论

你好,
我直接拉的kettle7.1的lib,然后启动kettle.init()
然后有如下报错是否需要启动karafboot的服务,不知道你是否遇到过,谢谢
[11/23 14:22:03] [WARN] KarafBoot: Karaf not found in standard dir of './system/karaf'
Logger--> WARN{KarafBoot.java:96}-Karaf not found in standard dir of './system/karaf'
[11/23 14:22:03] [ERROR] KarafBoot: Error starting Karaf
java.io.FileNotFoundException: Source '.\system\karaf' does not exist
  at org.apache.commons.io.FileUtils.copyDirectory(FileUtils.java:1298)
  at org.apache.commons.io.FileUtils.copyDirectory(FileUtils.java:1240)
  at org.pentaho.platform.osgi.KarafBoot.startup(KarafBoot.java:187)
  at org.pentaho.di.osgi.registryExtension.OSGIPluginRegistryExtension.init(OSGIPluginRegistryExtension.java:109)
  at org.pentaho.di.core.plugins.PluginRegistry.init(PluginRegistry.java:596)

引用来自“await_me”的评论

同样遇到了。。。
一样的问题,只能无视么?
双子星

引用来自“老王买房”的评论

你好,
我直接拉的kettle7.1的lib,然后启动kettle.init()
然后有如下报错是否需要启动karafboot的服务,不知道你是否遇到过,谢谢
[11/23 14:22:03] [WARN] KarafBoot: Karaf not found in standard dir of './system/karaf'
Logger--> WARN{KarafBoot.java:96}-Karaf not found in standard dir of './system/karaf'
[11/23 14:22:03] [ERROR] KarafBoot: Error starting Karaf
java.io.FileNotFoundException: Source '.\system\karaf' does not exist
  at org.apache.commons.io.FileUtils.copyDirectory(FileUtils.java:1298)
  at org.apache.commons.io.FileUtils.copyDirectory(FileUtils.java:1240)
  at org.pentaho.platform.osgi.KarafBoot.startup(KarafBoot.java:187)
  at org.pentaho.di.osgi.registryExtension.OSGIPluginRegistryExtension.init(OSGIPluginRegistryExtension.java:109)
  at org.pentaho.di.core.plugins.PluginRegistry.init(PluginRegistry.java:596)

引用来自“await_me”的评论

同样遇到了。。。
1.在kettle-manger下创建system/karaf文件 并且把plugins\kettle5-log4j-plugin\log4j.xml 放到kettel-manger目录的plugins\kettle5-log4j-plugin下,没有的目录自己创建。
2.另外重新启动时可能会报错“java.io.FileNotFoundException: C:\Users\julong\AppData\Local\Temp\karaf6260818538491990879\et”,直接无视掉
咖啡猫yyy
咖啡猫yyy
你好,我想请教一个问题,我现在也想做一个Kettle后台管理服务,但是kettle的java api接口调用ktr文件执行,如果一个执行请求发生了内存泄漏,导致out of memory,那如何保证不影响其他的执行任务请求?
想请教一下kettle-manager在这块是如何处理的?
a
await_me

引用来自“老王买房”的评论

你好,
我直接拉的kettle7.1的lib,然后启动kettle.init()
然后有如下报错是否需要启动karafboot的服务,不知道你是否遇到过,谢谢
[11/23 14:22:03] [WARN] KarafBoot: Karaf not found in standard dir of './system/karaf'
Logger--> WARN{KarafBoot.java:96}-Karaf not found in standard dir of './system/karaf'
[11/23 14:22:03] [ERROR] KarafBoot: Error starting Karaf
java.io.FileNotFoundException: Source '.\system\karaf' does not exist
  at org.apache.commons.io.FileUtils.copyDirectory(FileUtils.java:1298)
  at org.apache.commons.io.FileUtils.copyDirectory(FileUtils.java:1240)
  at org.pentaho.platform.osgi.KarafBoot.startup(KarafBoot.java:187)
  at org.pentaho.di.osgi.registryExtension.OSGIPluginRegistryExtension.init(OSGIPluginRegistryExtension.java:109)
  at org.pentaho.di.core.plugins.PluginRegistry.init(PluginRegistry.java:596)

同样遇到了。。。
Kettle 的 Web 端管理工具--Kettle-Manager

平台简介 出发点 专门为kettle这款优秀的ETL工具开发的web端管理工具。 kettle作为非常优秀的开源ETL工具得到了非常广泛的使用,一般的使用的都是使用客户端操作管理,但问题是当投入生产环境...

马进举
2016/11/23
7.5K
5
ETL Pentaho代码学习笔记

1、通过设置KETTLE_HOME环境变量可以让.kettle不需要在user.home下 2、默认kettlehome 为User.home,如果要自定义需要设置环境变量KETTLEHOME 3、在.kettle目录下可放置以下文件或目录: 文件...

小骏骏
2014/12/17
0
0
Kettle在linux安装后,spoon启动闪退,如何解决?

os:CentOS release 6.9 (Final) java:JDK108 KETTLE:pdi-ce-7.1.0.0-12 配置好环境变量,启动spoon.sh, 页面闪现就退掉,试过两种方法: 1. vim spoon.sh 修改java参数 if [ -z "$PENTAH...

gs0325
04/28
496
3
Kettle 6.x 源码开发环境搭建

1、引言 Data Integration - Kettle 作为免费开源的ETL工具,可以通过其桌面程序进行ETL步骤的开发并执行。kettle以插件形式来实现每个转换步骤的工作,发行版中已经提供了常用的转换清洗插件...

空山苦水禅人
2016/11/02
2.9K
6
kettle下转移mongo中数据到mysql中

版权声明:本文为博主原创文章,未经博主允许不得转载。请注明博客地址(http://blog.csdn.net/gsying1474) https://blog.csdn.net/gsying1474/article/details/54140108 Kettle是一款国外开...

刘迎光-萤火虫工作室
2017/01/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

《稻盛和夫经营学》读后感心得体会3180字范文

《稻盛和夫经营学》读后感心得体会3180字范文: 一代日本经营之圣稻盛和夫凭借刻苦勤奋的精神以及深植于佛教的商业道德准则,成为了“佛系”企业家的代表人物。在《稻盛和夫经营学》“领导人...

原创小博客
28分钟前
1
0
java框架学习日志-5(常见的依赖注入)

依赖注入(dependency injection) 之前提到控制反转(Inversion of Control)也叫依赖注入,它们其实是一个东西,只是看的角度不同,这章详细说一下依赖注入。 依赖——指bean对象创建依赖于...

白话
44分钟前
2
0
红外接收器驱动开发

背景:使用系统的红外遥控软件没有反应,然后以为自己接线错误,反复测试,结果烧坏了一个红外接收器,信号主板没有问题。所以自己开发了一个红外接收器的python驱动。接线参见https://my.os...

mbzhong
今天
2
0
ActiveMQ消息传送机制以及ACK机制详解

AcitveMQ是作为一种消息存储和分发组件,涉及到client与broker端数据交互的方方面面,它不仅要担保消息的存储安全性,还要提供额外的手段来确保消息的分发是可靠的。 一. ActiveMQ消息传送机...

watermelon11
今天
2
0
HashTable和Vector为什么逐渐被废弃

HashTable,不允许键值为null,还一个就是put方法使用sychronized方法进行线程同步,单线程无需同步,多线程可用concurren包的类型。 如编程思想里面说的作为工具类,封闭性做的不好没有一个...

noob_chr
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部