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

SpringBoot整合Activiti7——定时器事件(九)

文章目录

  • 定时器事件
    • 时间定义
      • 时间固定
      • 时间段
      • 时间周期
    • 1.开始事件
    • 2.中间事件
    • 3.边界事件
    • 代码实现
      • xml文件
      • 自定义服务任务监听器
      • 自定义用户任务监听器
      • 测试流程
      • 流程执行步骤


定时器事件

可以用在开始事件、中间事件、边界事件上,边界事件可以是中断和非中断边界事件

需要开启异步任务配置:全局配置类中 config.setAsyncExecutorActivate(true);

触发时间后会在 act_ru_timer_job 表中记录,事件结束后自动删除。

时间定义

时间固定

遵循ISO 8601标准

<timerEventDefinition><timeDate>2023-08-19T09:24:20</timeDate>
</timerEventDefinition>

时间段

P表示日期的开始(年月日),T表示时间的开始(时分秒)

  • P10DT5M:表示每10天5分钟为一个周期
  • PM10M:每10分钟为一个周期
  • PT1M:一分钟后执行一次
  • PT20S:20秒后执行一次
<timerEventDefinition><timeDuration>P10DT5M</timeDuration>
</timerEventDefinition>

时间周期

  • R3/PT10H表示:重复3次,每次间隔10小时
  • R3/PT3S:循环3次,间隔3秒
  • R/PT1H:每隔1小时执行一次
<timerEventDefinition><timeCycle>R3/PT10H</timeCycle>
</timerEventDefinition>

1.开始事件

使用场景:流程只需要启动一次、流程需要在特定的时间间隔重复启动。

  • 子流程不能有定时开始事件
  • 流程部署后马上开始定时事件,不需要手动启动流程,如果手动启动后会额外启动一个流程
  • 当部署带有定时器启动事件的流程的更新版本时,上一版本的定时器作业会被移除
<!-- 定时器开始事件 -->
<startEvent id="sid-eac7f836-a8c2-4120-bfc7-4b06c0705e8b" name="定时开始事件"><timerEventDefinition><!-- 固定日期 --><timeDate>2023-08-19T09:24:20</timeDate><!-- 循环周期(部署流程后自动执行服务任务3次,间隔3秒,并且会执行3次用户任务,触发3个定时边界事件) -->
<!--        <timeCycle>R3/PT3S</timeCycle>--></timerEventDefinition>
</startEvent>

2.中间事件

使用场景:定时器中间事件是一个Catching事件,当执行到达捕获事件节点, 就会启动一个定时器,并一直等待触发,只有到达指定时间定时器才被触发。

<!-- 定时器中间事件 -->
<intermediateCatchEvent id="sid-018de371-80da-4706-a948-ac10f838f9d0" name="定时器中间事件"><timerEventDefinition><!-- 定时20秒后执行 --><timeDuration>PT20S</timeDuration></timerEventDefinition>
</intermediateCatchEvent>

3.边界事件

使用场景:当某个用户任务或者子流程在规定的时间后还没有执行。那么我们就可以通过定时器边界事件来触发执行特定的处理流程。

其中cancelActivity属性,用于说明该事件是否为中断事件。cancelActivity属性值默认为true,表示它是边界中断事件,当该边界事件触发时,它所依附的活动实例被终止,原有的执行流会被中断,流程将沿边界事件的外出顺序流继续流转。如果将其设置为false,表示它是边界非中断事件,当边界事件触发时,则原来的执行流仍然存在,所依附的活动实例继续执行,同时也执行边界事件的外出顺序流。

<!-- 定时器边界事件,cancelActivity属性是触发边界事件后,原流程是否中断,为true是中断,默认为true -->
<boundaryEvent id="sid-0f29bc51-9400-4b01-a13c-e9c37b2bec0a" attachedToRef="sid-8c894b30-98d9-455d-9766-2a8e22f4e7ab" cancelActivity="true" name="定时器边界事件"><timerEventDefinition><!-- 定时一分钟后执行 --><timeDuration>PT1M</timeDuration></timerEventDefinition>
</boundaryEvent>

代码实现

定时器开始事件 - 自动任务 - 定时器中间事件 - 用户任务(定时器边界事件非中断)- 用户任务(定时器边界事件中断)- 结束
在这里插入图片描述

