Drools开源业务规则引擎(四)- 规则流(rule flow)及手把手教你构建jBPM项目

news2024/11/15 18:20:39

文章目录

  • Drools开源业务规则引擎(四)- 规则流(rule flow)及手把手教你构建jBPM项目
    • 1.什么是规则流
    • 2.构建jBPM项目
      • 2.1.添加maven依赖
      • 2.2.创建kmodule.xml
      • 2.3.新建drl文件和bpmn2文件
      • 2.4.测试方法
      • 2.5.日志输出
    • 3.Eclipse安装jBPM流程文件可视化编辑器
      • 3.1.安装Eclipse
      • 3.2.安装Eclipse BPMN 2.0 Modeler插件
        • 3.2.1.选择Install New Software
        • 3.2.2.点击Add
        • 3.2.3.输入插件安装地址
        • 3.2.4.勾选并安装
      • 3.3.安装jBPM Eclipse 插件
    • 4.创建jBPM流程文件
      • 4.1.新建BPMN2流程文件
      • 4.2.输入文件名称
      • 4.3.保存进入编辑页面
      • 4.4.修改流程文件的属性
      • 4.5.右侧选择元素
      • 4.6.查看文件内容

Drools开源业务规则引擎(四)- 规则流(rule flow)及手把手教你构建jBPM项目

1.什么是规则流

Drools规则流是一个基于事件的有向图,用于描述规则之间的先后顺序和条件关系。规则流由节点连接线组成。

  • 节点:表示规则的执行单元,可以是条件节点、动作节点、决策节点等。条件节点表示规则执行的前提条件,动作节点表示规则执行的操作,决策节点表示根据条件的结果选择不同的规则路径。

  • 连接线:表示规则之间的关联关系和执行顺序,有不同的类型,如分支连接线、合并连接线、决策连接线等。

使用规则流,可以在规则执行过程中灵活地控制规则的执行顺序和条件。规则流还提供了多种控制流程的元素,如循环、分支、并行等,可以根据不同的业务需求来构建复杂的规则逻辑。

2.构建jBPM项目

DroolsjBPM是两个相互关联的项目,都是由Red Hat(前身为JBoss)开发和维护的。

jBPM是一个开源的业务流程管理(BPM)系统,用于设计、执行和监控业务流程。jBPM可以与Drools规则引擎无缝集成,通过规则节点将规则和决策引入业务流程中。它提供了建模器和编辑器来设计和模型化业务流程,并提供了执行引擎来管理和执行这些流程。

2.1.添加maven依赖

本文仍在前面篇幅的springboot项目上搭建,只需添加以下依赖即可:

				<!--如果没有导入drools的,别忘了添加drools依赖-->
<!--        <dependency>-->
<!--            <groupId>org.drools</groupId>-->
<!--            <artifactId>drools-compiler</artifactId>-->
<!--            <version>7.6.0.Final</version>-->
<!--        </dependency>-->

				<!--drools和jbpm的依赖版本一致-->
        <dependency>
            <groupId>org.jbpm</groupId>
            <artifactId>jbpm-bpmn2</artifactId>
            <version>7.6.0.Final</version>
        </dependency>

2.2.创建kmodule.xml

<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">
    <kbase name="rule-flow-kbase" packages="drools.flow">
        <ksession name="sessionName"/>
    </kbase>
</kmodule>

resources目录下:META-INF/kmodule.xml

在这里插入图片描述

2.3.新建drl文件和bpmn2文件

demo.drl

package drools.flow;
dialect  "mvel"

// 导入输入类型
import com.ahao.project.input.UserIn;
global com.ahao.project.output.UserOut output;


rule "flow-demo"
ruleflow-group "Group1"
when
    $in:UserIn()
then
    output.setAgeStages("命中规则:flow-demo");
end

drl.bpmn2

