如何将 XxlJob 集成达梦数据库

 1. 前言

在某些情况下,你的项目可能会面临数据库选择的特殊要求,随着国产化的不断推进,达梦数据库是一个常见的选择。本篇博客将教你如何解决 XxlJob 与达梦数据库之间的 SQL 兼容性问题,以便你的任务调度系统能够在这个数据库中正常运行。

 2. 集成 XxlJob

 2.1 相关版本

首先,确保你使用的 XxlJob 版本与本文中的示例相匹配。本示例使用 XxlJob-Admin 2.4.0 版本。你可以从官方网站或 GitHub 上下载相应的版本。

Gitee地址
Github地址

 2.2 添加达梦数据库驱动

你需要添加达梦数据库的 JDBC 驱动到项目的 Maven 依赖中。以下是一个示例 Maven 依赖,确保它与你的达梦数据库版本兼容:

		<dependency>
			<groupId>com.dm</groupId>
			<artifactId>DmJdbcDriver</artifactId>
			<version>1.8.0</version>
		</dependency>

更建议去mvn仓库找寻你需要的链接依赖(或者达梦官方技术文档里也有)

2.3 配置数据库连接

在项目的配置文件中,配置达梦数据库的连接信息,包括 URL、用户名和密码。确保将这些信息配置为你的达梦数据库的实际连接信息。

spring.datasource.url=jdbc:dm://localhost:5236
spring.datasource.username=SYSDBA
spring.datasource.password=你的密码
spring.datasource.driver-class-name=dm.jdbc.driver.DmDriver

2.4 初始化数据库表

XxlJob 需要一组特定的数据库表来存储任务信息和调度信息。你可以使用提供的 SQL 脚本初始化这些表。以下是 SQL 脚本的示例:

CREATE TABLE "SHENG"."XXL_JOB_USER"
(
 "ID" BIGINT IDENTITY(1,1) NOT NULL,
 "USERNAME" VARCHAR(50) NOT NULL,
 "PASSWORD" VARCHAR(50) NOT NULL,
 "ROLE" NUMBER(4,0) NOT NULL,
 "PERMISSION" VARCHAR(255) DEFAULT NULL
 NULL
);

CREATE TABLE "SHENG"."XXL_JOB_REGISTRY"
(
 "ID" BIGINT IDENTITY(1,1) NOT NULL,
 "REGISTRY_GROUP" VARCHAR(50) NOT NULL,
 "REGISTRY_KEY" VARCHAR(255) NOT NULL,
 "REGISTRY_VALUE" VARCHAR(255) NOT NULL,
 "UPDATE_TIME" TIMESTAMP(6) NULL
);

CREATE TABLE "SHENG"."XXL_JOB_LOGGLUE"
(
 "ID" BIGINT IDENTITY(1,1) NOT NULL,
 "JOB_ID" NUMBER(11,0) NOT NULL,
 "GLUE_TYPE" VARCHAR(50) DEFAULT NULL
 NULL,
 "GLUE_SOURCE" TEXT NULL,
 "GLUE_REMARK" VARCHAR(128) NOT NULL,
 "ADD_TIME" TIMESTAMP(6) NULL,
 "UPDATE_TIME" TIMESTAMP(6) NULL
);

CREATE TABLE "SHENG"."XXL_JOB_LOG_REPORT"
(
 "ID" BIGINT IDENTITY(1,1) NOT NULL,
 "TRIGGER_DAY" TIMESTAMP(6) NULL,
 "RUNNING_COUNT" NUMBER(11,0) DEFAULT '0'
 NOT NULL,
 "SUC_COUNT" NUMBER(11,0) DEFAULT '0'
 NOT NULL,
 "FAIL_COUNT" NUMBER(11,0) DEFAULT '0'
 NOT NULL,
 "UPDATE_TIME" TIMESTAMP(6) NULL
);