xml文件

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/processdef"><process id="timer" name="定时器事件" isExecutable="true"><documentation>模拟定时器事件</documentation><!-- 定时器开始事件 --><startEvent id="sid-eac7f836-a8c2-4120-bfc7-4b06c0705e8b" name="定时开始事件"><timerEventDefinition><!-- 固定日期 --><timeDate>2023-08-19T11:35:00</timeDate><!-- 循环周期(部署流程后自动执行服务任务3次,间隔3秒,并且会执行3次用户任务,触发3个定时边界事件) -->
<!--        <timeCycle>R3/PT3S</timeCycle>--></timerEventDefinition></startEvent><sequenceFlow id="sid-aa41edf6-f2e4-414b-8758-3d49d5d09dd5" sourceRef="sid-eac7f836-a8c2-4120-bfc7-4b06c0705e8b" targetRef="sid-dbdad760-92b3-4561-a1e7-9401197b7aa7"/><!-- 服务任务,会自动自己执行,无需人工。服务任务一般是一段可自动执行的任务而无需人工干预 --><serviceTask id="sid-dbdad760-92b3-4561-a1e7-9401197b7aa7" activiti:exclusive="true" name="服务任务" activiti:delegateExpression="${myServiceTaskListener}"/><sequenceFlow id="sid-56d3c5eb-4e3f-4904-bf20-250241539247" sourceRef="sid-dbdad760-92b3-4561-a1e7-9401197b7aa7" targetRef="sid-018de371-80da-4706-a948-ac10f838f9d0"/><!-- 定时器中间事件1 --><intermediateCatchEvent id="sid-018de371-80da-4706-a948-ac10f838f9d0" name="定时器中间事件1"><timerEventDefinition><!-- 定时20秒后执行 --><timeDuration>PT20S</timeDuration></timerEventDefinition></intermediateCatchEvent><sequenceFlow id="sid-6ce61e04-1b4b-43b4-8b42-b392bcf44b17" sourceRef="sid-018de371-80da-4706-a948-ac10f838f9d0" targetRef="sid-8c894b30-98d9-455d-9766-2a8e22f4e7ab"/><!-- 用户任务 美团外卖骑手 --><userTask id="sid-8c894b30-98d9-455d-9766-2a8e22f4e7ab" name="美团外卖骑手"><extensionElements><activiti:taskListener event="create" delegateExpression="${myUserTaskListener}"/></extensionElements></userTask><!-- 定时器边界事件1,cancelActivity属性是触发边界事件后,原流程是否中断,为true是中断,默认为true --><boundaryEvent id="sid-0f29bc51-9400-4b01-a13c-e9c37b2bec0a" attachedToRef="sid-8c894b30-98d9-455d-9766-2a8e22f4e7ab" cancelActivity="false" name="定时器边界事件1"><timerEventDefinition><!-- 定时30秒后执行 --><timeDuration>PT30S</timeDuration></timerEventDefinition></boundaryEvent><!-- 结束事件1 --><endEvent id="sid-7dc6287d-719f-44ae-9f29-158c7320f5f3" name="结束事件1"/><!-- 结束事件2 --><endEvent id="sid-e86db864-c95e-4ccb-a670-03fc0689b874" name="结束事件2"/><sequenceFlow id="sid-24f01276-0ed8-4792-abc4-3abc39156b30" sourceRef="sid-8c894b30-98d9-455d-9766-2a8e22f4e7ab" targetRef="sid-fbb3c837-1dca-4bff-85a6-5301f954b6bb"/><!-- 服务任务 通知 --><serviceTask id="sid-f38227c9-d0a8-44f1-8ef0-66c1aa5b2ec0" activiti:exclusive="true" name="通知服务" activiti:delegateExpression="${myServiceTaskListener}"/><sequenceFlow id="sid-99ea1e4d-c0b5-4133-b997-5c77a6486129" sourceRef="sid-0f29bc51-9400-4b01-a13c-e9c37b2bec0a" targetRef="sid-f38227c9-d0a8-44f1-8ef0-66c1aa5b2ec0"/><sequenceFlow id="sid-79f59c59-d979-4928-99e1-5b628fe7652c" sourceRef="sid-f38227c9-d0a8-44f1-8ef0-66c1aa5b2ec0" targetRef="sid-7dc6287d-719f-44ae-9f29-158c7320f5f3"/><!-- 定时器中间事件2 --><!-- 用户任务 饿了么外卖骑手 --><userTask id="sid-fbb3c837-1dca-4bff-85a6-5301f954b6bb" name="饿了么外卖骑手"><extensionElements><activiti:taskListener event="create" delegateExpression="${myUserTaskListener}"/></extensionElements></userTask><sequenceFlow id="sid-9f81e343-9cba-4e5a-b0fe-9c02f655f910" sourceRef="sid-fbb3c837-1dca-4bff-85a6-5301f954b6bb" targetRef="sid-e86db864-c95e-4ccb-a670-03fc0689b874"/><!-- 定时器边界事件2 中断 --><boundaryEvent id="sid-72c1a016-1aca-4993-af35-a55d8440da00" attachedToRef="sid-fbb3c837-1dca-4bff-85a6-5301f954b6bb" cancelActivity="true" name="定时器边界事件2"><timerEventDefinition><!-- 定时一分钟后执行 --><timeDuration>PT1M</timeDuration></timerEventDefinition></boundaryEvent><!-- 用户任务 美团优选骑手 --><userTask id="sid-20cc70be-f536-42a0-99de-9102a3cadfcb" name="美团优选骑手"><extensionElements><activiti:taskListener event="create" delegateExpression="${myUserTaskListener}"/></extensionElements></userTask><sequenceFlow id="sid-4129ae15-d826-49af-8f31-777315488965" sourceRef="sid-72c1a016-1aca-4993-af35-a55d8440da00" targetRef="sid-20cc70be-f536-42a0-99de-9102a3cadfcb"/><sequenceFlow id="sid-e95dd49a-916b-43fd-8e05-cca9c7111175" sourceRef="sid-20cc70be-f536-42a0-99de-9102a3cadfcb" targetRef="sid-e86db864-c95e-4ccb-a670-03fc0689b874"/></process><bpmndi:BPMNDiagram id="BPMNDiagram_timer"><bpmndi:BPMNPlane bpmnElement="timer" id="BPMNPlane_timer"><bpmndi:BPMNShape id="shape-658aeea0-f6ff-4bc2-b5da-55c5f702fe50" bpmnElement="sid-8c894b30-98d9-455d-9766-2a8e22f4e7ab"><omgdc:Bounds x="-174.94717" y="-48.5" width="100.0" height="80.0"/></bpmndi:BPMNShape><bpmndi:BPMNShape id="shape-8566e87c-20a9-4ffb-ac20-ae4451a51fb2" bpmnElement="sid-e86db864-c95e-4ccb-a670-03fc0689b874"><omgdc:Bounds x="303.36176" y="-23.500008" width="30.0" height="30.0"/></bpmndi:BPMNShape><bpmndi:BPMNEdge id="edge-0c609232-fc10-45aa-9616-fdc80154f29a" bpmnElement="sid-24f01276-0ed8-4792-abc4-3abc39156b30"><omgdi:waypoint x="-74.947174" y="-8.5"/><omgdi:waypoint x="77.419815" y="-8.500008"/></bpmndi:BPMNEdge><bpmndi:BPMNShape id="shape-ee857fe8-5832-4ebc-8ed1-a2a7a5e91e71" bpmnElement="sid-0f29bc51-9400-4b01-a13c-e9c37b2bec0a"><omgdc:Bounds x="-139.7814" y="0.06927776" width="30.0" height="30.0"/></bpmndi:BPMNShape><bpmndi:BPMNShape id="shape-308c774f-cd05-44f6-aaeb-0f1a7688363f" bpmnElement="sid-eac7f836-a8c2-4120-bfc7-4b06c0705e8b"><omgdc:Bounds x="-434.54727" y="-23.5" width="30.0" height="30.0"/></bpmndi:BPMNShape><bpmndi:BPMNEdge id="edge-1e2b1a10-eb7b-4565-9d4f-cce4a448edc6" bpmnElement="sid-aa41edf6-f2e4-414b-8758-3d49d5d09dd5"><omgdi:waypoint x="-404.54727" y="-8.5"/><omgdi:waypoint x="-374.95337" y="-8.500008"/></bpmndi:BPMNEdge><bpmndi:BPMNShape id="shape-4f4f0129-1c50-4fa1-a1dd-106b0b6631f7" bpmnElement="sid-dbdad760-92b3-4561-a1e7-9401197b7aa7"><omgdc:Bounds x="-374.95337" y="-48.5" width="100.0" height="80.0"/></bpmndi:BPMNShape><bpmndi:BPMNEdge id="edge-44c41995-1aba-4891-bd2e-3db8dc6c07fb" bpmnElement="sid-56d3c5eb-4e3f-4904-bf20-250241539247"><omgdi:waypoint x="-274.95337" y="-8.5"/><omgdi:waypoint x="-241.08704" y="-8.5"/></bpmndi:BPMNEdge><bpmndi:BPMNShape id="shape-a6a5c18e-6800-410b-93eb-b71425264291" bpmnElement="sid-018de371-80da-4706-a948-ac10f838f9d0"><omgdc:Bounds x="-241.08705" y="-23.5" width="30.0" height="30.0"/></bpmndi:BPMNShape><bpmndi:BPMNEdge id="edge-bcd06a8a-aa48-441a-9a81-e18426f5616e" bpmnElement="sid-6ce61e04-1b4b-43b4-8b42-b392bcf44b17"><omgdi:waypoint x="-211.08705" y="-8.5"/><omgdi:waypoint x="-174.94717" y="-8.5"/></bpmndi:BPMNEdge><bpmndi:BPMNShape id="shape-5132461d-88d6-4d15-a46f-ae8950679c6a" bpmnElement="sid-7dc6287d-719f-44ae-9f29-158c7320f5f3"><omgdc:Bounds x="29.145199" y="103.683395" width="30.0" height="30.0"/></bpmndi:BPMNShape><bpmndi:BPMNShape id="shape-181bee77-cdac-4c01-bb9c-7cbc3f6ae95a" bpmnElement="sid-f38227c9-d0a8-44f1-8ef0-66c1aa5b2ec0"><omgdc:Bounds x="-99.58714" y="78.6834" width="100.0" height="80.0"/></bpmndi:BPMNShape><bpmndi:BPMNEdge id="edge-c79f62c9-ee85-45e0-a2f6-a4fe6197b4f8" bpmnElement="sid-79f59c59-d979-4928-99e1-5b628fe7652c"><omgdi:waypoint x="0.41285706" y="118.6834"/><omgdi:waypoint x="29.145199" y="118.683395"/></bpmndi:BPMNEdge><bpmndi:BPMNEdge id="edge-311f6c99-60f3-4bd4-a086-be28045fdf12" bpmnElement="sid-99ea1e4d-c0b5-4133-b997-5c77a6486129"><omgdi:waypoint x="-124.7814" y="30.069279"/><omgdi:waypoint x="-124.94719" y="118.683395"/><omgdi:waypoint x="-99.58715" y="118.6834"/></bpmndi:BPMNEdge><bpmndi:BPMNShape id="shape-11c81c88-f78c-4962-abef-f8f55bb68dc5" bpmnElement="sid-fbb3c837-1dca-4bff-85a6-5301f954b6bb"><omgdc:Bounds x="77.41982" y="-48.500008" width="100.0" height="80.0"/></bpmndi:BPMNShape><bpmndi:BPMNEdge id="edge-a7ba3c08-497c-4383-a171-c57c07e777a5" bpmnElement="sid-9f81e343-9cba-4e5a-b0fe-9c02f655f910"><omgdi:waypoint x="177.41983" y="-8.500008"/><omgdi:waypoint x="303.36176" y="-8.500008"/></bpmndi:BPMNEdge><bpmndi:BPMNShape id="shape-0aa2e7ef-ca53-41d1-9cc8-d3d710620a0a" bpmnElement="sid-72c1a016-1aca-4993-af35-a55d8440da00"><omgdc:Bounds x="121.671555" y="-1.2286987" width="30.0" height="30.0"/></bpmndi:BPMNShape><bpmndi:BPMNShape id="shape-894c438f-317d-463a-8350-2d63c0f33d27" bpmnElement="sid-20cc70be-f536-42a0-99de-9102a3cadfcb"><omgdc:Bounds x="170.75076" y="78.683395" width="100.0" height="80.0"/></bpmndi:BPMNShape><bpmndi:BPMNEdge id="edge-bdc901eb-a8eb-4b4a-85a9-6032f63dee37" bpmnElement="sid-4129ae15-d826-49af-8f31-777315488965"><omgdi:waypoint x="136.67155" y="28.771301"/><omgdi:waypoint x="136.67155" y="118.68339"/><omgdi:waypoint x="170.75075" y="118.68339"/></bpmndi:BPMNEdge><bpmndi:BPMNEdge id="edge-ad52e61b-1a75-4470-a786-e063cf41a7a3" bpmnElement="sid-e95dd49a-916b-43fd-8e05-cca9c7111175"><omgdi:waypoint x="270.7508" y="118.6834"/><omgdi:waypoint x="319.42508" y="118.6834"/><omgdi:waypoint x="318.36176" y="6.4999924"/></bpmndi:BPMNEdge></bpmndi:BPMNPlane></bpmndi:BPMNDiagram>
</definitions>