<?xml version="1.0" encoding="UTF-8"?>
<bpmn2:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:g="http://www.jboss.org/drools/flow/gpd" xmlns:tns="http://www.jboss.org/drools" xmlns="http://www.jboss.org/drools" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd http://www.jboss.org/drools drools.xsd http://www.bpsim.org/schemas/1.0 bpsim.xsd" id="Definition" expressionLanguage="http://www.mvel.org/2.0" targetNamespace="http://www.jboss.org/drools" typeLanguage="http://www.java.com/javaTypes">
  <bpmn2:process id="my_demo_1" tns:version="1" tns:packageName="drools.flow" tns:adHoc="false" name="my_demo" isExecutable="true" processType="Private">
    <bpmn2:startEvent id="_jbpm-unique-0" name="开始" isInterrupting="false">
      <bpmn2:outgoing>SequenceFlow_2</bpmn2:outgoing>
    </bpmn2:startEvent>
    <bpmn2:sequenceFlow id="SequenceFlow_2" tns:priority="1" sourceRef="_jbpm-unique-0" targetRef="BusinessRuleTask_1"/>
    <bpmn2:businessRuleTask id="BusinessRuleTask_1" tns:ruleFlowGroup="Group1" name="业务规则">
      <bpmn2:incoming>SequenceFlow_2</bpmn2:incoming>
      <bpmn2:outgoing>SequenceFlow_3</bpmn2:outgoing>
    </bpmn2:businessRuleTask>
    <bpmn2:sequenceFlow id="SequenceFlow_3" tns:priority="1" sourceRef="BusinessRuleTask_1" targetRef="EndEvent_2"/>
    <bpmn2:endEvent id="EndEvent_2" name="结束">
      <bpmn2:incoming>SequenceFlow_3</bpmn2:incoming>
      <bpmn2:terminateEventDefinition id="TerminateEventDefinition_1"/>
    </bpmn2:endEvent>
  </bpmn2:process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_1">
    <bpmndi:BPMNPlane id="BPMNPlane_Process_1" bpmnElement="my_demo_1">
      <bpmndi:BPMNShape id="BPMNShape_StartEvent_1" bpmnElement="_jbpm-unique-0">
        <dc:Bounds height="48.0" width="48.0" x="105.0" y="125.0"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="BPMNShape_EndEvent_2" bpmnElement="EndEvent_2">
        <dc:Bounds height="36.0" width="36.0" x="396.0" y="138.0"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="BPMNShape_BusinessRuleTask_3" bpmnElement="BusinessRuleTask_1">
        <dc:Bounds height="50.0" width="110.0" x="220.0" y="120.0"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_4" bpmnElement="SequenceFlow_2" sourceElement="BPMNShape_StartEvent_1" targetElement="BPMNShape_BusinessRuleTask_3">
        <di:waypoint xsi:type="dc:Point" x="153.0" y="149.0"/>
        <di:waypoint xsi:type="dc:Point" x="183.0" y="149.0"/>
        <di:waypoint xsi:type="dc:Point" x="183.0" y="145.0"/>
        <di:waypoint xsi:type="dc:Point" x="220.0" y="145.0"/>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="BPMNEdge_SequenceFlow_5" bpmnElement="SequenceFlow_3" sourceElement="BPMNShape_BusinessRuleTask_3" targetElement="BPMNShape_EndEvent_2">
        <di:waypoint xsi:type="dc:Point" x="330.0" y="145.0"/>
        <di:waypoint xsi:type="dc:Point" x="359.0" y="145.0"/>
        <di:waypoint xsi:type="dc:Point" x="359.0" y="156.0"/>
        <di:waypoint xsi:type="dc:Point" x="396.0" y="156.0"/>
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</bpmn2:definitions>

resources目录下:

在这里插入图片描述

注意⚠️:有关bpmn2文件会在下一个节说明

2.4.测试方法

    @Test
    public void test(){
        KieServices ks = KieServices.Factory.get();
        // 获取一个Kie容器对象,该容器对象包含了从类路径中加载的规则(如DRL文件)、模型和其他相关资源。
        KieContainer kieContainer = ks.getKieClasspathContainer();
        // 获取KieSession
        KieSession kieSession = kieContainer.newKieSession("sessionName");
        // 创建规则输出对象
        UserOut output = new UserOut();
        kieSession.setGlobal("output", output);
        // 创建规则输入对象
        UserIn input = new UserIn();
        input.setAge(19);
        // 执行规则
        kieSession.insert(input);
      	// 创建一个流程事件监听器
        kieSession.addEventListener(new DebugProcessEventListener());
        // 指定流程id
      	// drl.bpmn2文件中的process:id
      	// <bpmn2:process id="my_demo_1" tns:version="1" tns:packageName="drools.flow" tns:adHoc="false" name="my_demo" isExecutable="true" processType="Private">
        kieSession.startProcess("my_demo_1");
        kieSession.fireAllRules();
        kieSession.dispose();
        System.out.println(output);
    }