CREATE TABLE "SHENG"."XXL_JOB_LOG"
(
 "ID" BIGINT IDENTITY(1,1) NOT NULL,
 "JOB_GROUP" NUMBER(11,0) NOT NULL,
 "JOB_ID" NUMBER(11,0) NOT NULL,
 "EXECUTOR_ADDRESS" VARCHAR(255) NULL,
 "EXECUTOR_HANDLER" VARCHAR(255) NULL,
 "EXECUTOR_PARAM" VARCHAR(512) NULL,
 "EXECUTOR_SHARDING_PARAM" VARCHAR(20) NULL,
 "EXECUTOR_FAIL_RETRY_COUNT" NUMBER(11,0) DEFAULT '0'
 NOT NULL,
 "TRIGGER_TIME" TIMESTAMP(6) NULL,
 "TRIGGER_CODE" NUMBER(11,0) NOT NULL,
 "TRIGGER_MSG" CLOB NULL,
 "HANDLE_TIME" TIMESTAMP(6) NULL,
 "HANDLE_CODE" NUMBER(11,0) NOT NULL,
 "HANDLE_MSG" CLOB NULL,
 "ALARM_STATUS" NUMBER(4,0) DEFAULT '0'
 NOT NULL
);

CREATE TABLE "SHENG"."XXL_JOB_LOCK"
(
 "LOCK_NAME" VARCHAR(50) NOT NULL
);

CREATE TABLE "SHENG"."XXL_JOB_INFO"
(
 "ID" BIGINT IDENTITY(1,1) NOT NULL,
 "JOB_GROUP" NUMBER(11,0) NOT NULL,
 "JOB_DESC" VARCHAR(255) NOT NULL,
 "ADD_TIME" TIMESTAMP(6) NULL,
 "UPDATE_TIME" TIMESTAMP(6) NULL,
 "AUTHOR" VARCHAR(64) NULL,
 "ALARM_EMAIL" VARCHAR(255) NULL,
 "SCHEDULE_TYPE" VARCHAR(50) DEFAULT 'NONE'
 NOT NULL,
 "SCHEDULE_CONF" VARCHAR(128) NULL,
 "MISFIRE_STRATEGY" VARCHAR(50) DEFAULT 'DO_NOTHING'
 NOT NULL,
 "EXECUTOR_ROUTE_STRATEGY" VARCHAR(50) NULL,
 "EXECUTOR_HANDLER" VARCHAR(255) NULL,
 "EXECUTOR_PARAM" VARCHAR(512) NULL,
 "EXECUTOR_BLOCK_STRATEGY" VARCHAR(50) NULL,
 "EXECUTOR_TIMEOUT" NUMBER(11,0) DEFAULT '0'
 NOT NULL,
 "EXECUTOR_FAIL_RETRY_COUNT" NUMBER(11,0) DEFAULT '0'
 NOT NULL,
 "GLUE_TYPE" VARCHAR(50) NOT NULL,
 "GLUE_SOURCE" TEXT NULL,
 "GLUE_REMARK" VARCHAR(128) NULL,
 "GLUE_UPDATETIME" TIMESTAMP(6) NULL,
 "CHILD_JOBID" VARCHAR(255) NULL,
 "TRIGGER_STATUS" NUMBER(4,0) DEFAULT '0'
 NOT NULL,
 "TRIGGER_LAST_TIME" NUMBER(13,0) DEFAULT '0'
 NOT NULL,
 "TRIGGER_NEXT_TIME" NUMBER(13,0) DEFAULT '0'
 NOT NULL
);

CREATE TABLE "SHENG"."XXL_JOB_GROUP"
(
 "ID" BIGINT IDENTITY(1,1) NOT NULL,
 "APP_NAME" VARCHAR(64) NOT NULL,
 "TITLE" VARCHAR(50) NOT NULL,
 "ADDRESS_TYPE" NUMBER(4,0) DEFAULT '0'
 NOT NULL,
 "ADDRESS_LIST" TEXT NULL,
 "UPDATE_TIME" TIMESTAMP(6) NULL
);

