当前位置: 首页 > news >正文

Kettle Local引擎使用记录(一)(基于Kettle web版数据集成开源工具data-integration源码)

Kettle Web

  • 📚第一章 前言
  • 📚第二章 demo源码
    • 📗pom.xml引入Kettle引擎核心文件
    • 📗java源码
      • 📕 controller
      • 📕 service
      • 📕 其它
      • 📕 maven settings.xml
    • 📗测试
      • 📕 测试文件
      • 📕 测试结果
  • ⁉️问题记录
    • ❓问题一:jar包冲突 - `An attempt was made to call the method javax.servlet.ServletContext.setInitParameter(Ljava/lang/String;Ljava/lang/String;)Z but it does not exist. Its class, javax.servlet.ServletContext, is available from the following locations:`
      • ❗解决方式一:Kettle排除掉冲突jar(因为没引入Kettle之前是没问题的)
      • ❕拓展:通过`Maven Helper`插件排除冲突jar包
    • ❓问题二:`Database type not found!`...`database type with plugin id [Oracle] couldn't be found!`
      • ❗解决思路一:该插件类型不存在,需要手动制作
      • ❗解决思路二:确保json转化的xml文件正确
      • ❗解决思路三:正确加载kettle

📚第一章 前言

在前面对data-integration做了一些简单了解,从部署到应用,今天尝试把后端运行作业代码拎出来,去真正运行一下,只有实操之后才会有更深刻的认识,有些看着简单的功能,实操过程中会遇到很多问题,这个时候你的想法也会发生改变,所以很多时候为什么开发人员痛恨做产品的同事,因为嘴上说的简单,真正去做一下,你自己感受一下,就知道了!

  • 基于Kettle开发的web版数据集成开源工具(data-integration)-部署篇
  • 基于Kettle开发的web版数据集成开源工具(data-integration)-介绍篇
  • 基于Kettle开发的web版数据集成开源工具(data-integration)-应用篇

data-integration可以理解为Kettleweb版本,详情可参照上面的文章,这里直接从代码层面开始

📚第二章 demo源码

直接在我之前个人项目上进行的韧小钊(纯个人项目,整理或者更新全靠一时兴起,如果对你有用,挺好,没用请PASS),现在想法就是后端实现运行作业的功能,至于保存作业,都是前端传给后台的,后台存的就是JSON串,所以后端改动应该不大,这里就是尝试先提取后端运行作业代码,直接运行前端传参,看能否成功
在这里插入图片描述

📗pom.xml引入Kettle引擎核心文件

引入之后,启动项目报jar包冲突,则在下面文件中进行exclusion配置排除

<!-- Kettle核心包 20240106 by rxz-->
<dependency><groupId>pentaho-kettle</groupId><artifactId>kettle-engine</artifactId><version>${kettle.version}</version><exclusions><exclusion><artifactId>servlet-api</artifactId><groupId>javax.servlet</groupId></exclusion></exclusions>
</dependency>
<dependency><groupId>pentaho-kettle</groupId><artifactId>kettle-core</artifactId><version>${kettle.version}</version><exclusions><exclusion><artifactId>servlet-api</artifactId><groupId>javax.servlet</groupId></exclusion></exclusions>
</dependency>

📗java源码

📕 controller

package com.renxiaozhao.api.controller;import com.renxiaozhao.common.Result;
import com.renxiaozhao.service.inf.PdiUseDemoService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;/*** kettle/pdi使用样例-控制层** @author 韧小钊*/
@RestController
@RequestMapping("/kettle")
@Api(tags = "KETTLE-PDI")
@Slf4j
public class PdiUseDemoController {/*** 服务对象*/@Autowiredprivate PdiUseDemoService pdiUseDemoService;@PostMapping("/run")@ApiOperation(value = "kettle作业运行", notes = "kettle作业运行")public Result<Void> executeJob(@RequestParam String jobJson) throws Exception {pdiUseDemoService.executeJob(jobJson);return Result.success();}}

📕 service

这里就是对应基于Kettle开发的web版数据集成开源工具(data-integration)-应用篇中的后台服务流程章节ProjectExecutorController.executeById,目的是研究Kettle引擎的具体使用,所以这里是去掉了各种封装,直接前端传参(作业JSON串),后端直接执行