2.5.日志输出

14:22:23.468 [main] INFO org.drools.core.event.DebugProcessEventListener - ==>[ProcessStarted(name=my_demo; id=my_demo_1)]
14:22:23.480 [main] INFO org.drools.core.event.DebugProcessEventListener - ==>[ProcessNodeTriggered(nodeId=1; id=0; nodeName=开始; processName=my_demo; processId=my_demo_1)]
14:22:23.481 [main] INFO org.drools.core.event.DebugProcessEventListener - ==>[ProcessNodeLeft(nodeId=1; id=0; nodeName=开始; processName=my_demo; processId=my_demo_1)]
14:22:23.481 [main] INFO org.drools.core.event.DebugProcessEventListener - ==>[ProcessNodeTriggered(nodeId=2; id=1; nodeName=业务规则; processName=my_demo; processId=my_demo_1)]
14:22:23.483 [main] DEBUG org.drools.core.common.DefaultAgenda - State was INACTIVE is now FIRING_ALL_RULES
14:22:23.518 [main] DEBUG org.drools.core.common.DefaultAgenda - State was FIRING_ALL_RULES is now HALTING
14:22:23.518 [main] DEBUG org.drools.core.common.DefaultAgenda - State was HALTING is now INACTIVE
14:22:23.519 [main] INFO org.drools.core.event.DebugProcessEventListener - ==>[ProcessNodeLeft(nodeId=2; id=1; nodeName=业务规则; processName=my_demo; processId=my_demo_1)]
14:22:23.519 [main] INFO org.drools.core.event.DebugProcessEventListener - ==>[ProcessNodeTriggered(nodeId=3; id=2; nodeName=结束; processName=my_demo; processId=my_demo_1)]
14:22:23.519 [main] INFO org.drools.core.event.DebugProcessEventListener - ==>[ProcessNodeLeft(nodeId=3; id=2; nodeName=结束; processName=my_demo; processId=my_demo_1)]
14:22:23.519 [main] INFO org.drools.core.event.DebugProcessEventListener - ==>[ProcessCompleted(name=my_demo; id=my_demo_1)]
14:22:23.519 [main] INFO org.drools.core.event.DebugProcessEventListener - ==>[ProcessCompleted(name=my_demo; id=my_demo_1)]
14:22:23.519 [main] INFO org.drools.core.event.DebugProcessEventListener - ==>[ProcessNodeLeft(nodeId=3; id=2; nodeName=结束; processName=my_demo; processId=my_demo_1)]
14:22:23.519 [main] INFO org.drools.core.event.DebugProcessEventListener - ==>[ProcessNodeTriggered(nodeId=3; id=2; nodeName=结束; processName=my_demo; processId=my_demo_1)]
14:22:23.519 [main] INFO org.drools.core.event.DebugProcessEventListener - ==>[ProcessNodeLeft(nodeId=2; id=1; nodeName=业务规则; processName=my_demo; processId=my_demo_1)]
14:22:23.519 [main] INFO org.drools.core.event.DebugProcessEventListener - ==>[ProcessNodeTriggered(nodeId=2; id=1; nodeName=业务规则; processName=my_demo; processId=my_demo_1)]
14:22:23.519 [main] INFO org.drools.core.event.DebugProcessEventListener - ==>[ProcessNodeLeft(nodeId=1; id=0; nodeName=开始; processName=my_demo; processId=my_demo_1)]
14:22:23.519 [main] INFO org.drools.core.event.DebugProcessEventListener - ==>[ProcessNodeTriggered(nodeId=1; id=0; nodeName=开始; processName=my_demo; processId=my_demo_1)]
14:22:23.520 [main] INFO org.drools.core.event.DebugProcessEventListener - ==>[ProcessStarted(name=my_demo; id=my_demo_1)]
14:22:23.520 [main] DEBUG org.drools.core.common.DefaultAgenda - State was INACTIVE is now FIRING_ALL_RULES
14:22:23.520 [main] DEBUG org.drools.core.common.DefaultAgenda - State was FIRING_ALL_RULES is now HALTING
14:22:23.520 [main] DEBUG org.drools.core.common.DefaultAgenda - State was HALTING is now INACTIVE
UserOut(ageStages=命中规则:flow-demo)

