Activiti7 ---高度なエクスペリエンス

1.プロセスインスタンス

プロセスインスタンスとは
参加者(ユーザーまたはプログラム)がプロセスを開始します。これはプロセスインスタンスです。ダイナミックです。
プロセス定義とプロセスインスタンスの図:
ここに画像の説明を挿入
プロセスインスタンスの開始

 	/**
     * 部署流程
     */
    @Test
    public void testDeployProcess() {
    
    
        Deployment deploy = repositoryService.createDeployment()
                .addClasspathResource("processes/test.bpmn")
                .addClasspathResource("processes/test.png")
                .name("测试获取流程图-1")
                .deploy();
        System.out.println("流程部署ID:"+deploy.getId());
        System.out.println("流程部署名称:"+deploy.getName());
    }

    /**
     * 启动流程
     */
    @Test
    public void  testStartProcess(){
    
    
        securityUtil.logInAs("salaboy");
        //启动流程实例,同时还要指定业务标识businessKey 
        //第一个参数:是指流程定义key
        //第二个参数:业务标识businessKey
        ProcessInstance test = runtimeService.startProcessInstanceByKey("test","1001");
        System.out.println("流程实例id:"+test.getId());
        System.out.println("流程部署id:"+test.getProcessDefinitionId());
    }

2. Businesskey(ビジネス識別)

ビジネスキー:ビジネス識別子、通常はビジネステーブルの主キー。ビジネス識別子はプロセスインスタンスに対応します。ビジネスIDはビジネスシステムから取得されます。ビジネスIDの保管とは、ビジネスIDに基づいてビジネスシステムのデータを関連付けてクエリすることです。たとえば、休暇申請プロセスがプロセスインスタンスを開始する場合、休暇申請フォームのIDをビジネス識別子としてactivitiに格納できます。将来的には、Activitiのプロセスインスタンス情報を照会することによって要求フォームのIDを取得し、ビジネスシステムデータベースを照会することによって要求フォームの情報を取得できます。

  1. //プロセスによって定義されたキー(プロセスインスタンス)に従って開始します
  2. ProcessInstanceprocessInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey、
    businessKey);

ここに画像の説明を挿入

3.データベーステーブルを操作する

プロセスインスタンスを開始するには、次のデータベーステーブルを操作します
。SELECT * FROM act_ru_execution#プロセスインスタンス実行テーブル。現在のプロセスインスタンスの実行を記録します。
ここに画像の説明を挿入
注:
プロセスインスタンスが実行された場合、現在ブランチが1つしかない場合、-a プロセスインスタンスにはレコードが1つしかありません。また、実行テーブルの主キーIDはプロセスインスタンスIDと同じです。現在複数のブランチが実行されている場合、実行テーブルには複数のレコードがあり、実行テーブルの主キーがプロセスインスタンスIDと異なるレコードがあります。現在ブランチがいくつあっても、レコードの実行テーブルの主キーはプロセスインスタンスidと同じです。プロセスインスタンスは完了し、このテーブル内のプロセスインスタンスに関連するレコードは削除されます。

SELECT * FROM act_ru_task#タスク実行テーブル、現在実行中のタスクを記録します
ここに画像の説明を挿入
説明:
プロセスインスタンスを開始し、プロセスは現在最初のタスクノードに対して実行されます。このテーブルは現在のタスクの実行を示すレコードを挿入します。タスクが完了した場合、レコードは削除されます。

SELECT * FROM act _hi _procinst#プロセスインスタンス履歴テーブル
ここに画像の説明を挿入
SELECT * FROM act_hi_taskinst#タスク履歴テーブルは、タスクを
ここに画像の説明を挿入
開始するすべてのタスクを記録し、act_ru_taskテーブルにレコードを挿入するだけでなく、履歴タスクテーブルにもレコードを挿入します。タスク履歴テーブルの主キーは、タスクID。このテーブルのレコードは、タスクが完了しても削除されません。

SELECT * FROM act_hi_actinst#アクティビティ履歴テーブル。すべてのアクティビティを記録します。
ここに画像の説明を挿入
アクティビティにはタスクが含まれるため、このテーブルにはタスクだけでなく、開始イベントや終了イベントなど、プロセス実行プロセスの他のアクティビティも記録されます。