package com.renxiaozhao.service.inf;import com.baomidou.mybatisplus.extension.service.IService;
import com.renxiaozhao.bean.entity.SportEntity;public interface PdiUseDemoService extends IService<SportEntity> {
//直接复制的原来代码,有些实体类暂时用不到,请先忽略void executeJob(String jobJson) throws Exception;
}
package com.renxiaozhao.service.impl;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.renxiaozhao.bean.entity.SportEntity;
import com.renxiaozhao.dao.mapper.SportMapper;
import com.renxiaozhao.service.inf.PdiUseDemoService;
import com.renxiaozhao.service.util.JSONLinkedObject;
import com.renxiaozhao.service.util.XML;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringEscapeUtils;
import org.pentaho.di.core.exception.KettleMissingPluginsException;
import org.pentaho.di.core.exception.KettleXMLException;
import org.pentaho.di.core.logging.LogLevel;
import org.pentaho.di.core.logging.LoggingObjectType;
import org.pentaho.di.core.logging.SimpleLoggingObject;
import org.pentaho.di.core.variables.Variables;
import org.pentaho.di.core.xml.XMLHandler;
import org.pentaho.di.trans.Trans;
import org.pentaho.di.trans.TransAdapter;
import org.pentaho.di.trans.TransExecutionConfiguration;
import org.pentaho.di.trans.TransMeta;
import org.springframework.stereotype.Service;
import org.w3c.dom.Document;import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.UUID;@Slf4j
@Service
public class PdiUseDemoServiceImpl extends ServiceImpl<SportMapper,SportEntity> implements PdiUseDemoService {@Overridepublic void executeJob(String jobJson) throws Exception {execute(jobJson);}private void execute(String jobJson) throws Exception {// 构建TransMeta 对象TransMeta transMeta = buildTransMeta(jobJson);TransExecutionConfiguration executionConfiguration = new TransExecutionConfiguration();// 设置默认值以便运行配置可以正确设置executionConfiguration.setExecutingLocally(true);executionConfiguration.setExecutingRemotely(false);executionConfiguration.setExecutingClustered(false);// 不启用安全模式executionConfiguration.setSafeModeEnabled(true);executionConfiguration.getUsedVariables(transMeta);executionConfiguration.setLogLevel(LogLevel.DEBUG);// 默认设置本地引擎执行executionConfiguration.setRunConfiguration("Pentaho local");//设置命令参数executionConfiguration.setVariables(new HashMap<>());//  创建transTrans trans = new Trans(transMeta);String spoonLogObjectId = UUID.randomUUID().toString();SimpleLoggingObject spoonLoggingObject = new SimpleLoggingObject(Thread.currentThread().getName() + "-" + Thread.currentThread().getId(), LoggingObjectType.SPOON, null);spoonLoggingObject.setContainerObjectId(spoonLogObjectId);spoonLoggingObject.setLogLevel(executionConfiguration.getLogLevel());trans.setParent(spoonLoggingObject);trans.setLogLevel(executionConfiguration.getLogLevel());trans.setReplayDate(executionConfiguration.getReplayDate());trans.setRepository(executionConfiguration.getRepository());trans.setMonitored(false);// 启动转换trans.addTransListener(new TransAdapter() {@Overridepublic void transFinished(Trans trans) {log.info("项目执行完成");}});trans.startThreads();}public TransMeta buildTransMeta(String jobJson) throws IOException, KettleXMLException, KettleMissingPluginsException {Document document;//json转xmlif (!jobJson.startsWith("<?xml")) {// json转xmljobJson = StringEscapeUtils.unescapeXml(jobJson);jobJson = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + XML.toString(new JSONLinkedObject(jobJson));log.info("json转换成xml,转换后的xml:{}", jobJson);}// 写到临时目录File outFile = new File("D:\\tmp\\test", "test.xml");FileUtils.writeStringToFile(outFile, jobJson);// 加载xmldocument = XMLHandler.loadXMLString(jobJson);TransMeta transMeta = new TransMeta();transMeta.loadXML(document.getDocumentElement(), outFile.getPath(), null, null, true, new Variables(),(message, rememberText, rememberPropertyName) -> {// Yes means: overwritereturn true;});if (transMeta.hasMissingPlugins()) {log.info("【{}】缺少执行插件。", jobJson);}return transMeta;}
}

📕 其它

在这里插入图片描述
代码已上传
在这里插入图片描述

📕 maven settings.xml

<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.2.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 https://maven.apache.org/xsd/settings-1.2.0.xsd"><localRepository>D:\soft\apache-maven-3.8.5\apache-maven-3.8.5\repository</localRepository><pluginGroups></pluginGroups><proxies></proxies><servers></servers><mirrors><mirror><id>pentaho-public</id><name>Pentaho Public Mirror</name><url>https://repo.orl.eng.hitachivantara.com/artifactory/pnt-mvn/</url><mirrorOf>*</mirrorOf></mirror><mirror><id>aliyunmaven</id><mirrorOf>*</mirrorOf><name>阿里云公共仓库</name><url>https://maven.aliyun.com/repository/public</url></mirror></mirrors><profiles></profiles></settings>

📗测试

启动服务,通过swagger测试
在这里插入图片描述
在这里插入图片描述

📕 测试文件

传参对应的就是dp_portal_project_fileproject_file,详见基于Kettle开发的web版数据集成开源工具(data-integration)-应用篇
在这里插入图片描述
测试文件参考如下(直接使用的话,记得修改数据库信息):

{"transformation": {"attributes": "","connection": [{"access": "Native","attributes": {"attribute": [{"attribute": "Y","code": "SUPPORTS_BOOLEAN_DATA_TYPE"},{"attribute": "Y","code": "SUPPORTS_TIMESTAMP_DATA_TYPE"},{"attribute": "N","code": "QUOTE_ALL_FIELDS"},{"attribute": "N","code": "FORCE_IDENTIFIERS_TO_LOWERCASE"},{"attribute": "N","code": "FORCE_IDENTIFIERS_TO_UPPERCASE"},{"attribute": "Y","code": "PRESERVE_RESERVED_WORD_CASE"},{"attribute": "N","code": "STRICT_NUMBER_38_INTERPRETATION"},{"attribute": "","code": "PREFERRED_SCHEMA_NAME"}]},"dataSourceId": "e2be98ed-9077-4802-8795-df45acb7b033","dataSourceName": "dataintegration_db","data_tablespace": "","database": "dataintegration_db","dsName": "dataintegration_db","index_tablespace": "","name": "e2be98ed-9077-4802-8795-df45acb7b033","password": "Encrypted 2be98afc86ae49d94a40dab508cc2fd89","port": "3306","server": "192.168.17.10","servername": "","type": "MYSQL","username": "stelladp"}],"info": {"capture_step_performance": "N","clusterschemas": "","created_date": "2020/02/05 13:34:55.102","created_user": "037de45a-e2ad-4d0a-943c-455db05161f4","dependencies": "","description": "","directory": "/home/admin","extended_description": "","feedback_shown": "Y","feedback_size": 50000,"is_key_private": "N","key_for_session_key": "","log": "","maxdate": {"connection": "","field": "","maxdiff": 0,"offset": 0,"table": ""},"modified_date": "2020/02/19 17:08:25.150","modified_user": "admin","name": "执行SQL","parameters": {"parameter": []},"partitionschemas": "","shared_objects_file": "","size_rowset": 10000,"slaveservers": "","sleep_time_empty": 50,"sleep_time_full": 50,"step_performance_capturing_delay": 1000,"step_performance_capturing_size_limit": 100,"trans_type": "Normal","trans_version": "","unique_connections": "N","using_thread_priorities": "Y"},"nodeList": {"flowInfo": {"Id": "fdf50d66dc7d","Name": "我的流程","Remark": ""},"lineList": [],"nodeList": [{"copy": 0,"dataQuerySql": "","dataSourceId": "","datasourceId": "","errors": 0,"icon": "iconfont icon-kongjian1","id": "ExecSQL6925c0883a9b","label": "执行SQL脚本","left": "341px","linesInput": 0,"linesOutput": 0,"linesRead": 0,"linesRejected": 0,"linesUpdated": 0,"linesWritten": 0,"pluginId": "ExecSQL","pluginOutput": "Y","priority": "-","projectError": 0,"projectId": "","projectName": "","seconPluginType": "scripts","seconds": 0,"speed": 0,"status": false,"statusDescription": "","stepExecutionStatu": "","stepExecutionStatus": "","stepMetaExecutionStatus": null,"stepName": "","stepSql": "","top": "212px"}],"statusListen": []},"notepads": "","order": {"hop": []},"slave-step-copy-partition-distribution": "","slave_transformation": "N","step": [{"BindString": "","Connectpool": false,"Excute_sql": "","GUI": {"draw": "Y","xloc": "160","yloc": "224"},"arguments": {"argument": []},"attributes": [],"bool": true,"cluster": false,"cluster_schema": [],"connecName": "","connect_size": "","connection": "e2be98ed-9077-4802-8795-df45acb7b033","copies": "1","custom_distribution": [],"defalut_mode": "","delete_field": "","descripe": "The default catalog of connections created by this pool.","description": [],"distribute": "Y","execute_each_row": "N","fields": {"field": []},"free_space": "","header": "N","identifier": false,"identifier_captial": false,"identifier_lowercase": false,"initFlag": true,"insert_field": "","name": "执行SQL脚本","noempty": "N","oldStepName": "执行SQL脚本","outFields": [],"partitioning": {"method": "none","schema_name": []},"preserve_case": true,"quoteString": "N","read_field": "","remotesteps": {"input": "\n      ","output": "\n      "},"replace_variables": "N","set_params": false,"single_statement": "Y","sql": "select count(1) from dp_portal_role","stoponempty": "N","strict_number": false,"time_stamp": true,"type": "ExecSQL","update_field": ""}],"step_error_handling": {"error": []}}
}

📕 测试结果

报错了…😔详见问题二
在这里插入图片描述

⁉️问题记录

❓问题一:jar包冲突 - An attempt was made to call the method javax.servlet.ServletContext.setInitParameter(Ljava/lang/String;Ljava/lang/String;)Z but it does not exist. Its class, javax.servlet.ServletContext, is available from the following locations:

java.lang.BootstrapMethodError: java.lang.NoSuchMethodError: javax.servlet.ServletContext.setInitParameter(Ljava/lang/String;Ljava/lang/String;)Zat org.springframework.boot.web.servlet.server.AbstractServletWebServerFactory.lambda$mergeInitializers$0(AbstractServletWebServerFactory.java:253)at org.springframework.boot.web.embedded.jetty.ServletContextInitializerConfiguration.callInitializers(ServletContextInitializerConfiguration.java:66)at org.springframework.boot.web.embedded.jetty.ServletContextInitializerConfiguration.configure(ServletContextInitializerConfiguration.java:55)at org.eclipse.jetty.webapp.WebAppContext.configure(WebAppContext.java:517)at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1454)at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:852)at org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:278)at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:545)at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:138)at org.eclipse.jetty.server.Server.start(Server.java:415)at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:108)at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:113)at org.eclipse.jetty.server.Server.doStart(Server.java:382)at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)at org.springframework.boot.web.embedded.jetty.JettyWebServer.initialize(JettyWebServer.java:108)at org.springframework.boot.web.embedded.jetty.JettyWebServer.<init>(JettyWebServer.java:86)at org.springframework.boot.web.embedded.jetty.JettyServletWebServerFactory.getJettyWebServer(JettyServletWebServerFactory.java:410)at org.springframework.boot.web.embedded.jetty.JettyServletWebServerFactory.getWebServer(JettyServletWebServerFactory.java:153)at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:181)at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:154)at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543)at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:142)at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:775)at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)at org.springframework.boot.SpringApplication.run(SpringApplication.java:316)at org.springframework.boot.SpringApplication.run(SpringApplication.java:1260)at org.springframework.boot.SpringApplication.run(SpringApplication.java:1248)at com.renxiaozhao.api.ApiApplicationServer.main(ApiApplicationServer.java:21)
Caused by: java.lang.NoSuchMethodError: javax.servlet.ServletContext.setInitParameter(Ljava/lang/String;Ljava/lang/String;)Zat java.lang.invoke.MethodHandleNatives.resolve(Native Method)at java.lang.invoke.MemberName$Factory.resolve(MemberName.java:975)at java.lang.invoke.MemberName$Factory.resolveOrFail(MemberName.java:1000)at java.lang.invoke.MethodHandles$Lookup.resolveOrFail(MethodHandles.java:1394)at java.lang.invoke.MethodHandles$Lookup.linkMethodHandleConstant(MethodHandles.java:1750)at java.lang.invoke.MethodHandleNatives.linkMethodHandleConstant(MethodHandleNatives.java:477)... 29 common frames omitted
2024-01-06 13:40:50.233 [main] INFO  org.eclipse.jetty.server.AbstractConnector -Started ServerConnector@697a0948{HTTP/1.1,[http/1.1]}{0.0.0.0:9080}
2024-01-06 13:40:50.242 [main] INFO  org.eclipse.jetty.server.AbstractConnector -Stopped ServerConnector@697a0948{HTTP/1.1,[http/1.1]}{0.0.0.0:9080}
2024-01-06 13:40:50.243 [main] INFO  org.eclipse.jetty.server.handler.ContextHandler -Stopped o.s.b.w.e.j.JettyEmbeddedWebAppContext@521441d5{application,/renxiaozhao,[file:///C:/Users/lenovo/AppData/Local/Temp/jetty-docbase.1734690716899826200.9080/, jar:file:/D:/soft/apache-maven-3.8.5/apache-maven-3.8.5/repository/io/springfox/springfox-swagger-ui/2.9.2/springfox-swagger-ui-2.9.2.jar!/META-INF/resources, jar:file:/D:/soft/apache-maven-3.8.5/apache-maven-3.8.5/repository/com/github/xiaoymin/knife4j-spring-ui/2.0.8/knife4j-spring-ui-2.0.8.jar!/META-INF/resources],UNAVAILABLE}
2024-01-06 13:40:50.247 [main] WARN  o.s.b.w.s.c.AnnotationConfigServletWebServerApplicationContext -Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Unable to start web server; nested exception is org.springframework.boot.web.server.WebServerException: Unable to start embedded Jetty web server
2024-01-06 13:40:50.261 [main] INFO  o.s.b.a.l.ConditionEvaluationReportLoggingListener -Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2024-01-06 13:40:50.287 [main] ERROR o.s.b.diagnostics.LoggingFailureAnalysisReporter -***************************
APPLICATION FAILED TO START
***************************Description:An attempt was made to call the method javax.servlet.ServletContext.setInitParameter(Ljava/lang/String;Ljava/lang/String;)Z but it does not exist. Its class, javax.servlet.ServletContext, is available from the following locations:jar:file:/D:/soft/apache-maven-3.8.5/apache-maven-3.8.5/repository/javax/servlet/servlet-api/2.4/servlet-api-2.4.jar!/javax/servlet/ServletContext.classjar:file:/D:/soft/apache-maven-3.8.5/apache-maven-3.8.5/repository/javax/servlet/javax.servlet-api/4.0.1/javax.servlet-api-4.0.1.jar!/javax/servlet/ServletContext.classIt was loaded from the following location:file:/D:/soft/apache-maven-3.8.5/apache-maven-3.8.5/repository/javax/servlet/servlet-api/2.4/servlet-api-2.4.jarAction:Correct the classpath of your application so that it contains a single, compatible version of javax.servlet.ServletContextDisconnected from the target VM, address: '127.0.0.1:50771', transport: 'socket'Process finished with exit code 1

❗解决方式一:Kettle排除掉冲突jar(因为没引入Kettle之前是没问题的)

在这里插入图片描述

<kettle.version>9.2.0.0-290</kettle.version>
<dependency><groupId>pentaho-kettle</groupId><artifactId>kettle-engine</artifactId><version>${kettle.version}</version><exclusions><exclusion><artifactId>servlet-api</artifactId><groupId>javax.servlet</groupId></exclusion></exclusions>
</dependency><dependency><groupId>pentaho-kettle</groupId><artifactId>kettle-core</artifactId><version>${kettle.version}</version><exclusions><exclusion><artifactId>servlet-api</artifactId><groupId>javax.servlet</groupId></exclusion></exclusions>
</dependency>

在这里插入图片描述

❕拓展:通过Maven Helper插件排除冲突jar包

使用IDEA工具,安装Maven Helper插件,进行冲突jar包排查,步骤如下:

  • 安装插件
    在这里插入图片描述
  • 安装完成之后,打开pom.xml文件,可以看到Dependency Analyzer
    在这里插入图片描述
  • 点击Dependency Analyzer进行分析
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 尽量定位修改的位置进行排查(找到修改的pom.xml进行定位)
    在这里插入图片描述
    冲突嘛(排除哪一方都行,根据报错排除对应的jar包,不行再试另一个jar包)
    在这里插入图片描述
  • 直接点击Exclude,帮你自动生成排除配置
    在这里插入图片描述
    在这里插入图片描述

❓问题二:Database type not found!database type with plugin id [Oracle] couldn't be found!

2024-01-05 16:54:41.190 [qtp1963906615-73] WARN  org.eclipse.jetty.server.HttpChannel -/renxiaozhao/kettle/run
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.pentaho.di.core.exception.KettleXMLException: 
错误从XML文件读取转换
Database type not found!at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1013)at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:908)at javax.servlet.http.HttpServlet.service(HttpServlet.java:665)at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882)at javax.servlet.http.HttpServlet.service(HttpServlet.java:750)at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:867)at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1623)at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1610)at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:92)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1610)at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1610)at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1610)at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:540)at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:146)at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548)at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:257)at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1588)at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:255)at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1345)at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:203)at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:480)at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1557)at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:201)at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1247)at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:144)at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)at org.eclipse.jetty.server.Server.handle(Server.java:502)at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:364)at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:260)at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:305)at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103)at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:118)at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:333)at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:310)at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:168)at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:126)at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:366)at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:765)at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:683)at java.lang.Thread.run(Thread.java:748)
Caused by: org.pentaho.di.core.exception.KettleXMLException: 
错误从XML文件读取转换
Database type not found!at org.pentaho.di.trans.TransMeta.loadXML(TransMeta.java:3460)at com.renxiaozhao.service.impl.PdiUseDemoServiceImpl.buildTransMeta(PdiUseDemoServiceImpl.java:96)at com.renxiaozhao.service.impl.PdiUseDemoServiceImpl.execute(PdiUseDemoServiceImpl.java:41)at com.renxiaozhao.service.impl.PdiUseDemoServiceImpl.executeJob(PdiUseDemoServiceImpl.java:37)at com.renxiaozhao.service.impl.PdiUseDemoServiceImpl$$FastClassBySpringCGLIB$$56121f70.invoke(<generated>)at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:684)at com.renxiaozhao.service.impl.PdiUseDemoServiceImpl$$EnhancerBySpringCGLIB$$b8de3a8b.executeJob(<generated>)at com.renxiaozhao.api.controller.PdiUseDemoController.executeJob(PdiUseDemoController.java:33)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:189)at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:800)at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1038)at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942)at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005)... 47 common frames omitted
Caused by: java.lang.RuntimeException: Database type not found!at org.pentaho.di.core.database.DatabaseMeta.setValues(DatabaseMeta.java:642)at org.pentaho.di.core.database.DatabaseMeta.setDefault(DatabaseMeta.java:525)at org.pentaho.di.core.database.DatabaseMeta.<init>(DatabaseMeta.java:516)at org.pentaho.di.core.database.DatabaseMeta.<init>(DatabaseMeta.java:986)at org.pentaho.di.trans.TransMeta.loadXML(TransMeta.java:3030)... 68 common frames omitted
Caused by: org.pentaho.di.core.exception.KettleDatabaseException: 
database type with plugin id [Oracle] couldn't be found!at org.pentaho.di.core.database.DatabaseMeta.findDatabaseInterface(DatabaseMeta.java:592)at org.pentaho.di.core.database.DatabaseMeta.getDatabaseInterface(DatabaseMeta.java:566)at org.pentaho.di.core.database.DatabaseMeta.setValues(DatabaseMeta.java:640)... 72 common frames omitted