至此一个业务流程+规则引擎项目集成完毕。但是相信很多读者都能较好的理解drl文件的内容,毕竟国内有关drools的教程和文档还算全面。相对而言,jBPM项目的流程文件(上述的bpmn2文件)就比较少,并且jBPM有一套自己的XML Schema,有关其bpmn2.xml内容说明,本篇博客将不做介绍(因为博主也还在研究中,只是有些浅显的认知),而且手搓代码也没有必要,先介绍一个图形化的编辑工具 Eclipse BPMN 2.0 Modeler,之所以选择Eclipse,没有选择IDEA,因为IDEA没有专门的jBPM流程文件的编辑器(单纯的bpmn编辑器肯定是不够的呀😂)。

3.Eclipse安装jBPM流程文件可视化编辑器

Eclipse BPMN2 Modeler是一个开源的Eclipse插件,用于在Eclipse中创建和编辑BPMN(业务流程建模和标记语言)模型。

该插件为Eclipse提供了一套工具和编辑器,可帮助用户通过图形化界面轻松绘制和修改BPMN模型。它支持BPMN 2.0规范,并提供了各种元素(例如任务、网关、事件等)和连接(例如顺序流、消息流等)来构建流程模型。

3.1.安装Eclipse

本节不详细说明,网上都有很多教程。博主安装版本为Version: 2022-09 (4.25.0)

3.2.安装Eclipse BPMN 2.0 Modeler插件

官方教程: Installation

3.2.1.选择Install New Software

在这里插入图片描述

3.2.2.点击Add

在这里插入图片描述

3.2.3.输入插件安装地址

根据自己安装的Eclipse版本选择

  • Eclipse 3.6 (Helios): http://download.eclipse.org/bpmn2-modeler/updates/helios

  • Eclipse 3.7 - 4.2.1 (Indigo - Juno): http://download.eclipse.org/bpmn2-modeler/updates/juno

  • Eclipse 4.3 (Kepler): http://download.eclipse.org/bpmn2-modeler/updates/kepler

在这里插入图片描述

3.2.4.勾选并安装

勾选所有的选项,点击下一步并完成安装

在这里插入图片描述

3.3.安装jBPM Eclipse 插件

官方教程:jBPM Eclipse Plugin

同上节安装流程一样,只是安装地址不一样:http://downloads.jboss.org/jbpm/release/6.0.1.Final/updatesite/

不需要选择所有的项目安装,根据官网教程只需要JBoss Drools CoreJBoss jBPM Core 就行。

在这里插入图片描述

4.创建jBPM流程文件

4.1.新建BPMN2流程文件

在这里插入图片描述

4.2.输入文件名称

在这里插入图片描述

4.3.保存进入编辑页面

在这里插入图片描述

4.4.修改流程文件的属性

对应上述bpmn2文件中对应xml标签的属性

<bpmn2:process id=“my_demo_1” tns:version=“1” tns:packageName=“drools.flow” tns:adHoc=“false” name=“my_demo” isExecutable=“true” processType=“Private”>

在这里插入图片描述

4.5.右侧选择元素

在这里插入图片描述

4.6.查看文件内容

在这里插入图片描述

至此,可视化编辑器安装和jBPM流程文件的创建流程介绍完了,有关jBPM流程文件的元素使用,将会再下一篇博客进行详细介绍。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

24西安电子科技大学马克思主义学院—考研录取情况