実行中のプロセスでは、プロセスインスタンスのステータス、現在実行中のノード、およびその他の情報を照会できます。

	/**
     * 查询流程实例
     */
    @Test
    public void getProcessInstance(){
    
    
        List<ProcessInstance> list = runtimeService.createProcessInstanceQuery()
                .processInstanceId("6fa76f62-e5d5-11ea-958c-68ecc5dbc2f7")
                .list();
        for (ProcessInstance processInstance : list) {
    
    
            System.out.println(processInstance.getId());
        }
    }

4. BusinnessKeyを関連付ける

要件:
実用的なアプリケーションをアクティブ化する場合、クエリプロセスインスタンスリストには、ビジネスシステムに関するいくつかの情報を表示する必要がある場合があります。たとえば
、単一の名前を残すために操作が必要になる前にプロセスのリストが離れるときクエリ、休暇日やその他の情報の表示、休暇日などです。この情報はビジネスシステム
には存在しますが、activitiデータベースには存在しないため、activiti APIを介して休暇日数やその他の情報を照会することはできません。
実現:
プロセスインスタンスをクエリすると、ビジネスシステムの休暇フォームがbusinessKey(ビジネス識別子)を介してリンクされ、休暇日
やその他の情報をクエリします次のコードは、保存されたExamplesトラフィックKeyoとこのサービスキーを通常保存するフェーズを取得し、
関連付けられた対応するプライマリキーサービスアクションテーブルを取得します。詳細な
休暇情報(休暇を求める人、休暇時間、休暇日数、休暇を求める理由など)
ここに画像の説明を挿入
このテーブルはワークプロセスのコアテーブルであり、プロセスドライバーは修飾テーブルと密接に関連しています。
一般的に言えば、プロセスインスタンスにはメインラインがあります。プロセスが直線プロセスの場合、このテーブルには、プロセスインスタンスに対応するレコードが1つだけあります。

  • ID_:EXECUTION主キー。この主キーはPROC_INST_ID_と同じ場合があります。同じ状況は、このレコードがメインインスタンスレコードであることを意味します。
  • REV_:データベーステーブルの更新回数を表します。
  • PROC_INST_ID_:プロセスインスタンスにブランチインスタンスがいくつあっても、このIDは同じです。
  • BUSINESS_KEY_:これはビジネス主キーであり、メインプロセスはビジネス主キーを使用し、このビジネス主キーフィールドにはテーブル内で一意の制約があります。
  • PARENT_ID_:このレコードは、親インスタンスIDを表します。上記のように、同期ノードは2つの実行レコードを生成します。これら2つのレコードの親IDは、メインラインのIDです。
  • PROC_DEF_ID_:プロセス定義ID
  • SUPER_EXEC:これが存在する場合、このインスタンスレコードは、メインプロセスの主キーIDに対応する外部サブプロセスレコードであることを意味します。
  • ACT_ID_:プロセスが実行されるノードを示します
  • IS_ACTIVE_:アクティブプロセスインスタンスかどうか。たとえば、メインプロセスは非アクティブインスタンスで、次の2つはアクティブインスタンスです。UserTask2が完了すると、この値は0になり、非アクティブになります。
  • IS_CONCURRENT_:同時ですか?
  • IS_SCOPE_:このフィールドでは、副署名、サブプロセス、同期などのさまざまなプロセスインスタンスを追跡しましたが、このフィールドは、メインインスタンスの場合は1、サブインスタンスの場合は0であることがわかりました。
  • TENANT_ID_:このフィールドは、テナントIDを表します。マルチテナント対応が可能。
  • IS_EVENT_SCOPE:イベントが使用されない場合、通常は0です。
  • SUSPENSION_STATE_:一時停止するかどうかを示します。
  • CACHE_ENT_STATE:とりあえずこれが何をするのか分かりません。