❗解决思路一:该插件类型不存在,需要手动制作

检查对应配置文件kettle-database-types.xml,发现配置是存在的,所以这里报错不是类型不存在所致

  <database-type id="ORACLE"><description>Oracle</description><classname>org.pentaho.di.core.database.OracleDatabaseMeta</classname></database-type>   

在这里插入图片描述

❗解决思路二:确保json转化的xml文件正确

在这里插入图片描述
在这里插入图片描述

❗解决思路三:正确加载kettle

现在怀疑就是kettle没有正确加载,但是如何排查,还是一头雾水,有知道的大佬欢迎告知,接下来再排查半小时,没结果就放弃了,大周六的,不要太卷!


问题解决已更新:Kettle Local引擎使用记录(二):问题记录及解决

相关文章:

Kettle Local引擎使用记录(一)(基于Kettle web版数据集成开源工具data-integration源码)

Kettle Web &#x1f4da;第一章 前言&#x1f4da;第二章 demo源码&#x1f4d7;pom.xml引入Kettle引擎核心文件&#x1f4d7;java源码&#x1f4d5; controller&#x1f4d5; service&#x1f4d5; 其它&#x1f4d5; maven settings.xml &#x1f4d7;测试&#x1f4d5; 测试…...

Java--业务场景:在Spring项目启动时加载Java枚举类到Redis中(补充)

