擴展activiti刪除ACT_HI_*歷史表

本人博客開始遷移,博客整個架構本身搭建及編碼 http://www.cookqq.com/listBlog.action html

activiti自帶了不少表,如圖: java

ACT_HI_*:HI表示歷史數據(History)表,包括過時的流程實例,過時的變量和過時的任務等。 數據庫

歷史表中沒有建立外鍵,能夠很好的控制歷史表。架構

在項目中,有可能不須要保存歷史記錄,也就是這些ACT_HI_*表能夠刪除了。ide

刪除ACT_HI_*歷史表,從新啓動項目後報錯: 工具

嚴重: Error while closing command context
org.activiti.engine.ActivitiException: Activiti database problem: Tables missing for component(s) history
	at org.activiti.engine.impl.db.DbSqlSession.dbSchemaCheckVersion(DbSqlSession.java:713)
	at org.activiti.engine.impl.db.DbSqlSession.performSchemaOperationsProcessEngineBuild(DbSqlSession.java:1097)
	at org.activiti.engine.impl.SchemaOperationsProcessEngineBuild.execute(SchemaOperationsProcessEngineBuild.java:27)
	at org.activiti.engine.impl.interceptor.CommandExecutorImpl.execute(CommandExecutorImpl.java:24)
	at org.activiti.engine.impl.interceptor.CommandContextInterceptor.execute(CommandContextInterceptor.java:60)
	at org.activiti.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:32)
	at org.activiti.engine.impl.ProcessEngineImpl.<init>(ProcessEngineImpl.java:75)
	at org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl.buildProcessEngine(ProcessEngineConfigurationImpl.java:311)
	at org.activiti.engine.ProcessEngines.buildProcessEngine(ProcessEngines.java:194)
	at org.activiti.engine.ProcessEngines.initProcessEnginFromResource(ProcessEngines.java:167)
	at org.activiti.engine.ProcessEngines.init(ProcessEngines.java:98)

定位到錯誤地方:DbSqlSession.javaui


 if (dbSqlSessionFactory.isDbHistoryUsed() && !isHistoryTablePresent()) {
        errorMessage = addMissingComponent(errorMessage, "history");
      }

這裏主要的工做是檢查數據庫中是否有歷史表,由於上面刪除了數據庫中的歷史表因此報錯了。編碼


這裏面有一個很重要的變量dbSqlSessionFactory.isDbHistoryUsed() ,從代碼上面的意思也就是能夠關閉使用歷史表,好吧,就在建立配置文件的時候把它設置成false。 spa

 ProcessEngineConfiguration configuration = ProcessEngineConfiguration
		    		.createProcessEngineConfigurationFromResourceDefault();
		  if(configuration instanceof ProcessEngineConfigurationImpl){
			  //這裏的主要做用是爲了,刪除歷史數據,在啓動的時候不去檢測歷史數據庫是否存在
			 ((ProcessEngineConfigurationImpl) configuration).setDbHistoryUsed(false);
		  }
		  ProcessEngine processEngine = configuration.buildProcessEngine();

從新啓動後仍是有問題,後來debug跟進去發如今使用:debug


ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

使用上面代碼獲取引擎的時候又一次去加載配置文件了,搞了半天,才發現:


 ProcessEngines.getDefaultProcessEngine()獲取默認的activiti引擎,首先會根據字段isInitialized判斷是否已經加載了activiti配置文件,若是沒有加載就去加載activiti.cfg.xml和activiti-context.xml,若是加載了,就在processEngines根據名稱在獲取相應的引擎。

使用 configuration.buildProcessEngine()建立activiti引擎的時候,加載了activiti配置文件,而後把建立的引擎添加到了工具類ProcessEngines的processEngines中。並無設置字段isInitialized。

因此在項目中使用 ProcessEngines.getDefaultProcessEngine()獲取默認的activiti引擎時候,第一次還會去加載配置文件信息。

這個怎麼解決呢?

http://www.activiti.org/userguide/index.html 沒有找到相應的信息。

後來想到activiti.cfg.xml中的配置信息須要加載到ProcessEngineConfigurationImpl中,應該是先解析,而後尋找相應屬性的set方法進行賦值啊(我猜的)。那就經過配置文件設置吧:

<property name="dbHistoryUsed" value="false" />

啓動後項目,成功了,不在報錯了。

相關文章
相關標籤/搜索