首页 文章 精选 留言 我的

精选列表

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

工作流引擎Activiti集成JPA持久化保存流程数据

Activiti中JPA简介 可以使用JPA实体作为流程变量, 并进行操作: 基于流程变量更新已有的JPA实体,可以在用户任务的表单中填写或者由服务任务生成 重用已有的领域模型,不需要编写显示的服务获取实体或者更新实体的值 根据已有实体的属性做出判断(网关即分支聚合) JPA实体要求 Activiti中JPA只支持符合以下要求的实体: 实体应该使用JPA注解进行配置, 支持字段和属性访问两种方式.@MappedSuperclass也要能够被使用 实体中应该有一个使用@Id注解的主键,不支持复合主键@EmbeddedId 和 @IdClass: Id字段或者属性能够使用JPA规范支持的任意类型: 原生态数据类型和他们的包装类型(Boolean除外) String BigInteger BigDecimal java.util.Date java.sql.Date JPA配置 引擎必须有一个对EntityManagerFactory的引用才能够使用JPA的实体,这样可以通过配置引用或者提供一个持久化单元名称 作为变量的JPA实体将会被自动检测并进行相应的处理 使用jpaPersistenceUnitName配置: <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration"> <!-- 数据库的配置 --> <property name="databaseSchemaUpdate" value="true" /> <property name="jdbcUrl" value="jdbc:h2:mem:JpaVariableTest;DB_CLOSE_DELAY=1000" /> <property name="jpaPersistenceUnitName" value="activiti-jpa-pu" /> <property name="jpaHandleTransaction" value="true" /> <property name="jpaCloseEntityManager" value="true" /> <!-- job executor configurations --> <property name="jobExecutorActivate" value="false" /> <!-- mail server configurations --> <property name="mailServerPort" value="5025" /> </bean> 配置一个自定义的EntityManagerFactory, 这里使用了OpenJPA实体管理器 该代码片段仅仅包含与例子相关的beans,去掉了其他beans. OpenJPA实体管理的完整并可以使用的例子可以在activiti-spring-examples(/activiti-spring/src/test/java/org/activiti/spring/test/jpa/JPASpringTest.java) 中找到 <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="persistenceUnitManager" ref="pum"/> <property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.OpenJpaVendorAdapter"> <property name="databasePlatform" value="org.apache.openjpa.jdbc.sql.H2Dictionary" /> </bean> </property> </bean> <bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration"> <property name="dataSource" ref="dataSource" /> <property name="transactionManager" ref="transactionManager" /> <property name="databaseSchemaUpdate" value="true" /> <property name="jpaEntityManagerFactory" ref="entityManagerFactory" /> <property name="jpaHandleTransaction" value="true" /> <property name="jpaCloseEntityManager" value="true" /> <property name="jobExecutorActivate" value="false" /> </bean> 也可以在编程式创建一个引擎时完成配置: ProcessEngine processEngine = ProcessEngineConfiguration .createProcessEngineConfigurationFromResourceDefault() .setJpaPersistenceUnitName("activiti-pu") .buildProcessEngine(); 配置的属性有: jpaPersistenceUnitName: 使用持久化单元的名称: 要确保该持久化单元在类路径下是可用的,默认的路径是 /META-INF/persistence.xml 要么使用jpaEntityManagerFactory要么或者是jpaPersistenceUnitName jpaEntityManagerFactory: 一个实现了javax.persistence.EntityManagerFactory的bean的引用: 将被用来加载实体并且刷新更新 要么使用jpaEntityManagerFactory要么或者是jpaPersistenceUnitName jpaHandleTransaction: 在被使用的EntityManager实例上,该标记表示流程引擎是否需要开始和提交或者回滚事务: 当使用Java事务API(JTA) 时,设置为false jpaCloseEntityManager: 该标记表示流程引擎是否应该关闭从 EntityManagerFactory获取的EntityManager的实例: 当EntityManager是由容器管理的时候需要设置为false: 当使用并不是单一事务作用域的扩展持久化上下文的时候 JPA用法 简单示例 首先,需要创建一个基于META-INF/persistence.xml的EntityManagerFactory作为持久化单元:包含持久化单元中所有的类和一些供应商特定的配置 使用一个简单的实体作为测试,其中包含有一个id和String类型的value属性,也将会被持久化 在测试之前,创建一个实体并且保存: @Entity(name = "JPA_ENTITY_FIELD") public class FieldAccessJPAEntity { @Id @Column(name = "ID_") private Long id; private String value; public FieldAccessJPAEntity() { // Empty constructor needed for JPA } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } } 启动一个新的流程实例,添加一个实体作为变量. 其他的变量,将会被存储在流程引擎的持久化数据库中.下一次获取该变量的时候,将会根据该类和存储Id从EntityManager中加载: Map<String, Object> variables = new HashMap<String, Object>(); variables.put("entityToUpdate", entityToUpdate); ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("UpdateJPAValuesProcess", variables); 流程定义中的第一个节点是一个服务任务,将会调用entityToUpdate上的setValue方法,其实就是之前在启动流程实例时候设置的JPA变量并且将会从当前流程引擎的上下文关联的EntityManager中加载: <serviceTask id='theTask' name='updateJPAEntityTask' activiti:expression="${entityToUpdate.setValue('updatedValue')}" /> 当完成服务任务时,流程实例将会停留在流程定义中定义的用户任务环节上: 可以查看该流程实例 EntityManager已经被刷新了并且改变的实体已经被保存进数据库中 获取entityToUpdate的变量value时,该实体将会被再次加载并且获取该实体属性的值将会是updatedValue // Servicetask in process 'UpdateJPAValuesProcess' should have set value on entityToUpdate. Object updatedEntity = runtimeService.getVariable(processInstance.getId(), "entityToUpdate"); assertTrue(updatedEntity instanceof FieldAccessJPAEntity); assertEquals("updatedValue", ((FieldAccessJPAEntity)updatedEntity).getValue()) 查询JPA流程变量 以查询某一JPA实体作为变量的ProcessInstances和Executions 在ProcessInstanceQuery和ExecutionQuery查询中仅仅variableValueEquals(name, entity) 支持JPA实体变量: [variableValueNotEquals],[variableValueGreaterThan],[variableValueGreaterThanOrEqual],[variableValueLessThan],[variableValueLessThanOrEqual]不被支持并且传递JPA实体值的时候会抛出一个ActivitiException ProcessInstance result = runtimeService.createProcessInstanceQuery().variableValueEquals("entityToQuery", entityToQuery).singleResult(); 使用Spring beans和JPA结合的高级例子 JPASpringTest, 在activiti-spring-examples中: 已经存在了一个使用JPA实体的Spring-bean, 用来存储贷款申请 使用Activiti,可以通过已经存在的bean获取已经使用的实体,并使用它作为变量用于流程中 流程定义步骤: 服务任务: 创建一个新的贷款申请,使用已经存在的LoanRequestBean接受启动流程时候的变量(来自流程启动时候的表单) 使用activiti:resultVariable(作为一个变量对表达式返回的结果进行存储)将创建出来的实体作为变量进行存储 用户任务: 允许经理查看贷款申请,并填入审批意见(同意/不同意) 审批意见将作为一个boolean变量approvedByManager进行存储 服务任务: 更新贷款申请实体,因此该实体与流程保持同步 根据贷款申请实体变量approved的值,将利用唯一网关自动决定下一步该选择那一条路径: 当申请批准,流程结束 否则,一个额外的任务将会使用(发送拒绝信),这样就可以发送拒绝信手动通知客户 <?xml version="1.0" encoding="UTF-8"?> <definitions id="taskAssigneeExample" xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:activiti="http://activiti.org/bpmn" targetNamespace="org.activiti.examples"> <process id="LoanRequestProcess" name="Process creating and handling loan request"> <startEvent id='theStart' /> <sequenceFlow id='flow1' sourceRef='theStart' targetRef='createLoanRequest' /> <serviceTask id='createLoanRequest' name='Create loan request' activiti:expression="${loanRequestBean.newLoanRequest(customerName, amount)}" activiti:resultVariable="loanRequest"/> <sequenceFlow id='flow2' sourceRef='createLoanRequest' targetRef='approveTask' /> <userTask id="approveTask" name="Approve request" /> <sequenceFlow id='flow3' sourceRef='approveTask' targetRef='approveOrDissaprove' /> <serviceTask id='approveOrDissaprove' name='Store decision' activiti:expression="${loanRequest.setApproved(approvedByManager)}" /> <sequenceFlow id='flow4' sourceRef='approveOrDissaprove' targetRef='exclusiveGw' /> <exclusiveGateway id="exclusiveGw" name="Exclusive Gateway approval" /> <sequenceFlow id="endFlow1" sourceRef="exclusiveGw" targetRef="theEnd"> <conditionExpression xsi:type="tFormalExpression">${loanRequest.approved}</conditionExpression> </sequenceFlow> <sequenceFlow id="endFlow2" sourceRef="exclusiveGw" targetRef="sendRejectionLetter"> <conditionExpression xsi:type="tFormalExpression">${!loanRequest.approved}</conditionExpression> </sequenceFlow> <userTask id="sendRejectionLetter" name="Send rejection letter" /> <sequenceFlow id='flow5' sourceRef='sendRejectionLetter' targetRef='theOtherEnd' /> <endEvent id='theEnd' /> <endEvent id='theOtherEnd' /> </process> </definitions> 上面的例子展示了JPA结合Spring和参数化方法表达式的强大优势 :所有的流程就不需要自定义java代码(Spring bean除外),大幅度的加快了流程部署

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

