Activiti之act_ge_property表引發的坑(dbSchemaUpdate)
參考文檔:
https://blog.csdn.net/lb19921223/article/details/79213851
上篇文章寫道,我學習acitiviti的時候,使用mysql的truncate把表中的數據都刪除了,然后重新部署流程,結果居然報錯了。
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 流程引擎配置的bean --> <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration"> <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/db_activiti?serverTimezone=Asia/Shanghai" /> <property name="jdbcDriver" value="com.mysql.cj.jdbc.Driver" /> <property name="jdbcUsername" value="root" /> <property name="jdbcPassword" value="123456" /> <property name="databaseSchemaUpdate" value="true" /> </bean> </beans>
package com.yuanqiao.first_activiti.deployment; import java.util.List; import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.activiti.engine.RepositoryService; import org.activiti.engine.repository.Deployment; import org.activiti.engine.repository.DeploymentBuilder; import org.activiti.engine.repository.ProcessDefinition; import org.junit.Test; import com.google.gson.Gson; /** * 通過讀取bpmn文件,來部署流程圖 * * @author yuanqiao * */ public class DeploymentProcess { @Test public void deploymentFirstProcess() { ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); RepositoryService repositoryService = processEngine.getRepositoryService(); DeploymentBuilder deploymentBuilder = repositoryService.createDeployment().addClasspathResource("first.bpmn"); Deployment deployment = deploymentBuilder.deploy(); String deploymentId = deployment.getId(); System.out.println(deploymentId); List<ProcessDefinition> processDefinitionList = repositoryService.createProcessDefinitionQuery() .deploymentId(deploymentId).list(); Gson gson = new Gson(); System.out.println(gson.toJson(processDefinitionList)); } }
java.lang.NullPointerException
at org.activiti.engine.impl.db.DbSqlSession.dbSchemaUpdate(DbSqlSession.java:911)
at org.activiti.engine.impl.db.DbSqlSession.performSchemaOperationsProcessEngineBuild(DbSqlSession.java:1318)
at org.activiti.engine.impl.SchemaOperationsProcessEngineBuild.execute(SchemaOperationsProcessEngineBuild.java:28)
at org.activiti.engine.impl.interceptor.CommandInvoker$1.run(CommandInvoker.java:37)
at org.activiti.engine.impl.interceptor.CommandInvoker.executeOperation(CommandInvoker.java:78)
at org.activiti.engine.impl.interceptor.CommandInvoker.executeOperations(CommandInvoker.java:57)
at org.activiti.engine.impl.interceptor.CommandInvoker.execute(CommandInvoker.java:42)
at org.activiti.engine.impl.interceptor.TransactionContextInterceptor.execute(TransactionContextInterceptor.java:48)
at org.activiti.engine.impl.interceptor.CommandContextInterceptor.execute(CommandContextInterceptor.java:63)
at org.activiti.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:29)
at org.activiti.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:44)
at org.activiti.engine.impl.ProcessEngineImpl.<init>(ProcessEngineImpl.java:81)
at org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl.buildProcessEngine(ProcessEngineConfigurationImpl.java:665)
at org.activiti.engine.ProcessEngines.buildProcessEngine(ProcessEngines.java:189)
at org.activiti.engine.ProcessEngines.initProcessEngineFromResource(ProcessEngines.java:162)
at org.activiti.engine.ProcessEngines.init(ProcessEngines.java:94)
at org.activiti.engine.ProcessEngines.getProcessEngine(ProcessEngines.java:223)
at org.activiti.engine.ProcessEngines.getDefaultProcessEngine(ProcessEngines.java:212)
at com.yuanqiao.first_activiti.deployment.DeploymentProcess.deploymentFirstProcess(DeploymentProcess.java:25)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
解決辦法如下:
最近給客戶部署系統,系統中使用Activiti流程引擎,啟動Tomcat死活報錯,報錯如上邊信息。真是一頭霧水,剛開始以為是程序自身或者服務器環境問題(因為環境都是新裝的),沒往流程引擎上想。
上邊的異常只是截取的最關鍵的地方,其實在這之前還要報一片異常,把環境和程序配置檢查了一便,還是無果,最終把焦點集中在了org.activiti.engine.impl.db.DbSqlSession.dbSchemaUpdate,意思是流程表在更新表結構的時候出現異常,怎么會老是更新呢?查看了Activiti的配置,如上圖。
databaseSchemaUpdate設置為true代表如果沒有表,則自動創建表;估計是這里的原因,我重新建了一個空的數據庫test1,然后程序連上test1數據庫,啟動tomcat,竟然成功了。成功了,心里的一塊石頭落了地。
但是還是感覺很奇怪,不知道真正原因是什么,后來才想到,act_ge_property表,該表是流程引擎的屬性表,里面的三條數據是基礎數據,不可以刪除。而我看了一下數據庫初始化sql,竟然沒有這三條數據,我這才恍然大悟,我准備程序包的時候,為了不把流程里面的數據帶過來,我只是導出的表結構,沒有導出數據。也就是說還原到服務器數據庫的時候,act_ge_property表里面壓根沒有數據,這就造成了當前這個問題。聰明反被聰明誤。。以后引以為戒吧。
總結:部署程序准備數據庫初始化sql時,對於流程表,以后就不要導出來,只導出業務表,流程表讓系統啟動時自己生成去。