SET IDENTITY_INSERT "SHENG"."XXL_JOB_GROUP" ON;
INSERT INTO "SHENG"."XXL_JOB_GROUP"("ID","APP_NAME","TITLE","ADDRESS_TYPE","ADDRESS_LIST","UPDATE_TIME") VALUES(1,'xxl-job-executor-sample','示例执行器',0,null,'2023-11-02 17:28:36.084000');
INSERT INTO "SHENG"."XXL_JOB_GROUP"("ID","APP_NAME","TITLE","ADDRESS_TYPE","ADDRESS_LIST","UPDATE_TIME") VALUES(2,'lpsHandler','lpsHandler',0,null,'2023-11-02 17:28:36.083000');

SET IDENTITY_INSERT "SHENG"."XXL_JOB_GROUP" OFF;
SET IDENTITY_INSERT "SHENG"."XXL_JOB_INFO" ON;
INSERT INTO "SHENG"."XXL_JOB_INFO"("ID","JOB_GROUP","JOB_DESC","ADD_TIME","UPDATE_TIME","AUTHOR","ALARM_EMAIL","SCHEDULE_TYPE","SCHEDULE_CONF","MISFIRE_STRATEGY","EXECUTOR_ROUTE_STRATEGY","EXECUTOR_HANDLER","EXECUTOR_PARAM","EXECUTOR_BLOCK_STRATEGY","EXECUTOR_TIMEOUT","EXECUTOR_FAIL_RETRY_COUNT","GLUE_TYPE","GLUE_SOURCE","GLUE_REMARK","GLUE_UPDATETIME","CHILD_JOBID","TRIGGER_STATUS","TRIGGER_LAST_TIME","TRIGGER_NEXT_TIME") VALUES(1,1,'测试任务1','2018-11-03 22:21:31.000000','2018-11-03 22:21:31.000000','XXL','','CRON','0 0 0 * * ? *','DO_NOTHING','FIRST','demoJobHandler','','SERIAL_EXECUTION',0,0,'BEAN','','GLUE代码初始化','2018-11-03 22:21:31.000000','',0,0,0);
INSERT INTO "SHENG"."XXL_JOB_INFO"("ID","JOB_GROUP","JOB_DESC","ADD_TIME","UPDATE_TIME","AUTHOR","ALARM_EMAIL","SCHEDULE_TYPE","SCHEDULE_CONF","MISFIRE_STRATEGY","EXECUTOR_ROUTE_STRATEGY","EXECUTOR_HANDLER","EXECUTOR_PARAM","EXECUTOR_BLOCK_STRATEGY","EXECUTOR_TIMEOUT","EXECUTOR_FAIL_RETRY_COUNT","GLUE_TYPE","GLUE_SOURCE","GLUE_REMARK","GLUE_UPDATETIME","CHILD_JOBID","TRIGGER_STATUS","TRIGGER_LAST_TIME","TRIGGER_NEXT_TIME") VALUES(3,2,'lpsHandler','2023-11-02 17:19:53.438000','2023-11-02 17:28:25.716000','刘品水','','CRON','0/1 * * * * ? ','DO_NOTHING','FIRST','lpsHandler','','SERIAL_EXECUTION',0,0,'BEAN','','GLUE代码初始化','2023-11-02 17:19:53.438000','',1,1698917841000,1698917842000);

SET IDENTITY_INSERT "SHENG"."XXL_JOB_INFO" OFF;
INSERT INTO "SHENG"."XXL_JOB_LOCK"("LOCK_NAME") VALUES('schedule_lock');

SET IDENTITY_INSERT "SHENG"."XXL_JOB_LOG" ON;
INSERT INTO "SHENG"."XXL_JOB_LOG"("ID","JOB_GROUP","JOB_ID","EXECUTOR_ADDRESS","EXECUTOR_HANDLER","EXECUTOR_PARAM","EXECUTOR_SHARDING_PARAM","EXECUTOR_FAIL_RETRY_COUNT","TRIGGER_TIME","TRIGGER_CODE","TRIGGER_MSG","HANDLE_TIME","HANDLE_CODE","HANDLE_MSG","ALARM_STATUS") VALUES(13,2,3,null,'lpsHandler','',null,0,'2023-11-02 17:20:25.518000',500,'任务触发类型:手动触发<br>调度机器:192.168.55.2<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style="color:#00c0ef;" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>',null,0,null,2);