CLion 2021.1 Beta 发布,C/C++ 跨平台集成开发环境

CLion 2021.1 Beta 已正式发布,新版本修复了项目模型和更多的 MISRA 检查。 主要更新内容 对于 Makefile 项目 更新 Makefile 项目所使用的工具链会触发项目的重新加载 提取大量项目的 make target 现在可以正常工作了 对于使用 MinGW 工具链的 Makefile 项目,CLion 现在可以在加载项目时正确处理带 "\" 和 "/" 的目录 对于汇编数据库项目 Clang-cl 现在支持此类项目 新的 MISRA C 和 C++ 检查 异常对象不应具有指针类型 一些新的检查现在禁止使用特定的库函数,例如 stdlib.h 的 bsearch 和 qsort,ctime 库的时间处理函数,或者 cstdlib 库的 atof、atoi 和 atol 详情请查看更新公告。

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

JeeSite v4.1.8 更新,OAuth2,微信集成,Flowable

v4.1.8 2020-3-3 新增 新增 OAuth2 第三方登录模块(快速登录:码云、QQ、微信、等等) 新增 账号注册 界面的功能示例(看演示:http://demo.jeesite.com) 新增微信模块,实现微信消息推送、微信公众号与JeeSite绑定登录、小程序与企业微信接口引入 部门树接口 isLoadUser 新增 lazy 懒加载,异步加载,点击再加载 新增全空格的前端验证,验证名称:isBlank BPM 新增 BpmTreeEntity 树表支持 BPM 表单节点选择支持选择连线,用于连线事件设定 Beetl 添加 hasRole 角色权限函数 Excel 工具支持 BigDecimal 类型 新增 inputmask 插件金额使用例子 新增 editGrid 列表选择组件的例子 Cloud 新增 代码生成模板 优化 消息列表的消息内容查询改为模糊查询 DataGrid 优化,点击列表查询后,定向到第一页 实体类分离出接口 BaseEntityApi、DataEntityApi、TreeEntityApi 修改据库表字段 password 长度为 200,第三方系统迁移密码可能会比较长 当有 isQuick 的时候,树表的刷新按钮点击会刷新 2 次优化 仅使用国内 Maven 服务器,避免网络不好的用户下载慢 用户导入增加所属机构是否为空验证 升级 tomcat 8.5.51 修正 初始化脚本提醒优化,未设置参数的时候,否则会提示 找不到bean 修正当页面中有文本域的时候,并调整大小的时候,上传控件的上传按钮需要刷新 修正文件组件删除文件的时候没有重设文件大小问题 4.1.6+ 修正不分页的时候,点击列表排序会造成强制分页问题 BPM 优化 bizEntity 修改为 bpmEntity 遗漏补查 升级方法 执行backup.bat(sh)脚本打包,强制更新 Maven 仓库即可 更多更新日志查看: https://jeesite.gitee.io/docs/upgrade/

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

thinkphp6.0 集成Alipay 手机和电脑端支付的方法

第一步 下载 Alipay 的PHP SDK :https://docs.open.alipay.com/54/103419/ 第二步 解压下载都到的压缩包: 解压后得到的文件内容如图 第三步、上传得到的目录中的 aop 文件夹到 thinkphp 6.0 的 extend 目录,如下图: 第四步、修改 AopClient.php 文件,加入命名空间 aop 具体修改如下图 在第二行位置,也就是最开始的位置,加入代码: namespace aop; 第五步、修改 PC 支付文件 AlipayTradePagePayRequest.php 同样是加入命名空间 namespace aoprequest ,具体如下: 在第二行位置,也就是最开始的位置,加入代码: namespace aop\request; 第六步、使用PC支付接口,生成支付链接 PS:接口方法这不是统一定义、而是在购买控制器中直接定义的,如要统一可以创建公共控制器或其他方法统一。 1.在 确认订单的控制器 ,我这里是 Buy 中引入支付方法。 use aop\AopClient; use aop\request\AlipayTradePagePayRequest; 2.创建私有方法 $alipay_config ,替换下面红色的内容部分,为你的信息,具体信息在你的支付宝开发者平台获取,地址:https://openhome.alipay.com/platform/appManage.htm#/apps private $alipay_config = array( 'app_id' => '你的app_id', 'notify_url'=>"https://xxx.com/xxx/ 这是你的异步通知地址", 'merchant_private_key' => '你的私钥', 'gatewayUrl' => "https://openapi.alipay.com/gateway.do", 'public_key' => "你的公钥", ); 3.配置、引入 aop $aop = new AopClient(); $aop->gatewayUrl = "https://openapi.alipay.com/gateway.do"; $aop->appId = $this->alipay_config['appid']; $aop->method = 'alipayTradePagePay'; $aop->charset = 'utf-8'; $aop->signType = 'RSA2'; $aop->alipayrsaPublicKey = $this->alipay_config['public_key']; $aop->rsaPrivateKey = $this->alipay_config['private_key']; 4.生成 biz_content 内容,具体内容可根据自己需求增删,具体文档参考:https://docs.open.alipay.com/api_1/alipay.trade.page.pay/ 参数解释: out_trade_no :订单号,阿里要求是唯一的。 product_code :销售产品码,与支付宝签约的产品码名称。注:目前仅支持 FAST_INSTANT_TRADE_PAY total_amount :支付金额 subject :订单名称 timeout_express : 支付过期时间,订单创建后多久过期,这里 设置 30m 意思是,订单创建后 30 分钟后过期,过期了这个就不能支付了,这里只是alipay这里不能支付,不要搞晕了。 $biz_content = json_encode([ 'out_trade_no'=> rand(11111111,99999999), 'product_code'=> 'FAST_INSTANT_TRADE_PAY', 'total_amount'=> 99.9, 'subject'=> 'BI8EJM Alipay 测试', 'timeout_express'=>'30m', ]); 5. 引入 PC 支付 并显示 支付链接 $payRequest= new AlipayTradePagePayRequest(); $payRequest->setReturnUrl(url('index/index')); $payRequest->setNotifyUrl($this->alipay_config['notify_url']); $payRequest->setBizContent($biz_content); $response = $aop->sdkExecute($payRequest);<br> echo '<a href="'.'https://openapi.alipay.com/gateway.do?'.$response.'"> 至此,支付链接生成就完毕了。 第七步、测试打开支付链接 点击:立即支付 成功跳转到支付页面 第八步、异曲同工。 这里仅仅展示了 PC 的支付,说好的手机支付呢?手机支付一样,你只需要在手机支付接口文件中,指定命名空间,然后引入手机支付方法即可,希望你能顺利完成,本文首发在我的cnblogs,献丑了。

资源下载

更多资源
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应用均可从中受益。

Sublime Text

Sublime Text

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

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册