分分鐘 整合 activiti與ssm框架
整合Activiti框架
Spring框架叫做專案(資源)的管家。如果待整合專案中,有Spring框架,那麼主要就是和“Spring框架”做整合。把Activiti框架的“核心類”交給Spring管理;
Activiti的核心類,引擎配置物件,引擎物件,三大服務物件
如果框架有事務,也要把“事務”交給Spring管理。
需要整合ssm框架的點選我的文章:https://blog.csdn.net/weixin_42560234/article/details/84726974
整合步驟:
1、匯入activiti jar包
activiti-5.16.4\wars\activiti-rest\WEB-INF\lib\activiti*.jar
mybatis-3.2.5.jar (儘量使用高版本)
joda-time-2.1.jar
有可能會缺失其他包,丟擲異常ClassNotFound,差什麼就引入什麼?
如果使用的是Maven,則到中央倉庫,搜尋Activiti,拷貝pom的的程式碼端即可
2、新增Activiti配置檔案-applicationContext-activiti.xml-配置核心物件
Activiti使用者手冊中,第5章,前兩節
<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration"> <property name="dataSource" ref="dataSource" /> <property name="transactionManager" ref="transactionManager" /> <property name="databaseSchemaUpdate" value="true" /> </bean> <bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean"> <property name="processEngineConfiguration" ref="processEngineConfiguration" /> </bean> <bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService" /> <bean id="runtimeService" factory-bean="processEngine" factory-method="getRuntimeService" /> <bean id="taskService" factory-bean="processEngine" factory-method="getTaskService" /> <bean id="formService" factory-bean="processEngine" factory-method="getFormService" />
3、把Activiti配置檔案-applicationContext-activiti.xml整合到Spring
4、測試
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("/applicationContext.xml") public class ActivitiEnvTest { @Autowired private RepositoryService repositoryService; @Test public void test() { System.out.println(repositoryService); } }
5、流程定義選單實現
5.1 建立選單
在流程管理下面建立一個流程定義管理的二級選單 就有url
5.2 建立一個WorkFlowController要有一個跳轉到流程定義管理介面的方法
該方法的對映地址就是選單裡面的url
5.3 建立流程管理介面
拷貝其他頁面修改為流程管理頁面
5.4.新增流程
先讓後臺能夠接受來自前臺的資料(/workflow/newDeploy)
編寫IWorkFlowService完成專案的部署
注意1:
直接在控制器中注入工作流相關服務完成流程部署,還是自己寫一個服務進行封裝,這樣在Controller裡面就呼叫一句就搞定。
注意2:
編寫部署方法時,不要傳入頁面層的API,
MutilpartFile而要傳入InputStream 流.
注意3:
通過資料庫資訊檢視是否部署成功。
//跳轉到流程定義管理頁面
@RequestMapping("/processDefinition/index")
public String processDefiniton() {
//流程定義管理介面路徑,預設加上字首和字尾
return "workFlow/processDefinition";
}
/**
* 引數:
* name:部署名稱
* processFile:型別是MultipartFile,是SPringmvc用於檔案上傳接收的專用類
* 返回值:
* AJaxResult轉換結果
* @return
*/
@RequestMapping("/newDeploy")
@ResponseBody
public AjaxResult newDeploy(String name,MultipartFile processFile) {
System.out.println(name);
System.out.println(processFile);
//1 不要直接注入RepositoryService來完成部署,應該交給對應Service去做
//2 MultipartFile就是web層api,如果我們直接傳入,Service層就強依賴於web層API.也就是咱們這個Service必須在web才能執行,不能強依賴.
try {
workFlowService.newDeploy(name,processFile.getInputStream());
return new AjaxResult();
} catch (IOException e) {
e.printStackTrace();
return new AjaxResult("部署失敗!"+e.getMessage(),-1);
}
}
@Override
public void newDeploy(String name, InputStream inputStream) {
//完成真正部署
//1獲取引擎物件
//2獲取服務
//3做事情
ZipInputStream zis = null;
try {
zis = new ZipInputStream(inputStream);
//建立配置物件
DeploymentBuilder builder = repositoryService.createDeployment();
//進行配置
builder.name(name)//部署名稱
.addZipInputStream(zis); //bpmn和png
//部署
builder.deploy();
} catch (Exception e) {
e.printStackTrace();
}finally{
if (zis != null) {
try {
zis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
6、執行時管理-啟動流程
後臺:
@RequestMapping("/startProcess")
@ResponseBody
public AjaxResult startProcess(Long businessObjId){
try {
service.startProcess(businessObjId);
return new AjaxResult("啟動成功");
} catch (Exception e) {
e.printStackTrace();
return new AjaxResult("啟動失敗",-2);
}
}
@Override
public void startProcess(Long businessObjId) {
//業務邏輯:
//狀態值修改為報備中
Customer customer = dao.get(businessObjId);
//1是報備中
customer.setStatus(1);
dao.update(customer);
Map<String, Object> variables = new HashMap<>();
//通過客戶獲取營銷任務:設定變數
String seller = customer.getSeller().getNickname();
variables.put("seller", seller);
//啟動流程例項
//約定大於配置:
String processDefinitionKey=ProcessInstanceUtils.getProcessDefinitionKey(Customer.class);
definitionService.startProcess(processDefinitionKey, variables);
}