首页 文章 精选 留言 我的

精选列表

搜索[快速],共10000篇文章
优秀的个人博客,低调大师

ElectronEgg v3.8.0 发布,快速开发一个桌面应用

为什么使用 桌面软件(办公方向、 个人工具),仍然是未来十几年 PC 端需求之一,提高工作效率 electron 技术是流行趋势,QQ、百度翻译、阿里网盘、迅雷、有道云笔记 ...... 开源 gitee:https://gitee.com/dromara/electron-egg 3900+ github:https://github.com/dromara/electron-egg 1200+ 本次更新 3.8.0 【增加】新增 ee-bin exec 命令,支持自定义命令。 【增加】新增 ee-core jobs 配置,打开/关闭 messageLog。 【优化】优化 ee-core jsondb 异常处理。 【优化】优化 ee-core controller/services 异常捕获并写log。 【优化】优化 ee-bin loading 动画居中。 【优化】优化 electron-egg logo,优化mac图标,优化Linux系统图标。 【优化】优化 electron-egg loading 动画居中。 【升级】升级ee-core v2.6.0,升级ee-bin v1.3.0 下载 # gitee git clone https://gitee.com/dromara/electron-egg.git # github git clone https://github.com/dromara/electron-egg.git 安装 # 设置国内镜像源(加速) npm config set registry=https://registry.npmmirror.com #如果下载electron慢,配置如下 npm config set electron_mirror=https://registry.npmmirror.com/-/binary/electron/ # 根目录,安装 electron 依赖 npm i # 进入【前端目录】安装 frontend 依赖 cd frontend npm i 运行项目 npm run start 用户案例 更多 访问官网:electron-egg: 一个入门简单、跨平台、企业级桌面软件开发框架

优秀的个人博客,低调大师

如何快速在 Apache DolphinScheduler 新扩展一个任务插件?