自定义服务任务监听器

@Component
public class MyServiceTaskListener implements JavaDelegate, Serializable {private static final long serialVersionUID = 1L;@Overridepublic void execute(DelegateExecution execution) {System.out.println("《================服务任务监听器================》");System.out.println("当前时间:" + DateUtil.format(new Date(), DatePattern.NORM_DATETIME_PATTERN));System.out.println("delegateTask.getProcessInstanceId() = " + execution.getProcessInstanceId());System.out.println("delegateTask.getProcessInstanceBusinessKey() = " + execution.getProcessInstanceBusinessKey());System.out.println("delegateTask.getEventName() = " + execution.getEventName());System.out.println("execution.getCurrentFlowElement().getName() = " + execution.getCurrentFlowElement().getName());}
}

自定义用户任务监听器

@Component
public class MyUserTaskListener implements TaskListener {@Overridepublic void notify(DelegateTask delegateTask) {System.out.println("《================用户任务监听器================》");System.out.println("当前时间:" + DateUtil.format(new Date(), DatePattern.NORM_DATETIME_PATTERN));System.out.println("delegateTask.getProcessInstanceId() = " + delegateTask.getProcessInstanceId());System.out.println("delegateTask.getTaskDefinitionKey() = " + delegateTask.getTaskDefinitionKey());System.out.println("delegateTask.getEventName() = " + delegateTask.getEventName());System.out.println("delegateTask.getName() = " + delegateTask.getName());}
}