SET IDENTITY_INSERT "SHENG"."XXL_JOB_LOG" OFF;
SET IDENTITY_INSERT "SHENG"."XXL_JOB_LOG_REPORT" ON;
INSERT INTO "SHENG"."XXL_JOB_LOG_REPORT"("ID","TRIGGER_DAY","RUNNING_COUNT","SUC_COUNT","FAIL_COUNT","UPDATE_TIME") VALUES(1,'2023-11-02 00:00:00.000000',0,0,113,null);
INSERT INTO "SHENG"."XXL_JOB_LOG_REPORT"("ID","TRIGGER_DAY","RUNNING_COUNT","SUC_COUNT","FAIL_COUNT","UPDATE_TIME") VALUES(2,'2023-11-01 00:00:00.000000',0,0,0,null);
INSERT INTO "SHENG"."XXL_JOB_LOG_REPORT"("ID","TRIGGER_DAY","RUNNING_COUNT","SUC_COUNT","FAIL_COUNT","UPDATE_TIME") VALUES(3,'2023-10-31 00:00:00.000000',0,0,0,null);

SET IDENTITY_INSERT "SHENG"."XXL_JOB_LOG_REPORT" OFF;
SET IDENTITY_INSERT "SHENG"."XXL_JOB_LOGGLUE" ON;
SET IDENTITY_INSERT "SHENG"."XXL_JOB_LOGGLUE" OFF;
SET IDENTITY_INSERT "SHENG"."XXL_JOB_REGISTRY" ON;
SET IDENTITY_INSERT "SHENG"."XXL_JOB_REGISTRY" OFF;
SET IDENTITY_INSERT "SHENG"."XXL_JOB_USER" ON;
INSERT INTO "SHENG"."XXL_JOB_USER"("ID","USERNAME","PASSWORD","ROLE","PERMISSION") VALUES(1,'admin','e10adc3949ba59abbe56e057f20f883e',1,null);

SET IDENTITY_INSERT "SHENG"."XXL_JOB_USER" OFF;
ALTER TABLE "SHENG"."XXL_JOB_USER" ADD CONSTRAINT  PRIMARY KEY("ID") ;

ALTER TABLE "SHENG"."XXL_JOB_REGISTRY" ADD CONSTRAINT  PRIMARY KEY("ID") ;

ALTER TABLE "SHENG"."XXL_JOB_LOGGLUE" ADD CONSTRAINT  PRIMARY KEY("ID") ;

ALTER TABLE "SHENG"."XXL_JOB_LOG_REPORT" ADD CONSTRAINT  PRIMARY KEY("ID") ;

ALTER TABLE "SHENG"."XXL_JOB_LOG_REPORT" ADD CONSTRAINT "I_TRIGGER_DAY" UNIQUE("TRIGGER_DAY") ;

ALTER TABLE "SHENG"."XXL_JOB_LOG" ADD CONSTRAINT  PRIMARY KEY("ID") ;

ALTER TABLE "SHENG"."XXL_JOB_LOCK" ADD CONSTRAINT  PRIMARY KEY("LOCK_NAME") ;

ALTER TABLE "SHENG"."XXL_JOB_INFO" ADD CONSTRAINT  PRIMARY KEY("ID") ;

ALTER TABLE "SHENG"."XXL_JOB_GROUP" ADD CONSTRAINT  PRIMARY KEY("ID") ;

CREATE UNIQUE INDEX "I_USERNAME"
ON "SHENG"."XXL_JOB_USER"("USERNAME");

CREATE INDEX "I_G_K_V"
ON "SHENG"."XXL_JOB_REGISTRY"("REGISTRY_GROUP","REGISTRY_KEY","REGISTRY_VALUE");

COMMENT ON COLUMN "SHENG"."XXL_JOB_LOGGLUE"."JOB_ID" IS '任务,主键ID';

COMMENT ON COLUMN "SHENG"."XXL_JOB_LOGGLUE"."GLUE_TYPE" IS 'GLUE类型';

