1. 程式人生 > >分分鐘 整合 activiti與ssm框架

分分鐘 整合 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);
}