测试流程

@Test
public void deployProcess() {Deployment deploy = repositoryService.createDeployment().addClasspathResource("processes/timer.bpmn20.xml").deploy();System.out.println("deploy = " + deploy);
}@Test
public void completeTask() {// 查询任务Task task = taskService.createTaskQuery().processInstanceId("620d7748-3e41-11ee-9ba8-18c04dcd4aee").singleResult();System.out.println("task = " + task);// 完成任务taskService.complete(task.getId());
}

流程执行步骤

// 1.部署流程触发定时开始事件(固定日期时间):2023-08-19 11:35:00.000、timer-start-event
// 2.服务任务触发:当前时间:2023-08-19 11:35:03
// 3.触发定时中间事件20秒:2023-08-19 11:35:23.392、trigger-timer
// 4.20后美团外卖骑手任务触发:当前时间:2023-08-19 11:35:23
// 5.触发定时边界事件30秒(非中断):2023-08-19 11:35:53.406,trigger-timer
// 6.30秒后通知服务触发:当前时间:2023-08-19 11:35:53
// 7.完成美团外卖骑手任务,当前任务变更为饿了么外卖骑手:当前时间:2023-08-19 11:36:14
// 8.触发定时边界事件1分钟(中断):2023-08-19 11:37:14.586、trigger-timer
// 9.1分钟后任务变更为美团优选:当前时间:2023-08-19 11:37:23
// 10.完成美团优选任务结束流程