COMMENT ON COLUMN "SHENG"."XXL_JOB_LOGGLUE"."GLUE_SOURCE" IS 'GLUE源代码';

COMMENT ON COLUMN "SHENG"."XXL_JOB_LOGGLUE"."GLUE_REMARK" IS 'GLUE备注';

CREATE INDEX "I_TRIGGER_TIME"
ON "SHENG"."XXL_JOB_LOG"("TRIGGER_TIME");

CREATE INDEX "I_HANDLE_CODE"
ON "SHENG"."XXL_JOB_LOG"("HANDLE_CODE");

COMMENT ON COLUMN "SHENG"."XXL_JOB_LOG"."ID" IS '主键ID';

COMMENT ON COLUMN "SHENG"."XXL_JOB_LOG"."JOB_GROUP" IS '执行器主键ID';

COMMENT ON COLUMN "SHENG"."XXL_JOB_LOG"."JOB_ID" IS '任务,主键ID';

COMMENT ON COLUMN "SHENG"."XXL_JOB_LOG"."EXECUTOR_ADDRESS" IS '执行器地址,本次执行的地址';

COMMENT ON COLUMN "SHENG"."XXL_JOB_LOG"."EXECUTOR_HANDLER" IS '执行器任务handler';

COMMENT ON COLUMN "SHENG"."XXL_JOB_LOG"."EXECUTOR_PARAM" IS '执行器任务参数';

COMMENT ON COLUMN "SHENG"."XXL_JOB_LOG"."EXECUTOR_SHARDING_PARAM" IS '执行器任务分片参数,格式如 1/2';

COMMENT ON COLUMN "SHENG"."XXL_JOB_LOG"."EXECUTOR_FAIL_RETRY_COUNT" IS '失败重试次数';

COMMENT ON COLUMN "SHENG"."XXL_JOB_LOG"."TRIGGER_TIME" IS '调度-时间';

COMMENT ON COLUMN "SHENG"."XXL_JOB_LOG"."TRIGGER_CODE" IS '调度-结果';

COMMENT ON COLUMN "SHENG"."XXL_JOB_LOG"."TRIGGER_MSG" IS '调度-日志';

COMMENT ON COLUMN "SHENG"."XXL_JOB_LOG"."HANDLE_TIME" IS '执行-时间';

COMMENT ON COLUMN "SHENG"."XXL_JOB_LOG"."HANDLE_CODE" IS '执行-状态';

COMMENT ON COLUMN "SHENG"."XXL_JOB_LOG"."HANDLE_MSG" IS '执行-日志';

COMMENT ON COLUMN "SHENG"."XXL_JOB_LOG"."ALARM_STATUS" IS '告警状态:0-默认、1-无需告警、2-告警成功、3-告警失败';

COMMENT ON COLUMN "SHENG"."XXL_JOB_INFO"."JOB_DESC" IS '任务描述';

COMMENT ON COLUMN "SHENG"."XXL_JOB_INFO"."SCHEDULE_TYPE" IS '调度类型';

COMMENT ON COLUMN "SHENG"."XXL_JOB_INFO"."SCHEDULE_CONF" IS '调度配置,值含义取决于调度类型';

COMMENT ON COLUMN "SHENG"."XXL_JOB_INFO"."MISFIRE_STRATEGY" IS '调度过期策略';

COMMENT ON COLUMN "SHENG"."XXL_JOB_INFO"."EXECUTOR_ROUTE_STRATEGY" IS '执行器路由策略';

COMMENT ON COLUMN "SHENG"."XXL_JOB_INFO"."EXECUTOR_HANDLER" IS '执行器任务handler';

COMMENT ON COLUMN "SHENG"."XXL_JOB_INFO"."EXECUTOR_PARAM" IS '执行器任务参数';

COMMENT ON COLUMN "SHENG"."XXL_JOB_INFO"."EXECUTOR_BLOCK_STRATEGY" IS '阻塞处理策略';