01、马克思主义学院各个方向 02、24马克思主义学院近三年复试分数线对比 PS&#xff1a;马院24年院线相对于23年院线增加15分&#xff0c;反映了大家对于马克思主义理论学习与研究的热情高涨&#xff0c;也彰显了学院在人才培养、学科建设及学术研究等方面的不断进步与成就。 6…

Apache Seata应用侧启动过程剖析——注册中心与配置中心模块

本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 Apache Seata应用侧启动过程剖析——注册中心与配置中心模块 前言 在Seata的应用侧&#xf…

Docker逃逸CVE-2019-5736、procfs云安全漏洞复现,全文5k字,超详细解析!

Docker容器挂载procfs 逃逸 procfs是展示系统进程状态的虚拟文件系统&#xff0c;包含敏感信息。直接将其挂载到不受控的容器内&#xff0c;特别是容器默认拥有root权限且未启用用户隔离时&#xff0c;将极大地增加安全风险。因此&#xff0c;需谨慎处理&#xff0c;确保容器环…

最适合mysql5.6安装的linux版本-实战

文章目录 一, 适合安装mysql5.6的linu版本1. CentOS 72. Ubuntu 14.04 LTS (Trusty Tahr)3. Debian 8 (Jessie)4. Red Hat Enterprise Linux (RHEL) 7 二, 具体以Ubuntu 14.04 LTS (Trusty Tahr)为例安装虚拟机安装Ubuntu 14.04 LTS (Trusty Tahr) 自己弄安装ssh(便于远程访问,…

入职字节外包2个月后,我离职了...

有一种打工人的羡慕&#xff0c;叫做“大厂”。 真是年少不知大厂香&#xff0c;错把青春插稻秧。 但是&#xff0c;在深圳有一群比大厂员工更庞大的群体&#xff0c;他们顶着大厂的“名”&#xff0c;做着大厂的工作&#xff0c;还可以享受大厂的伙食&#xff0c;却没有大厂…

短视频商城系统源码揭秘:架构设计与实现

在短视频平台和电商平台蓬勃发展的背景下&#xff0c;短视频商城系统应运而生&#xff0c;融合了短视频内容和电商功能&#xff0c;给用户带来了全新的购物体验。本文将揭示短视频商城系统的源码架构设计与实现&#xff0c;帮助开发者了解该系统的内部工作原理及其关键技术。 …

C++11中新特性介绍-之(二)

11.自动类型推导 (1) auto类型自动推导 auto自动推导变量的类型 auto并不代表某个实际的类型&#xff0c;只是一个类型声明的占位符 auto并不是万能的在任意场景下都能推导&#xff0c;使用auto声明的变量必须进行初始化&#xff0c;以让编译器推导出它的实际类型&#xff0c;…

自然之美无需雕琢

《自然之美&#xff0c;无需雕琢 ”》在这个颜值至上的时代&#xff0c;但在温馨氛围中&#xff0c;单依纯以一种意想不到的方式&#xff0c;为我们诠释了自然之美的真谛。而医生的回答&#xff0c;如同一股清流耳目一新。“我说医生你看我这张脸&#xff0c;有没有哪里要动的。…

团队编程:提升代码质量与知识共享的利器

目录 前言1. 什么是团队编程&#xff1f;1.1 团队编程的起源1.2 团队编程的工作流程 2. 团队编程的优势2.1 提高代码质量2.2 促进知识共享2.3 增强团队协作2.4 提高开发效率 3. 团队编程的挑战3.1 开发成本较高3.2 需要良好的团队协作3.3 个人风格和习惯的差异3.4 长时间的集中…

2024亚太杯数学建模竞赛(B题)的全面解析

你是否在寻找数学建模比赛的突破点&#xff1f;数学建模进阶思路&#xff01; 作为经验丰富的数学建模团队&#xff0c;我们将为你带来2024亚太杯数学建模竞赛&#xff08;B题&#xff09;的全面解析。这个解决方案包不仅包括完整的代码实现&#xff0c;还有详尽的建模过程和解…

Docker:一、安装与卸载、配置阿里云加速器(Ubuntu)

目录 &#x1f341;安装docker&#x1f332;1、环境准备&#x1f332;2、安装docker Engine&#x1f9ca;1、卸载旧版、任何冲突的包&#x1f9ca;2、使用存储库安装&#x1f9ca;3、安装 Docker 包。&#x1f9ca;4、查询是否安装成功&#x1f9ca;5、运行hello-world镜像&…

图像处理调试软件推荐

对于图像处理的调试&#xff0c;使用具有图形用户界面&#xff08;GUI&#xff09;且支持实时调整和预览的图像处理软件&#xff0c;可以大大提高工作效率。以下是几款常用且功能强大的图像处理调试软件推荐&#xff1a; ImageJ/FijiMATLABOpenCV with GUI LibrariesNI Vision …

Stable Diffusion:最全详细图解

Stable Diffusion&#xff0c;作为一种革命性的图像生成模型&#xff0c;自发布以来便因其卓越的生成质量和高效的计算性能而受到广泛关注。不同于以往的生成模型&#xff0c;Stable Diffusion在生成图像的过程中&#xff0c;采用了独特的扩散过程&#xff0c;结合深度学习技术…

WAIC:生成式 AI 时代的到来,高通创新未来!

目录 01 在终端侧算力上&#xff0c;动作最快的就是高通 02 模型优化&#xff0c;完成最后一块拼图 在WAIC上&#xff0c;高通展示的生成式AI创新让我们看到了未来的曙光。 生成式 AI 的爆发带来了意想不到的产业格局变化&#xff0c;其速度之快令人惊叹。 仅在一个月前&…

考研必备~总结严蔚敏教授《数据结构》课程的重要知识点及考点

作者主页&#xff1a;知孤云出岫 目录 1. 基本概念1.1 数据结构的定义1.2 抽象数据类型 (ADT) 2. 线性表2.1 顺序表2.2 链表 3. 栈和队列3.1 栈3.2 队列 4. 树和二叉树4.1 树的基本概念4.2 二叉树 5. 图5.1 图的基本概念5.2 图的遍历 6. 查找和排序6.1 查找6.2 排序 7. 重点考…

[图解]SysML和EA建模住宅安全系统-11-接口块

1 00:00:00,660 --> 00:00:04,480 接下来的步骤是定义系统上下文 2 00:00:04,960 --> 00:00:07,750 首先是图17.17 3 00:00:09,000 --> 00:00:10,510 系统上下文展示了 4 00:00:10,520 --> 00:00:12,510 ESS和外部系统、用户 5 00:00:12,520 --> 00:00:14,1…

简介时间复杂度

好了&#xff0c;今天我们来了解一下&#xff0c;我们在做练习题中常出现的一个名词。时间复杂度。我相信大家如果有在练习过题目的话。对这个名词应该都不陌生吧。但是可能很少的去思考它是干什么的代表的什么意思。反正我以前练习的时候就是这样。我只知道有这么一个名词在题…

DevOps实战:使用GitLab+Jenkins+Kubernetes(k8s)建立CI_CD解决方案

一.系统环境 本文主要基于Kubernetes1.21.9和Linux操作系统CentOS7.4。 服务器版本docker软件版本Kubernetes(k8s)集群版本CPU架构CentOS Linux release 7.4.1708 (Core)Docker version 20.10.12v1.21.9x86_64CI/CD解决方案架构图:CI/CD解决方案架构图描述:程序员写好代码之…

测试几个 ocr 对日语的识别情况

测试几个 ocr 对日语的识别情况 1. EasyOCR2. PaddleOCR3. Deepdoc&#xff08;识别pdf中图片&#xff09;4. Deepdoc&#xff08;识别pdf中文字&#xff09;5. Nvidia neva-22b6. Claude 3.5 sonnet 识别图片中的文字7. Claude 3.5 sonnet 识别 pdf 中表格8. OpenAI gpt-4o 识…

CMS Made Simple v2.2.15 远程命令执行漏洞(CVE-2022-23906)

前言 CVE-2022-23906 是一个远程命令执行&#xff08;RCE&#xff09;漏洞&#xff0c;存在于 CMS Made Simple v2.2.15 中。该漏洞通过上传头像功能进行利用&#xff0c;攻击者可以上传一个经过特殊构造的图片文件来触发漏洞。 漏洞详情 CMS Made Simple v2.2.15 中的头像上…