文章目录 前言步骤测试结果 前言 通过Java–业务场景&#xff1a;在Spring项目启动时加载Java枚举类到Redis中,我们成功将Java项目里的枚举类加载到Redis中了&#xff0c;接下来我们只需要写接口获取需要的枚举值数据就可以了&#xff0c;下面一起来编写这个接口吧。 步骤 在…...

WPF 基础入门(资源字典)

资源字典 每个Resources属性存储着一个资源字典集合。如果希望在多个项目之间共享资源的话&#xff0c;就可以创建一个资源字典。资源字段是一个简单的XAML文档&#xff0c;该文档就是用于存储资源的&#xff0c;可以通过右键项目->添加资源字典的方式来添加一个资源字典文件…...

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《考虑电氢耦合和碳交易的电氢能源系统置信间隙鲁棒规划》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 这标题涉及到一个复杂的能源系统规划问题&#xff0c;其中考虑了电氢耦合、碳交易和置信间隙鲁棒规划。以下是对标题各个部分的解读&#xff1a; 电氢耦…...

ubuntu设定时间与外部ntp同步

前言 在 Ubuntu 上&#xff0c;你可以通过配置 systemd-timesyncd 服务来与外部 NTP 服务器同步系统时间。下面是设置的步骤&#xff1a; 安装 NTP 工具&#xff1a; 如果你的系统中没有安装 ntpdate 工具&#xff0c;可以使用以下命令安装&#xff1a; sudo apt-get updat…...