クエリビジネスID

	/**
     * 查询BusinnessKey
     */
    @Test
    public void testQueryProcessDefinition() {
    
    
        securityUtil.logInAs("salaboy");
        String businessKey = processRuntime.processInstance("6fa76f62-e5d5-11ea-958c-68ecc5dbc2f7")
                .getBusinessKey();
        System.out.println(businessKey);
    }

インスタンスを一時停止およびアクティブ化します。
場合によっては、プロセスの変更のために、現在実行中のプロセスを直接削除するのではなく、一時停止する必要があります。プロセスが一時停止されると、実行は続行されません

すべての中断およびアクティブ化された
操作プロセスは中断として定義され、プロセス定義の下のすべてのプロセスインスタンスは中断されます。プロセスは中断として定義されます。プロセス定義では、新しいプロセスインスタンスを開始できず、プロセス定義の下のすべてのプロセスインスタンスはすべて実行を一時停止します。

 	/**
     * 全部挂起和激活实例
     */
    @Test
    public void PendingActivation(){
    
    
        //查询流程定义的对象
        ProcessDefinition test = repositoryService.createProcessDefinitionQuery()
                .processDefinitionKey("test")
                .singleResult();
        //得到当前流程定义的实例是否都为暂停状态
        boolean suspended = test.isSuspended();
        String id = test.getId();
        if(suspended){
    
    
            //暂停,就可以激活操作
            repositoryService.activateProcessDefinitionById(id,true,null);
            System.out.println("流程定义:"+id+"激活");
        }else {
    
    
            //激活,就可以挂起操作
            repositoryService.suspendProcessDefinitionById(id,true,null);
            System.out.println("流程定义:"+id+"挂起");
        }
    }

ここに画像の説明を挿入
注:上記の赤いボックスのフィールドの値は、プロセスが中断されている場合は2、アクティブ化されている場合は1、現在アクティブである場合です。

シングルサスペンションとアクティベーション

	/**
     * 单个挂起和激活
     */
    @Test
    public void singlePendingActivation(){
    
    
        //查询流程定义的对象
        ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
                .processInstanceId("cf8ab090-e5dc-11ea-a288-68ecc5dbc2f7")
                .singleResult();
        //得到当前流程定义的实例是否都为暂停状态
        boolean suspended = processInstance.isSuspended();
        String id = processInstance.getId();
        //判断
        if(suspended){
    
    
            //暂停,就可以激活操作
            runtimeService.activateProcessInstanceById(id);
            System.out.println("流程定义:"+id+"激活");
        }else {
    
    
            //激活,就可以挂起操作
            runtimeService.suspendProcessInstanceById(id);
            System.out.println("流程定义:"+id+"挂起");
        }
    }

データベース:
ここに画像の説明を挿入
単一のインスタンスが中断されていることがわかります。赤いボックスのインスタンスでは、SUSPENSION_STATE_フィールドの値は1で、インスタンスがアクティブであることを示し、上記のインスタンスの値は2で、インスタンスが中断されていることを示します。

注:インスタンスが一時停止されている場合、現在のインスタンスのタスクを完了できず、タスクが強制的に送信されるとエラーが報告されます
org.activiti.engine.ActivitiException: Cannot complete a suspended task(org.activiti.engine网站.ActivityException:无法完成挂起的任务)

5.プロセス変数

プロセス変数とは何ですか?
プロセス変数はactivitiで非常に重要な役割です。プロセス操作はプロセス変数に依存する必要がある場合があります。ビジネスシステムとativitiを組み合わせる場合、プロセス変数は不可欠です。プロセス変数は、activitiがワークフローを管理するときに管理ニーズに従って設定されます。変数。たとえば、休暇申請のプロセスで、休暇の日数が3日を超える場合は、部長がそれをレビューします。それ以外の場合は、担当者が直接レビューします。休暇の日数は、プロセス変数として設定し、フローのプロセスで使用できます。
注:ビジネスデータはプロセス変更tに保存できますが、activiti apiを介してプロセス変更ブックtをクエリしてビジネスデータをクエリできますが、これはお勧めできません。ビジネスデータクエリがビジネスシステムを担当し、activitiがプロセスのプロセス変更tを設定するためです。作成する必要があります