COMMENT ON COLUMN "SHENG"."XXL_JOB_INFO"."EXECUTOR_TIMEOUT" IS '任务执行超时时间,单位秒';

COMMENT ON COLUMN "SHENG"."XXL_JOB_INFO"."EXECUTOR_FAIL_RETRY_COUNT" IS '失败重试次数';

COMMENT ON COLUMN "SHENG"."XXL_JOB_INFO"."GLUE_TYPE" IS 'GLUE类型';

COMMENT ON COLUMN "SHENG"."XXL_JOB_INFO"."GLUE_SOURCE" IS 'GLUE源代码';

COMMENT ON COLUMN "SHENG"."XXL_JOB_INFO"."GLUE_REMARK" IS 'GLUE备注';

COMMENT ON COLUMN "SHENG"."XXL_JOB_INFO"."GLUE_UPDATETIME" IS 'GLUE更新时间';

COMMENT ON COLUMN "SHENG"."XXL_JOB_INFO"."CHILD_JOBID" IS '子任务ID,多个逗号分隔';

COMMENT ON COLUMN "SHENG"."XXL_JOB_INFO"."TRIGGER_STATUS" IS '调度状态:0-停止,1-运行';

COMMENT ON COLUMN "SHENG"."XXL_JOB_INFO"."TRIGGER_LAST_TIME" IS '上次调度时间';

COMMENT ON COLUMN "SHENG"."XXL_JOB_INFO"."TRIGGER_NEXT_TIME" IS '下次调度时间';

COMMENT ON COLUMN "SHENG"."XXL_JOB_GROUP"."APP_NAME" IS '执行器AppName';

COMMENT ON COLUMN "SHENG"."XXL_JOB_GROUP"."TITLE" IS '执行器名称';

COMMENT ON COLUMN "SHENG"."XXL_JOB_GROUP"."ADDRESS_TYPE" IS '执行器地址类型:0=自动注册、1=手动录入';

COMMENT ON COLUMN "SHENG"."XXL_JOB_GROUP"."ADDRESS_LIST" IS '执行器地址列表,多地址逗号分隔';

以上 SQL 脚本中包括了创建必需的表和插入默认登录账号。注意,你可以根据自己的需求自定义这些表。

 2.5 更新 XML文件XxlJobLogMapper.xml&&XxlJobRegistryMapper.xml

XxlJob 与达梦数据库之间存在 SQL 兼容性问题,因此需要对 XxlJob 的 SQL 映射进行修改。以下是 XML的示例修改,确保 XxlJob 能够在达梦数据库中正常运行:

XxlJobLogMapper.xml

	<select id="findFailJobLogIds" resultType="long" >
		SELECT ID FROM SHENG.XXL_JOB_LOG
		WHERE NOT (
				(TRIGGER_CODE IN (0, 200) AND HANDLE_CODE = 0)
				OR
				(HANDLE_CODE = 200)
			)
		  AND ALARM_STATUS = 0
		ORDER BY ID ASC
			LIMIT #{pagesize}
	</select>