DataFrame详解

清洗相关的API 清洗相关的API: 1.去重API: dropDupilcates 2.删除缺失值API: dropna 3.替换缺失值API: fillna 去重API: dropDupilcates dropDuplicates(subset):删除重复数据 1.用来删除重复数据,如果没有指定参数subset,比对行中所有字段内容,如果全部相同,则认为是重复数据,…...

控制障碍函数(Control Barrier Function,CBF) 三、代码

三、代码实现 3.1、模型 这是一个QP问题&#xff0c;所以我们直接建模 这其实还是之前的那张图&#xff0c;我们把这个大的框架带入到之前的那个小车追击的问题中去&#xff0c;得到以下的一些具体的约束条件 CLF约束 L g V ( x ) u − δ ≤ − L f V ( x ) − λ V ( x ) …...

哈希表-散列表数据结构

1、什么是哈希表&#xff1f; 哈希表也叫散列表&#xff0c;哈希表是根据关键码值(key value)来直接访问的一种数据结构&#xff0c;也就是将关键码值(key value)通过一种映射关系映射到表中的一个位置来加快查找的速度&#xff0c;这种映射关系称之为哈希函数或者散列函数&…...

C# 强制类型转换和as区别和不同使用场景

文章目录 1.强制类型转换2. as 运算符3.实例总结&#xff1a; 在C#中&#xff0c;as 和 强制类型转换&#xff08;例如 (T)value&#xff09;的主要区别在于它们处理类型转换不成功时的行为和适用场景&#xff1a; 1.强制类型转换 使用语法&#xff1a;Type variable (Type)…...

