JBossシリーズ61:jBPM Human Task-Iを深く理解する


概要
HumanTaskはBPMプロセス中のノードであり人為的な手動操作によって実行されなければならない.jBPM 5は、User Task(jBPM 5の例のUser Task)ノードによってHuman Taskをサポートする.HumanTaskは、通常、プロセス設計者がプロセスを設計する際に、プロセス実行に関連する属性、プロセスタイプ、プロセスの実行者、プロセス実行に関連するデータを指定する必要があります.プロセスの実行時に、これらのプロパティに基づいてプロセスを実行します.
Human TaskはBPMのコアですが、なぜそう言えるのでしょうか.あるBPM専門家は、あるBPM技術サミットでBPMをこのように定義したことがある.「BPM is a blending of process management/workflow withアプリケーションintegration technology...to support rich human interaction and deepアプリケーションconnectivity」.BPMの目的や価値は、複雑な企業アプリケーションに広範な人為的な操作を提供する可能性であることに注意してください.
本論文の主な目的はjBPM Human Taskを実験的に理解することであり,git,Maven,JBossなどを含むツールが必要であり,これらのインストールはソフトウェアインストールおよび資料ダウンロードを参照することができる.この文書の主な内容は次のとおりです.
  • ダウンロードコンパイルjBPM Human Taskコード
  • jBPM Human TaskサービスをJBoss
  • に導入
  • jBPM HumanTaskデータモデル
  • TaskClientを介してHuman Taskサービス側と対話する
  • Human Taskのライフサイクル
  • ダウンロードコンパイルjBPM Human Taskコード
    このセクションでは、jBPM 5.2のコンパイルをダウンロードします.xコード(https://github.com/droolsjbpm/jbpm/tree/5.2.x)を使用して、以下のgitコマンドを使用してクローンを作成します.
    git clone --branch=5.2.x [email protected]:droolsjbpm/jbpm.git

    クローン作成完了は、以下のmavenコマンドを使用してjBPM 5.2をコンパイルする.xコード:
    mvn clean install -Dmaven.test.skip=true

    上記の手順でエラーが発生しなかった場合、このセクションは完了します.生成されたパッケージまたはMavenローカルウェアハウス内のパッケージをコンパイルして使用する必要があります.
  • jbpm-human-task-war-5.2.6-SNAPSHOT-EE6.war-jbpm-human-task-war/targetディレクトリの下にある
  • JBPM Human TaskサービスをJBossに配備
    このセクションでは、jbpm-human-task-war-5.26-SNAPSHOT-EE 6を導入します.warからJBoss 7へ.具体的には、JBoss 7/WildFlyに適用するには、4つの方法を使用します.
    jbpm-human-task-war-5.26-SNAPSHOT-EE 6に基づく必要があります.warは次の操作を行います.
    1.名前の変更
    unzip jbpm-human-task-war-5.2.6-SNAPSHOT-EE6.war jbpm-human-task.war

    2.データベースの作成
    jBPM Human Task実行プロセスでは、データベースにデータを格納する必要があります.この実験ではmysqlデータベースを使用し、次のSQL文を使用してデータベースjbpm、jbpm_を作成します.userは、データベースjbpm、jbpm_を操作するために使用されます.user対応パスワードjbpm_pass:
    CREATE DATABASE jbpm;  
    create user 'jbpm_user'@'localhost' identified by 'jbpm_pass';  
    grant all on jbpm.* to jbpm_user@'localhost';  
    FLUSH PRIVILEGES;

    3.jbpmDSデータソースの作成
    JBoss 7/WildFlyでMysqlデータベースで説明されている方法を使用してデータソースjbpmDSを作成するように構成されています.データソースは次のようになります.
    <datasource jndi-name="java:jboss/datasources/jbpmDS" pool-name="jbpmPool">  
          <connection-url>jdbc:mysql://localhost:3306/jbpm</connection-url>  
          <driver>mysql</driver>  
          <security>  
             <user-name>jbpm_user</user-name>  
             <password>jbpm_pass</password>  
          </security>  
    </datasource> 

    4.persistenceを修正する.xml
    jbpm-human-taskを変更します.war/WEB-INF/classes/META-INF/persistence.xmlファイル、hibernateを構成します.dialect属性はorg.hibernate.dialect.MySQL5Dialect,hibernate.show_sqlプロパティはtrueです.
    5.hornetq-core-2.2.2.10を更新する.Final.jar
    このステップは選択可能ですhornetq-core-2.2.2.10.Final.JArパッケージにはSocket leakなどの不安定な問題がありますので、このパッケージをアップグレードすることをお勧めします.
    6.JBossを起動する
    JBossを使用してスクリプトを起動します./standalone.shはJBossを起動し、起動完了後にjbpm-human-taskを見ることができる.war導入成功のヒント.次のログ情報が表示されます.
    17:19:07,950 INFO  [stdout] (ServerService Thread Pool -- 52) Task service startup completed successfully !

    netstatコマンドを使用して、すべてのポートの使用状況を出力します.
    [kylin@localhost lib]$ netstat -antulop | grep 13179
    (Not all processes could be identified, non-owned process info
     will not be shown, you would have to be root to see it all.)
    tcp        0      0 127.0.0.1:4447              0.0.0.0:*                   LISTEN      13179/java          off (0.00/0/0)
    tcp        0      0 127.0.0.1:5153              0.0.0.0:*                   LISTEN      13179/java          off (0.00/0/0)
    tcp        0      0 127.0.0.1:9990              0.0.0.0:*                   LISTEN      13179/java          off (0.00/0/0)
    tcp        0      0 127.0.0.1:9999              0.0.0.0:*                   LISTEN      13179/java          off (0.00/0/0)
    tcp        0      0 127.0.0.1:8080              0.0.0.0:*                   LISTEN      13179/java          off (0.00/0/0)
    tcp        0      0 127.0.0.1:44186             127.0.0.1:5153              ESTABLISHED 13179/java          keepalive (5695.77/0/0)
    tcp        0      0 127.0.0.1:34368             127.0.0.1:3306              ESTABLISHED 13179/java          keepalive (5695.77/0/0)
    tcp        0      0 127.0.0.1:5153              127.0.0.1:44186             ESTABLISHED 13179/java          keepalive (5695.77/0/0)

    5153は、Human Task Serviceがサーバ側で傍受するポートであることに注意してください.
    jBPM Human Taskデータモデル
    上記のセクションでは、空白のデータベースjbpmを作成し、jBPMはJPA/Hobernateをデータ永続ツールとして使用し、JBossの起動に成功するとHibernateはデータベースjbpmにテーブルを作成し、mysql管理側でjbpm_を使用します.userユーザーがログインした後、テーブルの作成状況を表示します.
    show tables出力:
    mysql> show tables;
    +--------------------------------+
    | Tables_in_jbpm                 |
    +--------------------------------+
    | Attachment                     |
    | BooleanExpression              |
    | Content                        |
    | Deadline                       |
    | Delegation_delegates           |
    | Escalation                     |
    | I18NText                       |
    | Notification                   |
    | Notification_BAs               |
    | Notification_Recipients        |
    | Notification_email_header      |
    | OrganizationalEntity           |
    | PeopleAssignments_BAs          |
    | PeopleAssignments_ExclOwners   |
    | PeopleAssignments_PotOwners    |
    | PeopleAssignments_Recipients   |
    | PeopleAssignments_Stakeholders |
    | Reassignment                   |
    | Reassignment_potentialOwners   |
    | SubTasksStrategy               |
    | Task                           |
    | email_header                   |
    | task_comment                   |
    +--------------------------------+
    23 rows in set (0.00 sec)

    すなわちjBPMがHumanTaskを実行するために必要なテーブルは計23個である.
    jbpm human taskソースコード解析−Iのorg.jbpm.task.Taskセクションでは、データ・エンティティ・モデルが対応するデータベース内のテーブルのマッピングであるデータ・モデル・クラスを説明します.次のセクションでは、jBPM Human Task Serviceが提供するインタフェースを使用してデータベース内のデータを操作する方法を示します.
    TaskClientによるHuman Taskサービスとのインタラクション
    以前の手順に基づいて、ここではTaskClientを通じてHumanTaskサービス側と対話し、Taskを作成し、Taskを開始し、Taskを終了します.
    Taskの作成
    org.jbpm.conductor.humantask.TaskAddでは、TaskClientを使用してクライアントでTaskを作成する方法を示します.次のように、コードクリップの一部を示します.
    	TaskClient client = getTaskClientInstance();
            client.connect();
    		
            Task task = newTask();
            ContentData content = new ContentData();
            
            BlockingAddTaskResponseHandler addTaskResponseHandler = new BlockingAddTaskResponseHandler();
            client.addTask(task, content, addTaskResponseHandler );
            long taskId = addTaskResponseHandler.getTaskId();
            System.out.println("Add Task to human task service, taskId: " + taskId);

    Javaアプリケーションでorgを実行する.jbpm.conductor.humantask.TaskAdd出力
    Add Task to human task service, taskId: 1

    Mysqlデータベース側でSQL文クエリを使用すると、次の結果が得られます.
    mysql> select id, status, actualOwner_id, createdBy_id, activationTime from Task;
    +----+----------+----------------+--------------+---------------------+
    | id | status   | actualOwner_id | createdBy_id | activationTime      |
    +----+----------+----------------+--------------+---------------------+
    |  1 | Reserved | kylin          | kylin        | 2013-12-02 16:51:24 |
    +----+----------+----------------+--------------+---------------------+

    Taskの取得
    org.jbpm.conductor.humantask.Gettingでは、TaskClientを使用してクライアントでTaskを取得する操作を実行する方法を示します.次のように、コードセグメントの一部を示します.
            TaskClient client = getTaskClientInstance();
            client.connect();
            
            BlockingTaskSummaryResponseHandler taskSummaryResponseHandler = new BlockingTaskSummaryResponseHandler();
            client.getTasksAssignedAsPotentialOwner("kylin", "en-UK", taskSummaryResponseHandler);
            List<TaskSummary> tasks = taskSummaryResponseHandler.getResults();
            System.out.println("Getting tasks for human task service via user kylin, tasks size: " + tasks.size());

    Javaアプリケーションでorgを実行する.jbpm.conductor.humantask.TaskGetting出力
    Getting tasks for human task service via user kylin, tasks size: 1

    スタートTask
    org.jbpm.conductor.humantask.TaskStartでは、TaskClientを使用してクライアントでTaskを開始する方法を示します.次のように、一部のコードクリップです.
            TaskClient client = getTaskClientInstance();
            client.connect();
            
            BlockingTaskOperationResponseHandler responseHandler = new BlockingTaskOperationResponseHandler();
            client.start(1, "kylin", responseHandler);
            responseHandler.waitTillDone(1000);
            System.out.println("kylin starting Task ");

    Javaアプリケーションでorgを実行する.jbpm.conductor.humantask.TaskStart出力
    kylin starting Task

    Mysqlデータベース側でSQL文クエリを使用すると、次の結果が得られます.
    mysql> select id, status, actualOwner_id, createdBy_id, activationTime from Task;
    +----+------------+----------------+--------------+---------------------+
    | id | status     | actualOwner_id | createdBy_id | activationTime      |
    +----+------------+----------------+--------------+---------------------+
    |  1 | InProgress | kylin          | kylin        | 2013-12-02 16:51:24 |
    +----+------------+----------------+--------------+---------------------+

    Taskの完了
    org.jbpm.conductor.humantask.TaskCompleteは、TaskClientを使用してクライアントでTaskの操作を完了する方法を示します.次のように、一部のコードクリップです.
            TaskClient client = getTaskClientInstance();
            client.connect();
        
            ContentData content = new ContentData();
            
            BlockingTaskOperationResponseHandler responseHandler = new BlockingTaskOperationResponseHandler();
            client.complete(2, "kylin", content, responseHandler);
            responseHandler.waitTillDone(1000);
            System.out.println("kylin completing Task ");

    Javaアプリケーションでorgを実行する.jbpm.conductor.humantask.TaskComplete出力
    kylin completing Task

    Mysqlデータベース側でSQL文クエリを使用すると、次の結果が得られます.
    mysql> select id, status, actualOwner_id, createdBy_id, activationTime from Task;
    +----+-----------+----------------+--------------+---------------------+
    | id | status    | actualOwner_id | createdBy_id | activationTime      |
    +----+-----------+----------------+--------------+---------------------+
    |  1 | Completed | kylin          | kylin        | 2013-12-02 16:51:24 |
    +----+-----------+----------------+--------------+---------------------+

    また、次のSQLを使用してMysql管理側でクエリーを管理することもできます.
    select DTYPE, id from OrganizationalEntity;
    select id, language, text from I18NText;

    ヒューマンタスクのライフサイクル
    HumanTaskノードがプロセス実行中にアクティブ化されると、1人が参加する作業のために生成され、プロセスはその人が参加する作業が完了またはキャンセルされた後にのみノードを離れる.HumanTaskのライフサイクルは次のとおりです.
  • Taskが作成され、最初の状態は「created」
  • であった.
  • Taskの状態は、通常、自動的に"Ready"に遷移し、この状態のTaskはTaskリストにあり、ユーザによって
  • を要求することができる.
  • Taskはユーザによって要求され、状態は「Reserved」
  • となる.
  • Taskはユーザによって開始され、状態は「InProgress」
  • となる.
  • Taskはユーザによって終了され、状態は「Completed」となり、ユーザがTaskを終了できない場合、誤った結果が返され、Task状態は「Failed」
  • となる
    Next