プロセス変数タイプ
ここに画像の説明を挿入
注:pojoをプロセス変数に格納する場合は、シリアライズ可能なインターフェースをシリアライズ可能に実装する必要があります。新しいフィールドがデシリアライズできないようにするには、serialVersionUIDを生成する必要があります。

ここに画像の説明を挿入
グローバル変数の変数名は繰り返し使用できません。同じ名前の変数を設定すると、後で設定した値によって、前に設定した変数の値が上書きされます。ローカル変数
のスコープは、異なるタスクまたは異なる実行インスタンスでは互いに影響しないため、
ローカル変数名またはグローバル変数名に影響を与えずに、変数名を同じにすることができますが、影響はありません。

プロセス変数の使用方法

ステップ1:プロセス変数を設定する
ステップ2:UEL式でプロセス変数を使用する

  1. UEL式は担当者に設定できます。式の値はタスクの担当者です。例:$ {assignee}、担当者
    は、UEL式の値、つまりプロセス変数担当者と担当者の値を取得するためのActivitiというプロセス変数名ですタスク割り当てのタスク担当者としての価値
  2. 接続にUEL式を設定してフローの方向を決定できます。例:$ {price> = 10000}およびS {ric10000:price is-t
    プロセス変数名、そしてuel 式の結果の型はブール型

UEL式がtrueの場合、プロセス実行の方向を決定します。


従業員はグローバル変数を使用してプロセスを制御し、休暇申請フォームを作成します。これは部門マネージャーによってレビューされます。部門マネージャーが承認された後、休暇申請は人事マネージャーによって3日以内に直接レビューされ、ゼネラルマネージャーが最初に3日以上レビューします。 。
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
グローバルプロセス変数の設定
部門長がレビューする前にプロセス変数を設定します。変数値は休暇フォーム情報(休暇日数を含む)です。部門マネージャーがレビューした後、プロセスの方向はプロセス変数の値に従って決定できます。

起動時にプロセス変数を設定する

プロセスの開始時にプロセス変数を設定します。変数のスコープはプロセスインスタンス全体です。map <key、value>を使用してプロセス変数を設定します。マップには複数の変数を設定できます。このキーはプロセス変数の名前です。

説明:
startProcessInstanceByKey(processDefinitionkey、variables)プロセス変数スコープはプロセスインスタンスです。プロセス変数はマップに格納されます。プロセスインスタンス設定変数マップのキーは同じです。後者は前者をオーバーライドします。

プロセス変数を設定する
タスクが処理されるときに、タスクが完了したとき、プロセス変数を設定する。タスクが完了した後、プロセス変数は、他のノードによってのみ使用することができる。その範囲は、全体のプロセスのインスタンスである。セットのプロセス変数のキーはプロセスインスタンスである場合同じ名前がすでに存在する場合は、後で設定された変数が前に設定された変数を置き換えます。これには、休暇注文の作成タスクが完了したときにプロセス変数を設定する必要があります。

説明:
現在のタスクを介してプロセス変数を設定するには、現在のタスクIDを指定する必要があります。現在実行中のタスクIDが存在しない場合は、例外がスローされます。プロセス変数は、タスクの処理時にmap <key、value>によっても設定されます。--一度に複数の変数を設定できます。

現在のインスタンスを介してプロセス変数を設定する

//新加入的:通过流程实例id,来测试流程变量
    public static void main(String[] args) {
    
    
        //1.得到ProcessEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        //2.得到RuntimeService
        RuntimeService runtimeService =  processEngine.getRuntimeService();

        //3.流程定义的key问题   myProcess_1
        //Map<String ,Object> map = new HashMap<>();

        Holiday holiday = new Holiday();
        holiday.setNum(5F);
       // map.put("holiday",holiday);

        //4.通过实例id,来设置流程变量
        //第一个参数:流程实例的id
        //第二个参数:流程变量名
        //第三个变量:流程变量名,所对应的值
        runtimeService.setVariable("2501","holiday",holiday);

    }

注:
executionldは、現在の未完了のプロセスインスタンスの実行IDである必要があります。通常、このIDはプロセスインスタンスのIDを設定します。runtimeServicegetVariable()を使用してプロセス変数を取得することもできます。

現在のタスクでプロセス変数を設定する

 		String taskId = "1404";
        TaskService taskService  = processEngine.getTaskService();
        Holiday holiday = new Holiday();
        holiday.setNum(5F);
        taskService.setVariable(taskId,"holiday",holiday);

ここに画像の説明を挿入

6. Activiti7の概要

ワークフローとは?
複数の参加者が事前定義されたプロセスに従ってビジネスフローを自動的に実行できるように、コンピューターによるビジネスプロセスの管理を自動化すること
です。
アクティビティとは何ですか?アクティビティとは、ワークフローエンジン、オープンソースアーキテクチャ、および基本的なbpmn2.0標準ですプロセス定義の場合、その前身はjbpmで、
Activitiはビジネスシステムの開発と使用に組み込まれる予定です。
activitiを使用して開発する方法?
ステップ1:activiti環境をデプロイします。
環境には、jarパッケージとデータベース(25テーブル)が含まれます。ビジネスシステムは、Springとactivitiの統合によって開発されています。
●ステップ2:activitiが提供するプロセスデザイナー(ideaまたはeclipseと統合されたデザイナー)を使用して
プロセスを定義します。プロセス定義は、.bpmnおよび.png(不要)の2つのファイルを生成します。
●ステップ3:プロセス定義ファイルをactivitiデータベースに
デプロイしますSELECT * FROM act re_ deployment#プロセス定義デプロイメントテーブル-秒のデプロイメントレコードを挿入してプロセス定義のデプロイメント情報を記録しますSELECT * FROM act re procdef#プロセス定義テーブル-秒プロセス定義情報を展開します。一度に2つのプロセス定義を展開する場合は、2つのレコードの提案を挿入します。-2番目の展開に対して1つのプロセス定義のみを展開するため、re_ deploymentおよびact_ re_ defを実行します。 :単一ファイルデプロイメントとzipファイルデプロイメント単一ファイルデプロイメントをお勧めします。
●ステップ4:プロセスインスタンスを開始する
ビジネスシステムは、プロセス定義に従ってビジネスプロセスを実行でき、実行前に開始する必要があります。プロセスインスタンスは、プロセス定義に従ってプロセスインスタンスを開始します。プロセス定義キーを指定すると、プロセスインスタンスが開始されます。activitiは、キーに従ってプロセス定義の最新バージョンを検索します。プロセス定義を指定して、プロセスインスタンスを開始します。インスタンスを開始するには、activitiとビジネスシステム統合の間のブリッジであるビジネスキー(ビジネス識別子)を指定する必要があります。例:休暇プロセス、businessKeyは休暇フォームのIDです。インスタンスの開始時にプロセス変数を指定することもできます。プロセス変数はグローバル変数です(ライフタイムはプロセスインスタンス全体であり、プロセスインスタンスが終了すると変数は消えます)
●ステップ5:タスクのクエリ
個人タスクのクエリ:taskServiceを使用して、割り当て先に従ってユーザーの現在のToDoタスクをクエリします。
グループタスクのクエリ:taskServiceを使用して、andidateuserに基づいて候補ユーザーの現在の予定グループタスクをクエリします。
●ステップ6:タスクの処理。
個人タスクの処理:taskServiceのcompleteメソッドを呼び出して、タスクを完了します。
グループタスクの場合は、最初にタスクをピックアップし、taskServiceのClaimメソッドを呼び出してタスクをピックアップする必要があります。タスクをピックアップすると、グループタスク
が個別のタスクになります(タスクには担当者がいます)。
ゲートウェイ:
排他的ゲートウェイ:タスクの実行後、排他的ゲートウェイブランチの後に有効なブランチは1つだけです。
並列ゲートウェイ:タスクの実行後、複数のブランチを使用でき、複数のブランチは常に収束し、収束が完了すると並列ゲートウェイは終了します。
インクルードゲートウェイ:専用ゲートウェイとパラレルゲートウェイの組み合わせです。

この記事は学ぶこと愛するラオワンから多くの知識を借り、多くのことを学びました。

おすすめ

転載: blog.csdn.net/Lv_vI/article/details/108198212