什么是 DDoS 攻击

布式拒绝服务 (DDoS) 攻击是一种恶意尝试,通过大量互联网流量淹没目标或其周围基础设施,从而破坏目标服务器、服务或网络的正常流量。 DDoS 攻击通过利用多个受感染的计算机系统作为攻击流量源来实现有效性。被利用的机器可以包括计算机和其他网络资源。 从高层来看,DDoS 攻…...

c++隐式类型转换与explicit

我们知道&#xff0c;一个float与int做运算时&#xff0c;系统会首先个int类型转换为float类型之后再进行运算&#xff0c;这种隐式类型转换也会发生在类中 看以下例子&#xff0c;定义一个类 class myTime { public:int Hour;myTime() {};myTime(int h) :Hour(h) {}; }; 在…...

BERT Intro

继续NLP的学习&#xff0c;看完理论之后再看看实践&#xff0c;然后就可以上手去kaggle做那个入门的project了orz。 参考&#xff1a; 1810.04805.pdf (arxiv.org) BERT 论文逐段精读【论文精读】_哔哩哔哩_bilibili (强推!)2023李宏毅讲解大模型鼻祖BERT&#xff0c;一小时…...

“To-Do Master“ GPTs:重塑任务管理的趣味与效率

有 GPTs 访问权限的可以点击链接进行体验&#xff1a;https://chat.openai.com/g/g-IhGsoyIkP-to-do-master 部署私人的 To-Do Master 教程&#xff1a;https://github.com/Reborn14/To-Do-Master/tree/main 引言 在忙碌的日常生活中&#xff0c;有效地管理日常任务对于提高生…...

npm安装vue,添加淘宝镜像

如果是第一次使用命令栏可能会遇到权限问题。 解决vscode无法运行npm和node.js命令的问题-CSDN博客 安装 在vscode上面的导航栏选择terminal打开新的命令栏 另外可能会遇到网络或者其他的问题&#xff0c;可以添加淘宝镜像 npm install -g cnpm --registryhttps://registry.…...

LeetCode 2707. 字符串中的额外字符

一、题目 1、题目描述 给你一个下标从 0 开始的字符串 s 和一个单词字典 dictionary 。你需要将 s 分割成若干个 互不重叠 的子字符串&#xff0c;每个子字符串都在 dictionary 中出现过。s 中可能会有一些 额外的字符 不在任何子字符串中。 请你采取最优策略分割 s &#xff…...

Js进阶31-DOM 操作专题

1. JavaScript 的组成部分&#xff1a; ECMAScript&#xff1a;简称 ES&#xff0c;它是欧洲计算机协会&#xff0c;大概每年的六月中旬定制语法规范。DOM&#xff1a;全称 Document Object Model&#xff0c;即为文档对象类型。BOM&#xff1a;全称 Browser Object Model&…...

Hive之set参数大全-4

F 指定在使用 FETCH 命令提取查询结果时的序列化/反序列化器 hive.fetch.output.serde 是 Hive 的一个配置参数&#xff0c;用于指定在使用 FETCH 命令提取查询结果时的序列化/反序列化器。 以下是一个示例&#xff1a; -- 设置 hive.fetch.output.serde 为 org.apache.had…...

竞赛保研 基于深度学习的人脸识别系统

前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的人脸识别系统 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng-senior/…...

9.建造者模式

文章目录 一、介绍二、代码三、实际使用总结 一、介绍 建造者模式旨在将一个复杂对象的构建过程和其表示分离&#xff0c;以便同样的构建过程可以创建不同的表示。这种模式适用于构建对象的算法&#xff08;构建过程&#xff09;应该独立于对象的组成部分以及它们的装配方式的…...

简单的MOV转MP4方法

1.下载腾讯的QQ影音播放器, 此播放器为绿色视频播放器, 除了播放下载好的视频外没有臃肿无用功能 官网 QQ影音 百度网盘链接&#xff1a;https://pan.baidu.com/s/1G0kSC-844FtRfqGnIoMALA 提取码&#xff1a;dh4w 2.用QQ影音打开MOV文件 3.右下角打开影音工具箱 , 选择截取…...

YOLOv8改进 | Neck篇 | 利用ASF-YOLO改进特征融合层(适用于分割和目标检测)

一、本文介绍 本文给大家带来的改进机制是ASF-YOLO(发布于2023.12月份的最新机制),其是特别设计用于细胞实例分割。这个模型通过结合空间和尺度特征,提高了在处理细胞图像时的准确性和速度。在实验中,ASF-YOLO在2018年数据科学竞赛数据集上取得了卓越的分割准确性和速度,…...

基于模块自定义扩展字段的后端逻辑实现(一)