作者 | 代立冬 编辑 | Debra Chen Apache DolphinScheduler 是现代数据工作流编排平台,具有非常强大的可视化能力,DolphinScheduler 致力于使数据工程师、分析师、数据科学家等数据工作者都可以简单轻松地搭建各种数据工作流,让数据处理流程更简单可靠。 DolphinScheduler 非常易于使用(easy to use),目前有四种创建工作流的方法: 在 UI 界面上直接通过拖放任务的方式来创建任务 PyDolphinScheduler,通过 Python API 创建工作流,也就是 workflow as code 的方式 编写 yaml 文件,通过 yaml 创建工作流(目前必须安装 PyDolphinScheduler) 通过 Open API 的方式来创建工作流 以上 4 种总有一种方式适合您的场景! 得益于 DolphinScheduler 采用无中心化的整体架构设计,使得 DolphinScheduler 调度性能也是同类开源数据工作流编排平台的 5 倍以上,如果您正有这样的性能问题或者调度延时问题,也不妨试试 DolphinScheduler。 DolphinScheduler界面 好的,接下来言归正题,有不少用户想在 DolphinScheduler 扩展新的任务插件支持(比如添加 Kettle),DolphinScheduler 的任务插件体系是基于 SPI 来进行任务插件扩展的。 什么是 SPI 服务发现? SPI 是 Service Provider Interface 的缩写,是一种常见的服务提供发现机制,比如知名的 OLAP 引擎 Presto 也是使用 SPI 来扩展的。在 java.util.ServiceLoader 的文档里有比较详细的介绍,其抽象的概念是指动态加载某个服务实现。 比如 java.sql.Driver 接口,不同厂商可以针对同一接口做出不同的实现,比如 MySQL 和 PostgreSQL 都有不同的实现提供给用户,而 Java 的 SPI 机制可以为某个接口寻找服务实现。Java 中 SPI 机制主要思想是将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要,其核心思想就是解耦。 SPI 整体机制图如下: SPI 机制中有 4 个重要的组件 : 服务接口 Service Interface 服务接口实现:不同的服务提供方可以提供一个或多个实现;框架或者系统本身也可以提供默认的实现 提供者注册 API(Provider Registration API),这是提供者用来注册实现的 服务访问 API (Service Access API) ,这是调用方用来获取服务的实例的接口 Apache DolphinScheduler 从 2.0 版本开始引入 SPI。将 Apache DolphinScheduler 的 Task 看成一个执行服务,而我们需要根据使用者的选择去执行不同的服务,如果没有的服务,则需要我们自己扩充,我们只需要完成我们的 Task 具体实现逻辑,然后遵守 SPI 的规则,编译成 Jar 并上传到指定目录,就可以使用我们自己编写的 Task 插件来执行具体的任务了。 谁在使用它? 除了前面提到的 Presto 外,还有以下技术都使用到 SPI 技术: 1、Apache DolphinScheduler Task Datasource 2、Apache Flink Flink sql connector,用户实现了一个 Flink-connector 后,Flink 也是通过 SPI 来动态加载的 3、SpringBoot Spring boot spi 4、JDBC JDBC4 也基于 SPI 的机制来发现驱动提供商了,可以通过META-INF/services/java.sql.Driver 文件里指定实现类的方式来暴露驱动提供者 5、更多 common-logging DolphinScheduler SPI工作流程 如上图,Apache DolphinScheduler 中有 2 种 Task : 逻辑 Task 和物理 Task,逻辑 Task 指 Dependent Task,Switch Task 这种控制工作流逻辑的任务插件;物理 Task 是指 Shell Task,SQL Task ,Spark Task ,Python Task 等这种执行具体任务的 Task。 在 Apache DolphinScheduler 中,我们一般扩充的都是物理 Task,物理 Task 都是由 Worker 来调用并执行的,当启动 Worker 服务时,Worker 会来加载相应的实现了规则的 Task lib,HiveTask 被 Apache DolphinScheduler TaskPluginManage 加载了。SPI 的规则图上也有描述,也可以参考 java.util.ServiceLoader 类。 如何扩展一个任务插件? 创建 Maven 项目 mvn archetype:generate \ -DarchetypeGroupId=org.apache.dolphinscheduler \ -DarchetypeArtifactId=dolphinscheduler-hive-client-task \ -DarchetypeVersion=1.10.0 \ -DgroupId=org.apache.dolphinscheduler \ -DartifactId=dolphinscheduler-hive-client-task \ -Dversion=0.1 \ -Dpackage=org.apache.dolphinscheduler \ -DinteractiveMode=false Maven 依赖 org.apache.dolphinscheduler dolphinscheduler-spi ${dolphinscheduler.lib.version} ${common.lib.scope} org.apache.dolphinscheduler dolphinscheduler-task-api ${dolphinscheduler.lib.version} ${common.lib.scope} 创建 Task 通道工厂(TaskChannelFactory) org.apache.dolphinscheduler.spi.task.TaskChannel 插件实现以上接口即可。主要包含创建任务(任务初始化,任务运行等方法)、任务取消,如果是 yarn 任务,则需要实现 org.apache.dolphinscheduler.plugin.task.api.AbstractYarnTask。 我们在 dolphinscheduler-task-api 模块提供了所有任务对外访问的 API,而 dolphinscheduler-spi 模块则是 spi 通用代码库,定义了所有的插件模块,比如告警模块,注册中心模块等,你可以详细阅读查看。 首先我们需要创建任务服务的工厂,其主要作用是帮助构建 TaskChannel 以及 TaskPlugin 参数,同时给出该任务的唯一标识,ChannelFactory 在 Apache DolphinScheduler 的 Task 服务组中,其作用属于是在任务组中的承上启下,交互前后端以及帮助 Worker 构建 TaskChannel。 package org.apache.dolphinscheduler.plugin.task.hive; import org.apache.dolphinscheduler.spi.params.base.PluginParams; import org.apache.dolphinscheduler.spi.task.TaskChannel; import org.apache.dolphinscheduler.spi.task.TaskChannelFactory; import java.util.List; public class HiveClientTaskChannelFactory implements TaskChannelFactory { /** * Create task channel, execute task through this channel * @return task channel */ @Override public TaskChannel create() { return new HiveCliTaskChannel(); } /** * Returns the global unique identifier of this task * @return task name */ @Override public String getName() { return "HIVECLI"; } /** * Parameters required for front-end pages * @return */ @Override public List getParams() { return null; } } 创建 TaskChannel 有了工厂之后,我们会根据工厂创建出 TaskChannel,TaskChannel 包含如下两个方法,一个是取消,一个是创建,目前不需要关注取消,主要关注创建任务。 void cancelApplication(boolean status); /** * 构建可执行任务 */ AbstractTask createTask(TaskRequest taskRequest); public class HiveClientTaskChannel implements TaskChannel { @Override public void cancelApplication(boolean b) { //do nothing } @Override public AbstractTask createTask(TaskRequest taskRequest) { return new HiveClientTask(taskRequest); } } 构建 Task 实现 通过 TaskChannel 我们得到了可执行的物理 Task,但是我们需要给当前 Task 添加相应的实现,才能够让Apache DolphinScheduler 去执行你的任务,首先在编写 Task 之前我们需要先了解一下 Task 之间的关系: 通过上图我们可以看到,基于 Yarn 执行任务的 Task 都会去继承 AbstractYarnTask,不需要经过 Yarn 执行的都会去直接继承 AbstractTaskExecutor,主要是包含一个 AppID,以及 CanalApplication setMainJar 之类的方法,想知道的小伙伴可以自己去深入研究一下,如上可知我们实现的 HiveClient 就需要继承 AbstractYarnTask,在构建 Task 之前,我们需要构建一下适配 HiveClient 的 Parameters 对象用来反序列化JsonParam。 package com.jegger.dolphinscheduler.plugin.task.hive; import org.apache.dolphinscheduler.spi.task.AbstractParameters; import org.apache.dolphinscheduler.spi.task.ResourceInfo; import java.util.List; public class HiveClientParameters extends AbstractParameters { /** * 用HiveClient执行,最简单的方式就是将所有SQL全部贴进去即可,所以我们只需要一个SQL参数 */ private String sql; public String getSql() { return sql; } public void setSql(String sql) { this.sql = sql; } @Override public boolean checkParameters() { return sql != null; } @Override public List getResourceFilesList() { return null; } } 实现了 Parameters 对象之后,我们具体实现 Task,例子中的实现比较简单,就是将用户的参数写入到文件中,通过 Hive -f 去执行任务。 package org.apache.dolphinscheduler.plugin.task.hive; import org.apache.dolphinscheduler.plugin.task.api.AbstractYarnTask; import org.apache.dolphinscheduler.spi.task.AbstractParameters; import org.apache.dolphinscheduler.spi.task.request.TaskRequest; import org.apache.dolphinscheduler.spi.utils.JSONUtils; import java.io.BufferedWriter; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; public class HiveClientTask extends AbstractYarnTask { /** * hive client parameters */ private HiveClientParameters hiveClientParameters; /** * taskExecutionContext */ private final TaskRequest taskExecutionContext; public HiveClientTask(TaskRequest taskRequest) { super(taskRequest); this.taskExecutionContext = taskRequest; } /** * task init method */ @Override public void init() { logger.info("hive client task param is {}", JSONUtils.toJsonString(taskExecutionContext)); this.hiveClientParameters = JSONUtils.parseObject(taskExecutionContext.getTaskParams(), HiveClientParameters.class); if (this.hiveClientParameters != null && !hiveClientParameters.checkParameters()) { throw new RuntimeException("hive client task params is not valid"); } } /** * build task execution command * * @return task execution command or null */ @Override protected String buildCommand() { String filePath = getFilePath(); if (writeExecutionContentToFile(filePath)) { return "hive -f " + filePath; } return null; } /** * get hive sql write path * * @return file write path */ private String getFilePath() { return String.format("%s/hive-%s-%s.sql", this.taskExecutionContext.getExecutePath(), this.taskExecutionContext.getTaskName(), this.taskExecutionContext.getTaskInstanceId()); } @Override protected void setMainJarName() { //do nothing } /** * write hive sql to filepath * * @param filePath file path * @return write success? */ private boolean writeExecutionContentToFile(String filePath) { Path path = Paths.get(filePath); try (BufferedWriter writer = Files.newBufferedWriter(path, StandardCharsets.UTF_8)) { writer.write(this.hiveClientParameters.getSql()); logger.info("file:" + filePath + "write success."); return true; } catch (IOException e) { logger.error("file:" + filePath + "write failed.please path auth."); e.printStackTrace(); return false; } } @Override public AbstractParameters getParameters() { return this.hiveClientParameters; } } 遵守 SPI 规则 # 1,Resource下创建META-INF/services文件夹,创建接口全类名相同的文件 zhang@xiaozhang resources % tree ./ ./ └── META-INF └── services └── org.apache.dolphinscheduler.spi.task.TaskChannelFactory # 2,在文件中写入实现类的全限定类名 zhang@xiaozhang resources % more META-INF/services/org.apache.dolphinscheduler.spi.task.TaskChannelFactory org.apache.dolphinscheduler.plugin.task.hive.HiveClientTaskChannelFactory 打包和部署 ## 1,打包 mvn clean install ## 2,部署 cp ./target/dolphinscheduler-task-hiveclient-1.0.jar $DOLPHINSCHEDULER_HOME/lib/ ## 3,restart dolphinscheduler server 以上操作完成后,我们查看 worker 日志 tail -200f $Apache DolphinScheduler_HOME/log/Apache DolphinScheduler-worker.log Apache DolphinScheduler 的插件开发就到此完成~涉及到前端的修改可以参考: Apache DolphinScheduler-ui/src/js/conf/home/pages/dag/_source/formModel/ NOTICE:目前任务插件的前端还没有实现,因此你需要单独实现插件对应的前端页面。 TaskChannelFactory 继承自 PrioritySPI,这意味着你可以设置插件的优先级,当你有两个插件同名时,你可以通过重写 getIdentify 方法来自定义优先级。高优先级的插件会被加载,但是如果你有两个同名且优先级相同的插件,加载插件时服务器会抛出 IllegalArgumentException。 如果任务插件存在类冲突,你可以采用 Shade-Relocating Classes(https://maven.apache.org/plugins/maven-shade-plugin/)来解决这种问题。 如果您有兴趣试试 Apache DolphinScheduler ,欢迎微信添加小助手 Leonard-ds 或加入 DolphinScheduler Slack: https://s.apache.org/dolphinscheduler-slack, 我将免费全力支持您! 参考: 极速开发扩充 Apache DolphinScheduler Task 类型 | 实用教程 https://blog.csdn.net/s1293678392/article/details/120048318 本文由 白鲸开源科技 提供发布支持!

优秀的个人博客,低调大师

MyCms v4.5 PHP 快速开发后台,接入公众号管理

MyCms 是一款基于 Laravel 开发的开源免费的开源多语言商城 CMS 企业建站系统。 MyCms 基于 Apache2.0 开源协议发布,免费且可商业使用,欢迎持续关注我们。 v4.5 更新内容 fix:自媒体账号列表操作按钮fix:修正动态设置网站语言opt:自定义页面选择模板页面opt:文章分类增加自定义模板选择opt:文章增加自定义模板选择opt:权限路由节点读取优化opt:优化上级权限节点dev:新增公众号服务器接入dev:公众号菜单设置dev:公众号回复设置dev:公众号素材管理dev:公众号用户标签dev:公众号用户列表dev:公众号渠道码dev:新增拖拽排序菜单dev:增加后台基类删除前置方法dev:快捷复制服务器地址 更新功能截图 后台部分页面截图 站点地址 官方网站 : https://www.mycms.net.cn/ 使用手册:https://www.mycms.net.cn/shouce 二次开发:https://www.mycms.net.cn/dev API 文档:https://www.mycms.net.cn/api-doc 模板下载:https://www.mycms.net.cn/muban 演示后台 : https://demo.mycms.net.cn/system/login 演示后台:admin /admin 优秀案例 在线计算网: https://www.zaixianjisuan.com/ 程序员导航: https://nav.mycms.net.cn/ 火马活码:https://www.huomahuoma.com/ 编程宝典:https://www.bianchengbaodian.com

优秀的个人博客,低调大师

MyCms v4.4 PHP 快速开发后台,全新后台模板发布

MyCms 是一款基于 Laravel 开发的开源免费的开源多语言商城 CMS 企业建站系统。 MyCms 基于 Apache2.0 开源协议发布,免费且可商业使用,欢迎持续关注我们。 v4.4 更新内容 fix:后台模板选择fix:后台菜单显示fix:列表开关控件显示fix:表单提交编辑器内容fix:UE编辑器视频播放fix:模板配置tab切换fix:多语言路由匹配opt:优化文章发布opt:优化多语言切换opt:优化会员头像显示opt:优化后台加载(pjax)dev:接入GPT3.5(ChatGpt)dev:自媒体账号表增加字段dev:后台列表增加自定义操作dev:增加微信服务器配置 后台部分页面截图 站点地址 官方网站 : https://www.mycms.net.cn/ 使用手册:https://www.mycms.net.cn/shouce 二次开发:https://www.mycms.net.cn/dev API 文档:https://www.mycms.net.cn/api-doc 模板下载:https://www.mycms.net.cn/muban 演示后台 : https://demo.mycms.net.cn/system/login 演示后台:admin /admin 优秀案例 在线计算网: https://www.zaixianjisuan.com/ 程序员导航: https://nav.mycms.net.cn/ 古诗词网: https://www.gushici.top/ 火马活码:https://www.huomahuoma.com/ 编程宝典:https://www.bianchengbaodian.com

优秀的个人博客,低调大师

JeeSite V5.3.1 发布,BPM 多项更新,Java 快速开发平台

升级内容 升级 spring boot 2.7.10 新增 mybatis.scanTypeAliasesBasePackage 配置,减少启动时间 新增 JoinTable 的 lazy 懒加载属性,标记为懒加载的,默认不进行联表,当需要时再联表 新增 js.cookie 默认存 localStorage,可通过 window.cookieToLocalStorage 关闭默认 新增 oauth2.callbackUrl 回调后的跳转地址(可自定义vue版的账号绑定) 新增 子表编辑的另一种实现例子beetl(当点击行的时候开启编辑状态) 新增 BPM 多实例加减签,串行加减签、并行加减签 新增 BPM 模型的数据对象,在启动流程时作为默认流程变量 新增 BPM currentCmd 线程变量,并优化新增一些 CMD 的类型 优化 BPM 模型的字符串变量中包含逗号的时候自动转换为List,如果增加单引号或双引号,可强制为字符串 优化 BPM 下一步处理人逻辑,并行场景下不影响其他并行任务的节点;会签节点执行人与设置人数相等时自动设定每个会签人。 优化 BPM 退回、撤回、自由流跳转逻辑:并行内的节点跳转,不影响其它并行中的任务;并行内向外跳转,不影响流程正常结束;并行外向内跳转,不影响并行中其它任务,只处理跳转的节点所在串行节点 优化 BPM 撤回,支持退回的任务进行撤回操作;支持并行向内向外会签等的撤回 优化 BPM 自由流,支持选择多节点跳转,适应于并行流程的场景 优化 BPM 工具 BpmUtils.isCurrentCmd 支持获取线程变量里存储的数据 优化 BPM 默认不继承上级任务的优先级,根据需要模型里设置,或每次审批的时候根据需要指定 优化 Cloud 下 避免同时依赖 bpm-rest 和 bpm-client 导致的 BpmUtilsEntity 类冲突问题 优化 文件管理,防止还未上传完成的时候就点击了确定,导致没有上传成功的问题beetl 优化 dataGrid 当没有指定src并锁定表格高度的时候,点击增行按钮后自动滚动到底部 优化 Job 作业调度列表中,增加未启动定时器的时候不能立即运行一次的要求 优化 OSS 对象存储的时候,上传增加 contentType 设置 优化 CMS 各种 url 生成调用,简化网页模板 修正 BPM 并行退回时,有时候会没有产生下一步任务或流程没有结束问题 修正 BPM 模型删除的提示信息,修复点击下载xml时,不下载文件问题 修正 oauth2 绑定账号后的没有跳转到 vue 页面的问题 修正 Cloud 下 BpmEntity 的 id 丢失问题 升级 JeeSite Cloud 社区版,可以商用。 Vue分离端 新增 模块管理增加工程代码生成功能界面 新增 Upload 文件上传的必填验证实例 新增 BPM 会签任务加签减签功能界面 新增 Tabs 表单,拆分表单表单示例 优化 远程表单验证,减少请求频率 优化 treeselect 增加虚拟滚动 优化 showMessage 方法中包含大文本的时候自动切换到 showMessageModal 修正 Table 当子表滚动条拖拽到最右边的时候,不提示表单验证消息问题 #I6LM2N 修正 Upload 子表附件有时候会串的问题 #I6LIGF 修正 DatePicker 不是中文问题 #I6N7DU 修正 codemirror 代码组件的错误 升级方法 修改pom.xml文件中的jeesite-parent版本号为5.3.1-SNAPSHOT 如果你修改了parent、common、core项目源码,请与git上的代码进行同步 如果你是跨版本升级,请注意每一个版本的升级方法,业务上有调整的地方进行修改 执行root/package.bat(sh)打包脚本,强制更新依赖。 Vue分离端升级 请与jeesite-vue代码仓库源码进行同步,合并代码,手动解决冲突代码。 匹配后端版本为JeeSite v5.3.1,可以兼容JeeSite v5.1.0+ 了解更多 JeeSite 官网地址:http://jeesite.com JeeSite 在线文档:http://docs.jeesite.com JeeSite 演示地址:http://demo.jeesite.com JeeSite Vue 演示地址:http://vue.jeesite.com JeeSite 源码仓库:https://gitee.com/thinkgem/jeesite4 JeeSite Vue 前端源码:https://gitee.com/thinkgem/jeesite-vue JeeSite 跨平台手机端:https://gitee.com/thinkgem/jeesite4-uniapp JeeSite Cloud 微服务:https://gitee.com/thinkgem/jeesite4-cloud JeeSite 客户端安装程序:https://gitee.com/thinkgem/jeesite-client

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册