XxlJobRegistryMapper.xml

	<select id="findDead" parameterType="java.util.HashMap" resultType="java.lang.Integer" >
		SELECT t.ID
		FROM SHENG.XXL_JOB_REGISTRY t
		WHERE t.UPDATE_TIME &lt; DATEADD(SECOND, -#{timeout} , #{nowTime})
	</select>
	<select id="findAll" parameterType="java.util.HashMap" resultMap="XxlJobRegistry">

		SELECT <include refid="Base_Column_List" />
		FROM SHENG.XXL_JOB_REGISTRY t
		WHERE t.UPDATE_TIME &lt; DATEADD(SECOND, -#{timeout} , #{nowTime})
	</select>

 2.6 运行 XxlJob

现在,你可以启动 XxlJob 服务,它将连接到达梦数据库并开始正常运行。确保你的配置和数据库初始化都已经完成。

 3. 总结

通过按照上述步骤将 XxlJob 集成到达梦数据库中,你可以解决 SQL 兼容性问题,确保任务调度系统在达梦数据库中正常运行。在选择数据库时,始终考虑到项目需求、性能和兼容性,以便做出明智的选择。

这些步骤应该为你提供了成功集成 XxlJob 和达梦数据库所需的指导。祝你的任务调度系统顺利运行!如果你遇到问题 评论区留言 我看到都会帮着解决的~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Idea去掉显示的测试覆盖率

一.启东时 误点击了 快捷键调出 【Ctrl 】【Alt】【F6】

npm ERR! code ELIFECYCLE

问题&#xff1a; 一个老项目&#xff0c;现在想运行下&#xff0c;打不开了 npm install 也出错 尝试1 、使用cnpm npm install -g cnpm --registryhttps://registry.npm.taobao.org cnpm install 还是不行 尝试2、 package.json 文件&#xff0c;去掉 那个插件 chorm…

Unity中Shader的GI的直接光实现

文章目录 前言一、在上一篇文章中&#xff0c;得到GI相关数据后&#xff0c;需要对其进行Lambert光照模型计算二、在准备好上面步骤后&#xff0c;我们需要准备缺少的数据1、准备上图中的 s.Normal2、准备上图中的 s.Albedo 前言 Unity中Shader的GI的直接光实现&#xff0c;基…

基于springboot实现在线考试平台项目【项目源码+论文说明】

基于springboot实现在线考试平台管理系统演示 摘要 网络的广泛应用给生活带来了十分的便利。所以把在线考试管理与现在网络相结合&#xff0c;利用java技术建设在线考试系统&#xff0c;实现在线考试的信息化。则对于进一步提高在线考试管理发展&#xff0c;丰富在线考试管理经…

【计算机网络】同源策略及跨域问题

1. 同源策略 同源策略是一套浏览器安全机制&#xff0c;当一个源的文档和脚本&#xff0c;与另一个源的资源进行通信时&#xff0c;同源策略就会对这个通信做出不同程度的限制。 同源策略对 同源资源 放行&#xff0c;对 异源资源 限制。因此限制造成的开发问题&#xff0c;称…

OkHttp库爬取百度云视频详细步骤

以下是使用OkHttp库的Kotlin爬虫程序&#xff0c;该爬虫用于爬取百度云的视频。 首先&#xff0c;我们需要导入OkHttp库和Kotlin库。import okhttp3.OkHttpClient和import kotlin.jvm.JVM。 import okhttp3.OkHttpClient import kotlin.jvm.JVM然后&#xff0c;我们需要创建一…

单片机温湿度-光照-DHT11-烟雾气体检测控制系统-proteus仿真-源程序

一、系统方案 本设计采用52单片机作为主控器&#xff0c;液晶1602显示&#xff0c;DHT11温湿度&#xff0c;光照、烟雾气体检测&#xff0c;按键设置报警阀值&#xff0c;蜂鸣器报警。 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统初始化 // // …

docker部署Jenkins(Jenkins+Gitlab+Maven实现CI/CD)

GitLab介绍 GitLab是一个用于仓库管理系统的开源项目&#xff0c;使用Git作为代码管理工具&#xff0c;并在此基础上搭建起来的Web服务&#xff0c;可通过Web界面进行访问公开的或者私人项目。它拥有与Github类似的功能&#xff0c;能够浏览源代码&#xff0c;管理缺陷和注释。…

按键开发环境搭建

雷电模拟器 创建虚拟机 2.设置root权限 打开按键精灵连接虚拟机 开启悬浮 mumu模拟器操作 查找端口方法 adb connect 127.0.0.1:16416 设置-应用-所有应用-按键精灵-开启悬浮 步骤二&#xff1a;开启root 处理未root&#xff1a;中途如果有如下未root的情况&#x…

Perl安装教程

1. perl简介 Perl 是 Practical Extraction and Report Language 的缩写&#xff0c;可翻译为 “实用报表提取语言”。Perl 是高级、通用、直译式、动态的程序语言。Perl 最初的设计者为拉里沃尔&#xff08;Larry Wall&#xff09;&#xff0c;于1987年12月18日发表。Perl 借…

【Unity基础】7.动画状态参数

【Unity基础】7.动画状态参数 大家好&#xff0c;我是Lampard~~ 欢迎来到Unity基础系列博客&#xff0c;所学知识来自B站阿发老师~感谢 &#xff08;一&#xff09;创建动画状态 (1) 创建动画状态 不好意思各位~最近工作比较忙&#xff0c;稍微耽误了这两周的博客。话…

LangChain+LLM实战---向量数据库介绍

原文&#xff1a;Vector Databases Embeddings是由人工智能模型(如大型语言模型)生成的&#xff0c;具有大量的属性或特征&#xff0c;使其表示难以管理。在人工智能和机器学习的背景下&#xff0c;这些特征代表了数据的不同维度&#xff0c;这些维度对于理解模式、关系和底层…

深入理解计算机系统CS213 - Lecture 02

Bits, Bytes, and Integer 1.位运算与条件运算 &&#xff0c;|&#xff0c;^&#xff0c;~ 是做位运算。诸位01运算。 &&&#xff0c;||&#xff0c;&#xff01;是判断条件真假&#xff0c;而后返回0或1。 2. 位移 x << y&#xff1a;左移y位&#xff…

3+单细胞+代谢+WGCNA+机器学习

今天给同学们分享一篇生信文章“Identification of new co-diagnostic genes for sepsis and metabolic syndrome using single-cell data analysis and machine learning algorithms”&#xff0c;这篇文章发表Front Genet.期刊上&#xff0c;影响因子为3.7。 结果解读&#x…

飞书开发学习笔记(三)-利用python开发调试云文档和电子表格

飞书开发学习笔记(三)-利用python开发调试云文档和电子表格 一.建立Python飞书开发环境 首先还是进入开放平台下的API调试台 飞书开放平台&#xff1a;https://open.feishu.cn/app?langzh-CN 以获取"我的空间"下的文件清单为例&#xff0c;通过获取飞书API调试台提…

51单片机锅炉监控系统仿真设计( proteus仿真+程序+原理图+报告+讲解视频)

51单片机锅炉监控系统仿真设计( proteus仿真程序原理图报告讲解视频&#xff09; 1.主要功能&#xff1a;讲解视频2.仿真3. 程序代码4. 原理图5. 设计报告6. 设计资料内容清单&&下载链接资料下载链接&#xff08;可点击&#xff09;&#xff1a; 51单片机锅炉监控系统仿…

企业电脑屏幕监控有哪些?如何实现电脑屏幕监控

企业电脑屏幕监控有哪些&#xff1f;如何实现电脑屏幕监控 下载使用安企神电脑屏幕监控软件 企业电脑屏幕监控是一种监测和记录员工在工作时间内在他们的计算机上执行的活动的技术。这种监控可以有多种目的&#xff0c;包括确保员工的生产力、确保数据安全性&#xff0c;或满…

Git 删除本地和远程分支

目录 删除本地和远程分支分支删除验证验证本地分支验证远程分支 开源项目微服务商城项目前后端分离项目 删除本地和远程分支 删除 youlai-mall 的 dev 本地和远程分支 # 删除本地 dev 分支&#xff08;注&#xff1a;一定要切换到dev之外的分支才能删除&#xff0c;否则报错&…

46基于matlab的模拟退火算法(SA)优化车辆路径问题(VRP)

基于matlab的模拟退火算法&#xff08;SA&#xff09;优化车辆路径问题&#xff08;VRP&#xff09;&#xff0c;在位置已知的条件下&#xff0c;确定车辆到各个指定位置的行程路线图&#xff0c;使得路径最短&#xff0c;运输成本最低。一个位置由一台车服务&#xff0c;且始于…

STM32中微秒延时的实现方式

STM32中微秒延时的实现方式 0.前言一、裸机实现方式二、FreeRTOS实现方式三、定时器实现&#xff08;通用&#xff09;4、总结 0.前言 最近在STM32驱动移植过程中需要用到微秒延时来实现一些外设的时序&#xff0c;由于网上找到的驱动方法良莠不齐&#xff0c;笔者在实现时序过…