目录 一&#xff1a;背景介绍 二&#xff1a;实现过程 三&#xff1a;字段标准化 四&#xff1a;数据存储 五&#xff1a;数据扩展 六&#xff1a;表的设计 一&#xff1a;背景介绍 最近要做一个系统&#xff0c;里面涉及一个模块是使用拖拉拽的形式配置模块使用的字段表…...

力扣:18.四数之和

一、做题链接&#xff1a;18. 四数之和 - 力扣&#xff08;LeetCode&#xff09; 二、题目分析 1.做这一道题之前本博主建议先看上一篇《三数之和》 2.题目分析 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重…...

.netcore 6 ioc注入的三种方式

1、定义接口 public interface MyInterceptorInterface 2、实现接口 public class MyInterceptorImpl : MyInterceptorInterface 在构造中增加以下代码&#xff0c;便于观察 static ConcurrentDictionary<string, string> keyValues new ConcurrentDictionary<s…...

Python轴承故障诊断 (十)基于VMD+CNN-Transfromer的故障分类

目录 1 变分模态分解VMD的Python示例 2 轴承故障数据的预处理 2.1 导入数据 2.2 故障VMD分解可视化 3 基于VMDCNN-Transformer的轴承故障诊断分类 3.1 定义VMD-CNN-Transformer分类网络模型 3.2 设置参数&#xff0c;训练模型 3.3 模型评估 代码、数据如下&#xff1a…...

【复习】人工智能 第7章 专家系统与机器学习

专家系统就是让机器人当某个领域的专家&#xff0c;但这章专家系统不咋考&#xff0c;主要靠书上没有的机器学习。 一、专家系统的基本组成 二、专家系统与传统程序的比较 &#xff08;1&#xff09;编程思想&#xff1a; 传统程序 数据结构 算法 专家系统 知识 推理 &…...

使用 Apache PDFBox 操作PDF文件

简介 Apache PDFBox库是一个开源的Java工具&#xff0c;专门用于处理PDF文档。它允许用户创建全新的PDF文件&#xff0c;编辑现有的PDF文档&#xff0c;以及从PDF文件中提取内容。此外&#xff0c;Apache PDFBox还提供了一些命令行实用工具。 Apache PDFBox提供了创建、渲染、…...

【Python 常用脚本及命令系列 3.2 -- 检测到弹框跳出然后关掉它--脚本实现】

文章目录 简介脚本实现 简介 在Python中&#xff0c;你可以使用第三方库如pyautogui和pygetwindow来检测屏幕上的弹框并关闭它。这些库可以模拟鼠标和键盘操作&#xff0c;也可以获取窗口信息。 首先&#xff0c;需要安装这些库&#xff08;如果你还没有安装的话&#xff09;&…...

junit单元测试:使用@ParameterizedTest 和 @CsvSource注解简化单元测试方法

在平常的开发工作中&#xff0c;我们经常需要写单元测试。比如&#xff0c;我们有一个校验接口&#xff0c;可能会返回多种错误信息。我们可以针对这个接口&#xff0c;写多个单元测试方法&#xff0c;然后将其场景覆盖全。那么&#xff0c;怎么才能写一个测试方法&#xff0c;…...

C# winform判断自身程序是否已运行,如果已运行则激活窗体

C# winform判断自身程序是否已运行&#xff0c;如果已运行则激活窗体 using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.InteropServices; using System.Threading; using Syst…...

超维空间M1无人机使用说明书——21、基于opencv的人脸识别

引言&#xff1a;M1型号无人机不仅提供了yolo进行物体识别&#xff0c;也增加了基于opencv的人脸识别功能包&#xff0c;仅需要启动摄像头和识别节点即可 链接: 源码链接 一、一键启动摄像头和人脸识别节点 roslaunch robot_bringup bringup_face_detect.launch无报错&#…...

Redis 持久化——AOF

文章目录 为什么需要AOF?概念持久化查询和设置1. 查询AOF启动状态2. 开启AOF持久化2.1 命令行启动AOF2.2 配置文件启动 AOF 3. 触发持久化3.1 自动触发3.3 手动触发 4. AOF 文件重写4.1 什么是AOF重写&#xff1f;4.2 AOF 重写实现4.3 AOF 重写流程 5. 配置说明6. 数据恢复6.1…...

华为云服务介绍(二)

在 华为云服务介绍(一) 中我们看到华为云提供了一系列的云服务,包括计算、存储、网络、数据库、安全等方面的解决方案。通过灵活的系统架构设计,可以充分利用这些云服务技术,从而更好地满足用户的需求。 本文从系统架构的角度出发,通过充分利用华为云提供的各种云服务技…...

mysql列题

mysql列题 1.查询学过「张三」老师授课的同学的信息2.查询没有学全所有课程的同学的信息3.查询没学过"张三"老师讲授的任一门课程的学生姓名4.查询两门及其以上不及格课程的同学的学号&#xff0c;姓名及其平均成绩5.检索" 01 "课程分数小于 60&#xff0c…...

cpu缓存一致性

文章目录 cpu缓存一致性缓存的出现&#xff1a;多核之后带来的缓存一致性问题&#xff0c;如何解决LOCK 指令&#xff08;刚好可以实现上述的目标&#xff09;LOCK 指令特性内存屏障特性编译器屏障的作用MESI协议为什么有了 MESI协议 还需要 内存屏障问题&#xff1a;总结&…...

Android Framework 常见解决方案(25-1)定制CPUSET解决方案-framework部分修改

1 原理说明 这个方案有如下基本需求&#xff1a; 构建自定义CPUSET&#xff0c;/dev/cpuset中包含一个全新的cpuset分组。且可以通过set_cpuset_policy和set_sched_policy接口可以设置自定义CPUSET。开机启动后可以通过zygote判定来对特定的应用进程设置CPUSET&#xff0c;并…...