相关文章:

SpringBoot整合Activiti7——定时器事件(九)

文章目录 定时器事件时间定义时间固定时间段时间周期 1.开始事件2.中间事件3.边界事件代码实现xml文件自定义服务任务监听器自定义用户任务监听器测试流程流程执行步骤 定时器事件 可以用在开始事件、中间事件、边界事件上&#xff0c;边界事件可以是中断和非中断边界事件 需要…...

轻量封装WebGPU渲染系统示例<29>- 深度模糊DepthBlur(源码)

实现方式: step1. 通过mrt机制&#xff0c;输出颜色和深度相关数据的两张rtt纹理。 step2. 基于上述颜色纹理&#xff0c;生成一张模糊之后的新rtt纹理。 setp3. 基于深度(也就是距离摄像机的远近)数据&#xff0c;合成颜色和模糊纹理数据&#xff0c;并最终输出。 当前示例…...

LeetCode226. Invert Binary Tree

文章目录 一、题目二、题解2.1 前序遍历版本2.2 中序遍历版本2.3 后序遍历版本 一、题目 Given the root of a binary tree, invert the tree, and return its root. Example 1: Input: root [4,2,7,1,3,6,9] Output: [4,7,2,9,6,3,1] Example 2: Input: root [2,1,3] Ou…...