PyTorch 参数化深度解析:自定义、管理和优化模型参数

目录 torch.nn子模块parametrize parametrize.register_parametrization 主要特性和用途 使用场景 参数和关键字参数 注意事项 示例 parametrize.remove_parametrizations 功能和用途 参数 返回值 异常 使用示例 parametrize.cached 功能和用途 如何使用 示例…...

自承载 Self-Host ASP.NET Web API 1 (C#)

本教程介绍如何在控制台应用程序中托管 Web API。 ASP.NET Web API不需要 IIS。 可以在自己的主机进程中自托管 Web API。 创建控制台应用程序项目 启动 Visual Studio&#xff0c;然后从“开始”页中选择“新建项目”。 或者&#xff0c;从“ 文件 ”菜单中选择“ 新建 ”&a…...

Vue2-子传父和父传子的基本用法

在Vue 2中&#xff0c;可以使用props和$emit来实现子组件向父组件传值&#xff08;子传父&#xff09;和父组件向子组件传值&#xff08;父传子&#xff09;。 子传父&#xff08;子组件向父组件传值&#xff09;的基本用法如下&#xff1a; 在父组件中定义一个属性&#xff…...

使用numpy处理图片——镜像翻转和旋转

在《使用numpy处理图片——基础操作》一文中&#xff0c;我们介绍了如何使用numpy修改图片的透明度。本文我们将介绍镜像翻转和旋转。 镜像翻转 上下翻转 from PIL import Image import numpy as np img Image.open(example.png) data np.array(img)# axis0 is vertical, a…...

HTML5 article标签,<time>...</time>标签和pubdate属性的运用

1、<article>...</article>标签的运用 article标签代表文档、页面或应用程序中独立的、完整的、可以独自被外部引用的内容。它可以是一篇博客或报竟杂志中的文章、一篇论坛帖子、一段用户评论或一个独立的插件&#xff0c;或者其他任何独立的内容。把文章正文放在h…...

Amazing OpenAI API:把非 OpenAI 模型都按 OpenAI API 调用

分享一个有趣的小工具&#xff0c;10MB 身材的小工具&#xff0c;能够将各种不同的模型 API 转换为开箱即用的 OpenAI API 格式。 让许多依赖 OpenAI API 的软件能够借助开发者能够接触到的&#xff0c;非 OpenAI 的 API 私有部署和使用起来。 写在前面 这个小工具软件写于两…...

RK3568平台开发系列讲解(驱动篇)pinctrl 函数操作集结构体讲解

🚀返回专栏总目录 文章目录 一、pinctrl_ops二、pinmux_ops三、pinconf_ops沉淀、分享、成长,让自己和他人都能有所收获!😄 pinctrl_ops:提供有关属于引脚组的引脚的信息。pinmux_ops:选择连接到该引脚的功能。pinconf_ops:设置引脚属性(上拉,下拉,开漏,强度等)。…...

vue购物车案例,v-model 之 lazy、number、trim,与后端交互

购物车案例 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><script src"./js/vue.js"></script> </head> <body> <div id"d1"&…...

云原生Kubernetes: Kubeadm部署K8S 1.29版本 单Master架构

目录 一、实验 1.环境 2.K8S master节点环境准备 3.K8S master节点安装kubelet、kubeadm、kubectl 3.K8S node节点环境准备与软件安装 4.K8S master节点部署服务 5.K8S node节点部署 6.K8S master节点查看集群 7.容器网络&#xff08;CNI&#xff09;部署 8.K8S 集群…...

C++协程操作

什么是C++协程 C++中的协程是一种用户态轻量级线程,它拥有自己的上下文和栈,并且协程的切换和调度由用户定义,不需要陷入内核。如同一个进程可以拥有多个线程,一个线程也可以拥有多个协程。协程的优点在于极高的执行效率,因为协程切换不需要陷入内核,而是由用户程序定义切…...

计算机配件杂谈-鼠标

目录 基础知识鼠标的发展鼠标的左右手鼠标的显示样式鼠标的移动和可见性移动可见性 现在的我们的生活工作都基本上离不开电脑了&#xff0c;不管是你平时玩玩游戏&#xff0c;上班工作等等&#xff1b; 今天将关于鼠标的一些小的技巧分享出来&#xff0c;共勉&#xff01; 基础…...

用Python来制作一个微信聊天机器人

1. 效果展示 通过本地搭建一个flask服务器来接收信息&#xff0c;这里我简单使用展示&#xff0c;就没有对接收的信息进行处理了。 信息接收展示 发送信息展示 这里就直接使用python发送一个post请求即可&#xff0c;可以发送文字或者图片 代码展示 接收信息 #!/usr/bin/e…...

2024年第九届机器学习技术国际会议(ICMLT 2024) 即将召开

2024年第九届机器学习技术国际会议&#xff08;ICMLT 2024&#xff09;将于2024年5月24-26日在挪威奥斯陆举行。ICMLT 2024旨在讨论机器学习技术领域的最新研究技术现状和前沿趋势&#xff0c;为来自世界各地的科学家、工程师、实业家、学者和其他专业人士提供一个互动和交流的…...

算法训练day9Leetcode232用栈实现队列225用队列实现栈

今天学习的文章和视频链接 https://programmercarl.com/%E6%A0%88%E4%B8%8E%E9%98%9F%E5%88%97%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 栈与队列理论基础 见我的博客 https://blog.csdn.net/qq_36372352/article/details/135470438?spm1001.2014.3001.5501 232用栈实现…...