Java设计模式-创建型模式-建造者模式

建造者模式 建造者模式案例与工厂模式的区别&#xff1a;Builder 注解 建造者模式 建造者模式是将一个复杂对象的构件与表示分离&#xff0c;使得同样的构件过程可以创建不同的表示。 建造者模式将内部构件的创建和组装分割开&#xff0c;一般使用链式编程&#xff0c;代码整洁…...

PyQt中QFrame窗口中的组件不显示的原因

文章目录 问题代码&#xff08;例&#xff09;原因和解决方法 问题代码&#xff08;例&#xff09; from PyQt5.QtWidgets import * from PyQt5.QtGui import QFont, QIcon, QCursor, QPixmap import sysclass FrameToplevel(QFrame):def __init__(self, parentNone):super().…...

git 命令行回退版本

git 命令行回退版本 git 命令行回退版本命令: 1.切换到需要回退的分支 git checkout branch-v2.0.02.更新远程分支 git fetch3.找到需要回退版本的版本号git revert a6914da55ff40a09e67ac2426b86f1212e6580eb4.清除工作区缓存git clean -df5.强制提交git push -f...

IntelliJ IDEA 安装 GitHub Copilot插件 (最新)

注意&#xff1a; GitHub Copilot 插件对IDEA最低版本要求是2021.2&#xff0c;建议直接用2023.3&#xff0c;一次到位反正后续要升级的。 各个版本的依赖关系&#xff0c;请参照&#xff1a; ##在线安装&#xff1a; 打开 IntelliJ IDEA扩展商店&#xff0c;输入 "Git…...

viewpage选择器

GitHub - hackware1993/MagicIndicator: A powerful, customizable and extensible ViewPager indicator framework. As the best alternative of ViewPagerIndicator, TabLayout and PagerSlidingTabStrip —— 强大、可定制、易扩展的 ViewPager 指示器框架。是ViewPagerIndi…...

vue中如何将json数组指定的key赋值给el-form-item并均匀的分成2列

在Vue中&#xff0c;你可以使用v-for指令来遍历JSON数组&#xff0c;并将指定的key赋值给el-form-item。下面是一个示例&#xff1a; <template><el-form><el-row><el-col :span"6" v-for"item in jsonArray" :key"item.key&qu…...

笔记本分屏怎么操作?3个方法提高工作效率!

“有朋友知道笔记本怎么才能实现分屏吗&#xff1f;我在工作时&#xff0c;经常需要来回切换屏幕&#xff0c;效率真的太低了&#xff0c;有什么方法可以实现两个屏幕同时使用吗&#xff1f;” 在现代生活中&#xff0c;多任务处理已成为常态&#xff0c;而笔记本分屏技术为用户…...

Android 使用poi生成Excel ,word并保存在指定路径内

一添加依赖&#xff08;一定要用新版依赖防止一些bug&#xff09; minSdk 26 //注意最小支持SDK26 dependencies {implementation org.apache.poi:poi:5.2.4implementation org.apache.poi:poi-ooxml:5.2.4implementation javax.xml.stream:stax-api:1.0-2 }二&#xff0c;创…...

嵌入式杂记 -- MCU的大小端模式

MCU的大小端模式 大端模式小端模式大小端模式测试联合体概念MCU大小端模式测试大端模式测试小端模式测试 大小端模式转换 在进行MCU开发的时候&#xff0c;我们需要注意MCU的数据存储模式&#xff0c;在嵌入式中有两种不同的存储模式&#xff0c;分别是 大端模式和小端模式。 …...

对这套BI零售数据分析方案心动,是零售人天性

零售数据分析做了这么多年&#xff0c;难道真的没累积点经验&#xff0c;摸索出一条又快又能满足绝大多数需求的数据分析捷径&#xff1f;别人不知道&#xff0c;奥威BI还真就有这么一套标准化的BI零售数据分析方案&#xff0c;不管是服装零售、医药连锁、商超都能利用这套方案…...

vuekeyclock 集成

前端集成keycloak鉴权的主要写法&#xff0c; 在main.js里面写 import VueKeycloakJs from dsb-norge/vue-keycloak-js import { KeycloakInstance } from "keycloak-js";// 回调地址 const pageIndex process.env.NODE_ENV production ? http://xxxx/#/ : http:…...

ARM Linux 基础学习 / 配置交叉编译工具链 / 编译 Linux 应用和驱动 / 编译内核

编辑整理 by Staok。 本文部分内容摘自 “100ask imx6ull” 开发板的配套资料&#xff08;如 百问网的《嵌入式Linux应用开发完全手册》&#xff0c;在 百问网 imx6ull pro 开发板 页面 中的《2.1 100ASK_IMX6ULL_PRO&#xff1a;开发板资料》或《2.2 全系列Linux教程&#xf…...

通讯协议学习之路(实践部分):SPI开发实践

通讯协议之路主要分为两部分&#xff0c;第一部分从理论上面讲解各类协议的通讯原理以及通讯格式&#xff0c;第二部分从具体运用上讲解各类通讯协议的具体应用方法。 后续文章会同时发表在个人博客(jason1016.club)、CSDN&#xff1b;视频会发布在bilibili(UID:399951374) 本文…...

【系统安装】ubuntu20.04启动盘制作,正经教程,小白安装教程,百分百成功安装

1.所需材料&#xff1a; 64GBU盘&#xff08;其实8g和16g也可以&#xff09; 2.制作U盘启动盘 使用windows制作ubuntu 20.04启动盘 1&#xff09;下载制作工具&#xff1a;Rufus&#xff1a;Rufus - 轻松创建 USB 启动盘 2&#xff09;插入用来做启动盘的U盘 3&#xff0…...

2023云计算发展趋势

目录 一、云计算是什么&#xff1f; 二、云计算发展趋势 三、总结 一、云计算是什么&#xff1f; 云计算是一种基于互联网的计算方式&#xff0c;通过网络连接的方式提供计算能力、存储服务、应用程序和数据资源。它通常通过虚拟化技术实现多个计算机资源的池化&#xff0c;…...

C# .NET Core API Controller以及辅助专案

准备工作 Windows 10Visual Studio 2019(2017就有可以集中发布到publish目录的功能了吧)C#将方法封装(据说可以提高效率,就像是我们用的dll那种感觉新增专案作为我们API的辅助专案(作用类似dll&#xff0c;此处&#xff0c;你也可以在你自己的API专案里建文件夹&#xff0c;但…...

asp.net图书管理系统

asp.net图书管理系统 基本操作图书管理 读者管理 借书 修改资料 修改密码 说明文档 运行前附加数据库.mdf&#xff08;或sql生成数据库&#xff09; 主要技术&#xff1a; 基于C#winform架构和sql server数据库 功能模块&#xff1a; 图书管理 读者管理 借书 修改资料 修改…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...

C# 表达式和运算符(求值顺序)

求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如&#xff0c;已知表达式3*52&#xff0c;依照子表达式的求值顺序&#xff0c;有两种可能的结果&#xff0c;如图9-3所示。 如果乘法先执行&#xff0c;结果是17。如果5…...

安卓基础(Java 和 Gradle 版本)

1. 设置项目的 JDK 版本 方法1&#xff1a;通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分&#xff0c;设置 Gradle JDK 方法2&#xff1a;通过 Settings File → Settings... (或 CtrlAltS)…...