史上最も完全な Activiti 学習チュートリアルと、最も強力なワークフロー エンジンが 1 つの記事にまとめられています。

1. ワークフローの概要

1.1 コンセプト

ワークフローとは、コンピュータを介して業務プロセスの管理を自動化することです。これは主に、「特定の期待されるビジネス目標を達成する、またはこの目標の実現を促進するために、事前に定義されたルールに従って複数の参加者間で文書、情報、またはタスクを自動的に転送するプロセス」を解決します。

1.2 ワークフローシステム

ソフトウェアシステムにはワークフローの機能があり、それをワークフローシステムと呼びます。システムにおけるワークフローの機能は何ですか? システムのビジネスプロセスの管理を自動化するため、ワークフローはビジネスプロセスに基づいているため、ソフトウェアシステムの中核は基本的にシステムのビジネスプロセスであり、ワークフローは管理を支援するだけですビジネスプロセスの。ワークフロー業務システムがなくても開発・運用は可能ですが、ワークフローを導入することで業務プロセスをより適切に管理し、システムの拡張性を向上させることができます。

1.3 該当する業種

消費財業界、製造業、通信サービス業、銀行証券保険等の金融サービス業、物流サービス業、不動産サービス業、不動産管理業、大手・中堅輸出入商社、官公庁、研究機関、教育サービス業特に大手多国籍企業およびグループ会社です。

1.4 特定のアプリケーション

1. 主要なビジネスプロセス:注文、見積処理、契約レビュー、顧客電話処理、サプライチェーン管理など。

2. 管理管理:出張申請、時間外申請、休暇申請、自動車申請、各種事務用品申請、購買申請、日報・週報など。元々手作業で処理されていたすべての管理フォーム。

3. 人事管理:従業員の研修手配、業績評価、転職処理、従業員ファイル情報管理など

4. 財務関連カテゴリー:支払請求、債権処理、日次精算処理、出張精算、予算・計画申請など。

5. 顧客サービス部門:顧客情報管理、顧客苦情、リクエスト処理、アフターサービス管理など。

6. 特殊サービスカテゴリー: ISOシリーズ対応プロセス、品質管理対応プロセス、製品データ情報管理、商社向け税関申告処理、物流会社向け貨物追跡処理など、さまざまな業務をワークフローソフトで自動標準化できます。フォームを通じて段階的に手動で完了します。

1.5 実装

専用のワークフロー エンジンが存在する前は、プロセス制御を実現するために、通常、ステータス フィールドの値を使用してプロセスの変更を追跡していました。このように、異なる役割を持つユーザーは、ステータス フィールドの値を通じてレコードを表示するかどうかを決定します。

権限を持って閲覧できるレコードについては、現在のユーザーが自分の役割に応じて限定操作を承認するかどうかを決定します。修飾されている場合は、修飾されていることを表すステータス フィールドに値を設定します。もちろん、修飾されていない場合は、修飾されていないことを表す値も設定する必要があります。

これは最も原始的な方法です。プロセス制御はステータスフィールドを通じて実現されますが、プロセスが変更されると、この方法で記述されたコードも調整する必要があります。

では、ワークフロー管理を実現する専門的な方法はあるのでしょうか? また、業務プロセスが変わってもプログラムを変更する必要がなくなり、その効果が得られれば、業務システムの適応性は大幅に向上します。

オープンソースで無料の Spring Boot の最も完全なチュートリアルをお勧めします。

https://github.com/javastacks/spring-boot-best-practice

2. Activiti7の概要

2.1 はじめに

Alfresco Software は、2010 年 5 月 17 日に Activiti ビジネス プロセス管理 (BPM) オープン ソース プロジェクトの正式立ち上げを発表しました。その主任アーキテクトは、ビジネス プロセス管理 BPM の専門家である Tom Baeyens です。Tom Baeyens はオリジナルの jbpm のアーキテクトであり、 jbpmは非常に有名なワークフローエンジンで、もちろんactivitiもワークフローエンジンです。

Activiti はワークフロー エンジンであり、業務システム内の複雑な業務プロセスを抽出し、専用のモデリング言語 BPMN2.0 を使用して定義できます。業務プロセスは事前に定義されたプロセスに従って実行され、システム プロセスは Activiti によって実装されます。により、プロセス変更に伴うシステムのアップグレードや変革に伴う業務システムの作業負荷が軽減され、システムの堅牢性が向上し、システムの開発コストや保守コストが削減されます。

公式サイト: https: //www.activiti.org/

体験版:

最新バージョン: Activiti7.0.0.Beta

2.1.1 BPM

BPM(Business Process Management)、つまりビジネスプロセス管理とは、組織の業務効率を継続的に向上させるためのエンドツーエンドのビジネスプロセスの標準化構築です。BPMはEMBAやMBAといった一般的な経営教育に含まれています。

2.1.2 BPM ソフトウェア

BPMソフトウェアとは、企業内のビジネス環境の変化に応じて、人と人、人とシステム、システムとシステム間のビジネス手法やソリューションの統合・調整を促進するITツールです。

BPM ソフトウェアによる企業の内部および外部ビジネス プロセスのライフ サイクル全体のモデリング、自動化、管理監視、最適化により、企業のコストが削減され、利益が大幅に増加します。

BPMソフトウェアは企業内で広く使用されており、企業の人事室管理、調達プロセス管理、公文書承認プロセス管理、財務管理など、ビジネスプロセスが存在するあらゆる場所の管理にBPMソフトウェアを使用できます。

2.1.3 BPMN

BPMN (ビジネス プロセス モデルと表記法) - ビジネス プロセス モデルと表記法は、BPMI (BusinessProcess Management Initiative) によって開発された一連の標準的なビジネス プロセス モデリング表記法であり、ビジネス プロセスは BPMN によって提供される表記法を使用して作成できます。

BPMN1.0 仕様は 2004 年 5 月にリリースされました。BPMI は 2005 年 9 月に OMG (The Object Management Group) 組織に組み込まれました。OMG は、2011 年 1 月に BPMN2.0 の最終バージョンをリリースしました。

具体的な開発経緯は以下の通りです。

BPMN は現在、さまざまな BPM ベンダーによって広く受け入れられている BPM 標準です。Activiti はプロセス モデリングとプロセス実行管理に BPMN 2.0 を使用しており、次のような多くのモデリング シンボルが含まれています。

円で表され、プロセスの実行中に発生するものです。

アクティビティは角丸長方形で表され、プロセスは 1 つまたは複数のアクティビティで構成されます。

Bpmn グラフは実際には xml を通じてビジネス プロセスを表しており、上記の .bpmn ファイルはテキスト エディタで開かれます。

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
  <process id="myProcess" name="My process" isExecutable="true">
    <startEvent id="startevent1" name="Start"></startEvent>
    <userTask id="usertask1" name="创建请假单"></userTask>
    <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
    <userTask id="usertask2" name="部门经理审核"></userTask>
    <sequenceFlow id="flow2" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow>
    <userTask id="usertask3" name="人事复核"></userTask>
    <sequenceFlow id="flow3" sourceRef="usertask2" targetRef="usertask3"></sequenceFlow>
    <endEvent id="endevent1" name="End"></endEvent>
    <sequenceFlow id="flow4" sourceRef="usertask3" targetRef="endevent1"></sequenceFlow>
  </process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_myProcess">
    <bpmndi:BPMNPlane bpmnElement="myProcess" id="BPMNPlane_myProcess">
      <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
        <omgdc:Bounds height="35.0" width="35.0" x="130.0" y="160.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1">
        <omgdc:Bounds height="55.0" width="105.0" x="210.0" y="150.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="usertask2" id="BPMNShape_usertask2">
        <omgdc:Bounds height="55.0" width="105.0" x="360.0" y="150.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="usertask3" id="BPMNShape_usertask3">
        <omgdc:Bounds height="55.0" width="105.0" x="510.0" y="150.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
        <omgdc:Bounds height="35.0" width="35.0" x="660.0" y="160.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
        <omgdi:waypoint x="165.0" y="177.0"></omgdi:waypoint>
        <omgdi:waypoint x="210.0" y="177.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
        <omgdi:waypoint x="315.0" y="177.0"></omgdi:waypoint>
        <omgdi:waypoint x="360.0" y="177.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3">
        <omgdi:waypoint x="465.0" y="177.0"></omgdi:waypoint>
        <omgdi:waypoint x="510.0" y="177.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="flow4" id="BPMNEdge_flow4">
        <omgdi:waypoint x="615.0" y="177.0"></omgdi:waypoint>
        <omgdi:waypoint x="660.0" y="177.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</definitions>

2.2 使用手順

アクティビティを展開する

Activiti はワークフロー エンジン (実際には、jar パッケージ API の集合体です) であり、業務システムは Activiti のインターフェースにアクセス (操作) して、プロセス関連データを便利に操作できるため、ワークフロー環境を環境に統合できます。ビジネスシステムの

プロセス定義

アクティビティ プロセス モデリング ツール (アクティビティ デザイナー) を使用して、ビジネス プロセス (.bpmn ファイル) を定義します。

.bpmn ファイルはビジネス プロセス定義ファイルであり、xml を通じてビジネス プロセスを定義します。

プロセス定義の展開

activiti はビジネス プロセス定義 (.bpmn ファイル) を展開します。

Activiti が提供する API を使用してプロセス定義コンテンツを保存し、Activiti の実行中に定義されたコンテンツをクエリできます。

Activiti はプロセス定義コンテンツを実行してデータベースに保存します

プロセスインスタンスを開始する

プロセス インスタンスは ProcessInstance とも呼ばれます。

プロセスインスタンスの起動とは、ビジネスプロセスの動作を開始することを意味します。

従業員休暇プロセス定義の展開が完了した後、Zhang San が休暇を申請したい場合はプロセス インスタンスを開始でき、Li Si が休暇を申請したい場合はプロセス インスタンスを開始して、 2 つのプロセスは相互に影響しません。

ユーザークエリのTo-Doタスク(タスク)

システムのビジネス プロセスは管理のためにアクティビティに引き渡されているため、アクティビティを通じて、現在のプロセスがどこで実行されているか、現在のユーザーがどのようなタスクを処理する必要があるかを問い合わせることができます。これらのアクティビティは、これらを管理するのに役立ちます。開発者は SQL ステートメントでクエリを作成できます。

ユーザーがタスクを処理する

ユーザーが保留中のタスクをクエリした後、特定のタスクを処理できます。タスクが完了すると、他のユーザーがそのタスクを処理する必要があります。たとえば、発注書が作成された後、部門マネージャーによってレビューされます。このプロセスは次のとおりです。これも私たちのアクティビティによって完了しました。

プロセスの終わり

タスクが完了し、次のタスクノードが存在しない場合、プロセスインスタンスは完了します。

3、アクティビティ環境

3.1 開発環境

  • JDK1.8以上
  • MySQL 5 以降
  • トムキャット8.5
  • アイディア

注: activiti のプロセス定義ツール プラグインは、IDEA または Eclipse ツールの下にインストールできます。

3.2 アクティビティ環境

Activiti7.0.0.Beta1ここでは、デフォルトで spring5 がサポートされているものを使用します。

オープンソースで無料の Spring Boot の最も完全なチュートリアルをお勧めします。

https://github.com/javastacks/spring-boot-best-practice

3.2.1 アクティビティのダウンロード7

Activiti ダウンロード アドレス: http://activiti.org/download.html、Maven の依存関係は次のとおりです。

<dependencyManagement>
   <dependencies>
       <dependency>
           <groupId>org.activiti</groupId>
           <artifactId>activiti-dependencies</artifactId>
           <version>7.0.0.Beta1</version>
           <scope>import</scope>
           <type>pom</type>
       </dependency>
   </dependencies>
</dependencyManagement>
1) データベース:

activiti の操作にはデータベースのサポートが必要です。サポートされているデータベースは、h2、mysql、oracle、postgres、mssql、db2 です。

3.2.2 プロセスデザイナーIDEAでのインストール

次の図に示すように、IDEA の [ファイル] メニューでサブメニュー [設定] を見つけ、左側の [プラグイン] メニューを選択します。

Activiti Designerこの時点で、IDEA バージョンである actiBPM プラグインを検索でき、「インストール」をクリックしてインストールします。

インストール後のページは以下のようになります。

アイデアを再起動する必要があることを示すプロンプトが表示されたら、「再起動」をクリックします。

再起動が完了したら、[設定] の下の [プラグイン] (プラグイン リスト) を再度開き、右側の [インストール済み] (インストールされたプラグイン) をクリックします。リストに actiBPM が表示されている場合は、次のように正常にインストールされたことを意味します。形:

次のコースでは、このプロセス デザイナーを Activiti プロセス設計に使用します。

3.3 Activiti のデータベースのサポート

Activiti は実行時にデータベースのサポートを必要とし、25 のテーブルを使用してプロセス定義ノードの内容をデータベース テーブルに読み取り、後で使用できるようにします。

3.3.1 Activiti がサポートするデータベース

activiti がサポートするデータベースとバージョンは次のとおりです。

3.3.2 MySQL でのテーブルの生成

3.3.2.1 データベースの作成

mysql データベース アクティビティを作成します (任意の名前)。

CREATE DATABASE activiti DEFAULT CHARACTER SET utf8;

3.3.2.2 Java コードを使用したテーブルの生成

  • Javaプロジェクトを作成する

アイデアを使用して、activiti01 という名前の Java Maven プロジェクトを作成します。

  • Maven 依存関係の座標を追加 (jar パッケージ)

まず、ProcessEngine に必要な次のような jar パッケージを Java プロジェクトに追加する必要があります。

  1. アクティビティ-エンジン-7.0.0.beta1.jar
  2. activiti が依存する jar パッケージ: mybatis、alf4j、log4j など。
  3. アクティビティが依存する Spring パッケージ
  4. mysqlデータベースドライバー
  5. サードパーティのデータ接続プール dbcp
  6. 単体テスト-junit-4.12.jar

Maven を使用してプロジェクトを構築するため、これらの jar に対応する座標を pom.xml ファイルにインポートする必要があります。

完全な依存関係は次のとおりです。

<properties>
    <slf4j.version>1.6.6</slf4j.version>
    <log4j.version>1.2.12</log4j.version>
    <activiti.version>7.0.0.Beta1</activiti.version>
</properties>
<dependencies>
    <dependency>
        <groupId>org.activiti</groupId>
        <artifactId>activiti-engine</artifactId>
        <version>${activiti.version}</version>
    </dependency>
    <dependency>
        <groupId>org.activiti</groupId>
        <artifactId>activiti-spring</artifactId>
        <version>${activiti.version}</version>
    </dependency>
    <!-- bpmn 模型处理 -->
    <dependency>
        <groupId>org.activiti</groupId>
        <artifactId>activiti-bpmn-model</artifactId>
        <version>${activiti.version}</version>
    </dependency>
    <!-- bpmn 转换 -->
    <dependency>
        <groupId>org.activiti</groupId>
        <artifactId>activiti-bpmn-converter</artifactId>
        <version>${activiti.version}</version>
    </dependency>
    <!-- bpmn json数据转换 -->
    <dependency>
        <groupId>org.activiti</groupId>
        <artifactId>activiti-json-converter</artifactId>
        <version>${activiti.version}</version>
    </dependency>
    <!-- bpmn 布局 -->
    <dependency>
        <groupId>org.activiti</groupId>
        <artifactId>activiti-bpmn-layout</artifactId>
        <version>${activiti.version}</version>
    </dependency>
    <!-- activiti 云支持 -->
    <dependency>
        <groupId>org.activiti.cloud</groupId>
        <artifactId>activiti-cloud-services-api</artifactId>
        <version>${activiti.version}</version>
    </dependency>
    <!-- mysql驱动 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.40</version>
    </dependency>
    <!-- mybatis -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.5</version>
    </dependency>
    <!-- 链接池 -->
    <dependency>
        <groupId>commons-dbcp</groupId>
        <artifactId>commons-dbcp</artifactId>
        <version>1.4</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
    <!-- log start -->
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>${log4j.version}</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>${slf4j.version}</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>${slf4j.version}</version>
    </dependency>
</dependencies>
  • log4j ログ構成を追加

ログを設定できる log4j ログ パッケージを使用します。

リソースの下に log4j.properties を作成します

# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE debug info warn error fatal
log4j.rootCategory=debug, CONSOLE, LOGFILE
# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE
# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r[%15.15t] %-5p %30.30c %x - %m\n
# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=f:\act\activiti.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r[%15.15t] %-5p %30.30c %x - %m\n
  • アクティビティ設定ファイルを追加する

mysql テーブルを作成するには、activiti が提供するデフォルトの方法を使用します。

デフォルトのメソッドの要件は、 resource の下にactiviti.cfg.xmlファイル。 注: Activiti のソース コードは、固定ディレクトリ内の固定のファイル名でファイルを読み取るように設定されているため、デフォルトのメソッドのディレクトリとファイル名は変更できません。 。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
                    http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/contex
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
</beans>
  • activiti.cfg.xml で設定します。

デフォルトのメソッドは中央のactiviti.cfg.xmlBean の名前である必要がありprocessEngineConfiguration、名前は変更できません

ここには 2 つの構成方法があります。1 つはデータ ソースを個別に構成する方法、もう 1 つはデータ ソースを個別に構成しない方法です。

1. 直接設定processEngineConfiguration

processEngineConfigurationデータベースの作成に使用されProcessEngine、データベースの作成ProcessEngine時に。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                    http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/contex
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
    <!-- 默认id对应的值 为processEngineConfiguration -->
    <!-- processEngine Activiti的流程引擎 -->
    <bean id="processEngineConfiguration"
          class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
        <property name="jdbcDriver" value="com.mysql.jdbc.Driver"/>
        <property name="jdbcUrl" value="jdbc:mysql:///activiti"/>
        <property name="jdbcUsername" value="root"/>
        <property name="jdbcPassword" value="123456"/>
        <!-- activiti数据库表处理策略 -->
        <property name="databaseSchemaUpdate" value="true"/>
    </bean>
</beans>

2. データソースを設定したら、次processEngineConfigurationを参照してください。

まずデータソースを設定します

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                    http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/contex
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!-- 这里可以使用 链接池 dbcp-->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql:///activiti" />
        <property name="username" value="root" />
        <property name="password" value="123456" />
        <property name="maxActive" value="3" />
        <property name="maxIdle" value="1" />
    </bean>

    <bean id="processEngineConfiguration"
          class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
        <!-- 引用数据源 上面已经设置好了-->
        <property name="dataSource" ref="dataSource" />
        <!-- activiti数据库表处理策略 -->
        <property name="databaseSchemaUpdate" value="true"/>
    </bean>
</beans>
  • テーブルを生成するJavaクラス記述プログラム

テスト クラスを作成し、activiti のツール クラスを呼び出し、acitivti に必要なデータベース テーブルを生成します。

activiti が提供するツール クラスを直接使用すると、ProcessEnginesデフォルトでクラスパスの下のactiviti.cfg.xmlファイルが読み取られ、その中のデータベース構成が読み込まれ、 が作成されProcessEngine、作成時にテーブルが自動的に作成されますProcessEngine

コードは以下のように表示されます:

package com.itheima.activiti01.test;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.junit.Test;

public class TestDemo {
    /**
     * 生成 activiti的数据库表
     */
    @Test
    public void testCreateDbTable() {
        //使用classpath下的activiti.cfg.xml中的配置创建processEngine
  ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
  System.out.println(processEngine);
    }
}

例証します:

  • activiti.cfg.xml上記のプログラム セグメントを実行してアクティビティ テーブルの作成を完了し、のパラメータの値を変更してdatabaseSchemaUpdateさまざまなデータ テーブル処理戦略を実装します。
  • 上記のメソッドgetDefaultProcessEngineメソッドを実行すると、activiti.cfg.xmlその中から固定の名前を見つけますprocessEngineConfiguration

テスト プログラムの実行中、アイデア コンソールは、プログラムがデータ テーブルを作成していることを示す次のようなログを出力します。赤い線の内容に注意してください。

実行が完了したら、データベースを確認し、25 個のテーブルを作成します。結果は次のとおりです。

この時点で、アクティビティの実行に必要なデータベースとテーブルの作成が完了しました。

3.4 テーブル構造の概要

3.4.1 テーブルの命名規則と機能

作成したテーブルを見ると、Activiti のテーブルはすべてACT_で始まっている。

2 番目の部分は、テーブルの目的を示す 2 文字の指定です。目的はサービスのAPIにも対応します。

  • ACT_RE: 「RE」はリポジトリを意味します。このプレフィックスが付いたテーブルには、プロセス定義とプロセスの静的リソース (イメージ、ルールなど) が含まれます。
  • ACT_RU: 「RU」はランタイムを意味します。これらのランタイム テーブルには、プロセス インスタンス、タスク、変数、非同期タスクなどの実行データが含まれます。Activiti はプロセス インスタンスの実行中にのみこれらのデータを保存し、プロセスの終了時にこれらのレコードを削除します。このようにして、ランタイム テーブルを常に小さく高速にすることができます。
  • ACT_HI: 「HI」は歴史を意味します。これらのテーブルには、履歴プロセス インスタンス、変数、タスクなどの履歴データが含まれています。
  • ACT_GE: GEは一般を意味します。さまざまなシナリオで使用される共通データ
3.4.2 アクティビティデータテーブルの導入

画像-20230515095521896

4、Activitiクラス関係図

以上で、Activiti データベース テーブルの生成が完了しました。Java コードでは、Activiti のツール クラスを呼び出します。Activiti のクラス関係を理解し​​ましょう。

4.1 クラス図

新しいバージョンでは、両方の Service が削除されているIdentityServiceことが実験によりわかりました。FormService

したがって、これら 2 つのサービスについては後で説明しませんが、古いバージョンでもこれら 2 つのサービスが存在するため、学生は理解する必要があります。

4.2 activiti.cfg.xml

Activiti のエンジン設定ファイルには、ProcessEngineConfiguration定義、データ ソース定義、トランザクション マネージャーなどが含まれます。このファイルは実際には Spring 設定ファイルです。

4.3 プロセスエンジン構成クラス

プロセス エンジンの構成クラス ( ProcessEngineConfiguration) を使用してProcessEngineConfigurationワークフロー エンジンを作成できますProceccEngine。一般的に使用される 2 つの方法は次のとおりです。

4.3.1 スタンドアロンのプロセスエンジン構成

StandaloneProcessEngineConfigurationActiviti単独で実行して を作成するとProcessEngineトランザクションActivitiが単独で処理されます。

設定ファイルの方法:

通常、activiti.cfg.xmlIDprocessEngineConfigurationが。

以下のような方法:

<bean id="processEngineConfiguration"
          class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
        <!--配置数据库相关的信息-->
        <!--数据库驱动-->
        <property name="jdbcDriver" value="com.mysql.jdbc.Driver"/>
        <!--数据库链接-->
        <property name="jdbcUrl" value="jdbc:mysql:///activiti"/>
        <!--数据库用户名-->
        <property name="jdbcUsername" value="root"/>
        <!--数据库密码-->
        <property name="jdbcPassword" value="123456"/>
        <!--actviti数据库表在生成时的策略  true - 如果数据库中已经存在相应的表,那么直接使用,如果不存在,那么会创建-->
        <property name="databaseSchemaUpdate" value="true"/>
    </bean>

接続プールに参加することもできます。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                    http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/contex
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql:///activiti"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
        <property name="maxActive" value="3"/>
        <property name="maxIdle" value="1"/>
    </bean>
    <!--在默认方式下 bean的id  固定为 processEngineConfiguration-->
    <bean id="processEngineConfiguration"
          class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
        <!--引入上面配置好的 链接池-->
        <property name="dataSource" ref="dataSource"/>
        <!--actviti数据库表在生成时的策略  true - 如果数据库中已经存在相应的表,那么直接使用,如果不存在,那么会创建-->
        <property name="databaseSchemaUpdate" value="true"/>
    </bean>
</beans>
4.3.2 SpringProcessEngineConfiguration

Spring との統合を通じてorg.activiti.spring.SpringProcessEngineConfiguration

Spring と Activiti の統合構成ファイルを作成します。

activity-spring.cfg.xml(名前は変更可能です)

<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
   xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
      http://www.springframework.org/schema/mvc
      http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
      http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-3.1.xsd
      http://www.springframework.org/schema/aop
      http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
      http://www.springframework.org/schema/tx
      http://www.springframework.org/schema/tx/spring-tx-3.1.xsd ">
   <!-- 工作流引擎配置bean -->
   <bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
      <!-- 数据源 -->
      <property name="dataSource" ref="dataSource" />
      <!-- 使用spring事务管理器 -->
      <property name="transactionManager" ref="transactionManager" />
      <!-- 数据库策略 -->
      <property name="databaseSchemaUpdate" value="drop-create" />
      <!-- activiti的定时任务关闭 -->
     <property name="jobExecutorActivate" value="false" />
   </bean>
   <!-- 流程引擎 -->
   <bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
      <property name="processEngineConfiguration" ref="processEngineConfiguration" />
   </bean>
   <!-- 资源服务service -->
   <bean id="repositoryService" factory-bean="processEngine"
      factory-method="getRepositoryService" />
   <!-- 流程运行service -->
   <bean id="runtimeService" factory-bean="processEngine"
      factory-method="getRuntimeService" />
   <!-- 任务管理service -->
   <bean id="taskService" factory-bean="processEngine"
      factory-method="getTaskService" />
   <!-- 历史管理service -->
   <bean id="historyService" factory-bean="processEngine" factory-method="getHistoryService" />
   <!-- 用户管理service -->
   <bean id="identityService" factory-bean="processEngine" factory-method="getIdentityService" />
   <!-- 引擎管理service -->
   <bean id="managementService" factory-bean="processEngine" factory-method="getManagementService" />
   <!-- 数据源 -->
   <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
      <property name="driverClassName" value="com.mysql.jdbc.Driver" />
      <property name="url" value="jdbc:mysql://localhost:3306/activiti" />
      <property name="username" value="root" />
      <property name="password" value="mysql" />
      <property name="maxActive" value="3" />
      <property name="maxIdle" value="1" />
   </bean>
   <!-- 事务管理器 -->
   <bean id="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
      <property name="dataSource" ref="dataSource" />
   </bean>
   <!-- 通知 -->
   <tx:advice id="txAdvice" transaction-manager="transactionManager">
      <tx:attributes></tx:attributes>
          <!-- 传播行为 -->
          <tx:method name="save*" propagation="REQUIRED" />
          <tx:method name="insert*" propagation="REQUIRED" />
          <tx:method name="delete*" propagation="REQUIRED" />
          <tx:method name="update*" propagation="REQUIRED" />
          <tx:method name="find*" propagation="SUPPORTS" read-only="true" />
          <tx:method name="get*" propagation="SUPPORTS" read-only="true" />
       </tx:attributes>
   </tx:advice>
   <!-- 切面,根据具体项目修改切点配置 -->
   <aop:config proxy-target-class="true">
      <aop:advisor advice-ref="txAdvice"  pointcut="execution(* com.itheima.ihrm.service.impl.*.(..))"* />
  </aop:config>
</beans>

作成processEngineConfiguration

ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml")

上記のコード要件にはBean がactiviti.cfg.xml必要ですprocessEngineConfiguration

次のメソッドを使用して Bean の名前を変更することもできます。

ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(String resource, String beanName);

4.4 ワークフローエンジンの作成

各サービスインターフェースを作成することで、ファサードインターフェースに相当するワークフローエンジン(ProcessEngine)がProcessEngineConfiguration作成されます。processEngineProcessEngine

4.4.1 デフォルトの作成方法

ファイル名とパスは固定されておりactiviti.cfg.xmlactiviti.cfg.xmlファイル内に設定がprocessEngineConfiguration含ま、次のコードを使用して作成できますprocessEngine

//直接使用工具类 ProcessEngines,使用classpath下的activiti.cfg.xml中的配置创建processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
System.out.println(processEngine);
4.4.2 一般的な作成方法
//先构建ProcessEngineConfiguration
ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml");
//通过ProcessEngineConfiguration创建ProcessEngine,此时会创建数据库
ProcessEngine processEngine = configuration.buildProcessEngine();
4.5 サービスサービスインターフェース

サービスは、ワークフローの展開、実行、管理のためにワークフロー エンジンによって提供されるサービス インターフェイスであり、これらのインターフェイスを運用サービスに対応するデータ テーブルとして使用します。

4.5.1 サービスの作成方法

ProcessEngine を通じてサービスを作成する

方法は次のとおりです。

RuntimeService runtimeService = processEngine.getRuntimeService();
RepositoryService repositoryService = processEngine.getRepositoryService();
TaskService taskService = processEngine.getTaskService();

4.5.2 サービスの概要

簡単な紹介:

  • リポジトリサービス

これは、Activiti のリソース管理クラスであり、プロセス リリース パッケージとプロセス定義を管理および制御するための操作を提供します。ワークフロー モデリング ツールで設計されたビジネス フローチャートは、このサービスを使用してプロセス定義ファイルの内容をコンピューターに展開する必要があります。

プロセス定義の展開に加えて、次のことも実行できます。 エンジン内のリリース パッケージとプロセス定義をクエリします。

すべておよび特定のプロセス定義に対応するリリース パッケージを一時停止またはアクティブ化します。一時停止とは、いかなる操作も実行できなくなることを意味し、アクティブ化とは、対応する逆の操作です。配布パッケージに含まれるファイルやエンジンによって自動的に生成されるフローチャートなど、さまざまなリソースへのアクセス。

プロセス定義の pojo バージョンを取得します。これは、xml ではなく java を介してプロセスを解析するために使用できます。

  • ランタイムサービス

Activiti のプロセス運用管理クラス。このサービス クラスからプロセスの実行に関する多くの情報を取得できます。

  • タスクサービス

Activiti のタスク管理クラス。タスク情報はこのクラスから取得できます。

  • 歴史サービス

Activiti の履歴管理クラスは履歴情報をクエリできます。プロセスが実行されると、エンジンはプロセス インスタンスの開始時刻、タスクの参加者、完了までの時間などの大量のデータを (構成に従って) 保存します。タスクや各プロセスインスタンスの実行パスなどが待機します。このサービスは主にクエリ機能を通じてこれらのデータを取得します。

  • 管理サービス

Activiti のエンジン管理クラスは、Activiti プロセス エンジンの管理およびメンテナンス機能を提供します。これらの機能は、ワークフロー駆動のアプリケーションでは使用されず、主に Activiti システムの日常的なメンテナンスに使用されます。

5. Activiti の使用を開始する

この章では、Activiti ワークフローを作成してプロセスを開始しましょう。

Activiti ワークフローの作成には主に次の手順が含まれます。

  • BPMN 仕様に従ってプロセスを定義し、プロセス定義ツールを使用してプロセス全体をプロセス シンボルで記述します。
  • プロセスをデプロイし、描画したプロセス定義ファイルをデータベースにロードし、テーブル データを生成します
  • プロセスを開始し、Java コードを使用してデータベース テーブルの内容を操作します。

5.1 プロセスシンボル

BPMN 2.0 は、Business Process Modeling Notation 2.0 の頭字語です。

これは、非営利団体である Business Process Management Initiative によって作成され、継続的に開発されています。その兆候として、BPMN 2.0 は、ビジネス プロセス設計のフローチャートを明確にするためにいくつかの表記法を使用する一連の表記法仕様であり、ビジネス モデリング時のコミュニケーション効率を向上させることができます。

現在、BPMN2.0 が最新バージョンであり、BPM のコンテキストでのレイアウトとビジュアル コミュニケーションに使用されます。

次に、まずプロセス設計でよく使われる記号を理解しましょう。

BPMN2.0 の基本的な準拠には主に次のものが含まれます。

イベント イベント

活動活動

アクティビティとは、仕事またはタスクを表す一般的な用語です。アクティビティは、タスクまたは現在のプロセスのサブプロセスにすることができます。次に、アクティビティにさまざまなタイプを指定することもできます。一般的なアクティビティは次のとおりです。

ゲートウェイゲートウェイ

ゲートウェイは意思決定を処理するために使用されます。よく使用されるゲートウェイがいくつかあり、理解しておく必要があります。

専用ゲートウェイ(x)

- パスは 1 つだけ選択されます。ゲートウェイに対してプロセスが実行されると、出力フローの順序に従って 1 つずつ計算され、条件の計算結果が true の場合、現在のゲートウェイの出力フローを継続して実行します。

  • 複数のルートが true と評価された場合、最初の true ルートが実行されます。どのゲートウェイも true と評価されない場合、エンジンは例外をスローします。
  • 専用ゲートウェイは条件付きシーケンスフローと併用する必要があります。default 属性でデフォルトシーケンスフローを指定します。すべての条件が満たされない場合はデフォルトシーケンスフローが実行されます。

パラレルゲートウェイ(+)

- すべてのパスが同時に選択されます

  • 分割 - すべての出力シーケンス フローを並列で実行し、シーケンス フローごとに並列実行ラインを作成します。
  • マージ - 並列ゲートウェイから分割されて実行されるすべての行は、すべての行が実行されるまでここで待機してから、下方向に実行を続けます。

包括的なゲートウェイ(+)

-- 複数行の同時実行やゲートウェイでの条件設定も可能

  • 分割 - 各行の式を評価し、式が true と評価された場合、平行線を作成して実行を継続します。
  • マージ - 並列ゲートウェイから分割されて実行されるすべての行は、すべての行が実行されるまでここで待機してから、下方向に実行を続けます。

イベントゲートウェイ(+)

—— 中間キャプチャ イベント用に特別に設定されており、複数の出力ストリームが複数の異なる中間キャプチャ イベントを指すことができます。イベントゲートウェイに対してプロセスが実行されるとき、プロセスは待機状態にあり、待機状態をアクティブ状態に変換するにはイベントがスローされるまで待つ必要があります。

フローからフローへ

フローは 2 つのプロセス ノードを接続するワイヤーです。一般的な流れの方向は次のとおりです。

5.2 プロセスデザイナーの使用

Activiti-Designer の用途
パレット

idea にプラグインをインストールすると使用でき、製図ボードには次のノードが含まれます。

  • 接続—接続
  • イベント—イベント
  • タスク—タスク
  • ゲートウェイ—ゲートウェイ
  • コンテナ—コンテナ
  • 境界イベント - 境界イベント
  • 中間イベント- - 中間イベント

フローチャートを設計したら、.bpmn ファイルを保存して生成します。

新しいプロセス (IDEA ツール)

New -> BpmnFile図に示すように、まずグラフィックが保存されているディレクトリを選択し (リソースの下の bpmn ディレクトリを選択)、メニューをクリックします。

以下の図に示すようなボックスが表示されます。出張承認プロセスを示すために「evection」と入力します。

イベントに名前を付けると (デフォルトの拡張子は bpmn)、図に示すようにプロセス設計ページが表示されます。

左側の領域が描画領域、右側の領域がパレット領域です

製図板の要素をマウスでクリックして左側に描画します

描画プロセス

スケートボードを使用してプロセスを描画し、アイコンを右から左の描画ボードにドラッグすると、最終的な効果は次のようになります。

プロセス定義キーを指定します

プロセス定義キーはプロセス定義の識別子であり、プロセスのキーはプロパティ ビューで確認できます。

指名されたタスクリーダー

プロパティ ビューで各タスク ノードの担当者を指定します。例: 出張申請書の記入担当者は zhangsan です。

  • マネージャーの承認担当者は jerry です
  • 部長の承認責任者はジャックです
  • 財務承認担当者がバラされました

6. プロセス操作

6.1 プロセスの定義

概要

プロセス定義は、bpmn2.0規格に従ってオフラインでビジネスプロセスを記述するもので、通常はビジネスプロセスをモデル化するアイデアのプラグインを使用します。

このアイデアの下でデザイナーを使用してプロセスを描画すると、.bpmn と .png の 2 つのファイルが生成されます。

.bpmn ファイル

activiti-desinger を使用してビジネス プロセスを設計すると、.bpmn ファイルが生成され、その上に bpmn ファイルが作成されます。

BPMN 2.0 ルート ノードは定義ノードです。この要素では、複数のプロセス定義を定義できます (ただし、開発プロセス中のメンテナンスの困難を軽減するために、各ファイルにプロセス定義を 1 つだけ含めることをお勧めします)。

定義要素には、少なくとも xmlns と targetNamespace の宣言が含まれている必要があることに注意してください。targetNamespace は任意の値にすることができ、プロセス インスタンスを分類するために使用されます。

  • プロセス定義部分: プロセスの各ノードの説明とノード間のプロセス フローを定義します。
  • プロセスレイアウト定義:フローチャート上のプロセスの各ノードの位置座標などの情報を定義します。
.png画像ファイルを生成する

IDEAツールの動作モード

1. ファイルのサフィックスを XML に変更します。

まず、以下に示すように、evection.bpmn ファイルの名前を evection.xml に変更します。

evection.xml が変更される前の bpmn ファイルの効果は次のとおりです。

2. デザイナーを使用して .xml ファイルを開きます

evection.xml ファイルを右クリックして [ダイアグラム] メニューを選択し、次に [ダイアグラム] メニューを選択します。Show BPMN2.0 Designer…

3. 開いているファイルを表示する

開くと図のように文字化けが発生します。

4.中国語の文字化けを解決する

1. [設定] を開き、[ファイル エンコーディング] を見つけて、すべてのエンコーディング オプションで [UTF-8] を選択します。

2. IDEA インストール パスを開き、次のインストール ディレクトリを見つけます。

インストールしたバージョンによって異なりますが、私は 64 ビットのアイデアを使用しているため、idea64.exe.vmoptionsファイルの最後の行にコマンドを追加します。-Dfile.encoding=UTF-8

次のように:

スペースを入れないように注意してください。スペースを入れないと、IDEA を再起動したときに IDEA が開かなくなり、その後 IDEA を再起動します。

-Dfile.encoding=UTF-8上記の方法を完了しても文字化けが発生する場合は、図に示すように、別のファイルを変更し、ファイルの末尾に: を追加して、 idea を再起動します。

最後に、evection.xml ファイルを右クリックして [ダイアグラム] メニューを選択し、Show BPMN2.0 Designer…図に示すように、生成された図を表示することを選択します。

ここまでで文字化け問題は解決しました

5.画像ファイルとしてエクスポート

小さなアイコンをクリックしてExport To File次のウィンドウを開き、ファイル名と拡張子を入力し、画像を保存する場所を選択します。

次に、png ファイルをリソースの下の bpmn ディレクトリにコピーし、evection.xml の名前を evection.bpmn に変更します。

6.2 プロセス定義の展開

概要

デザイナーで上で定義したプロセスを Activiti データベースにデプロイすることは、プロセス定義のデプロイメントです。

Activiti の API を呼び出して、プロセス定義の bpmn ファイルと png ファイルを 1 つずつ Activiti に追加してデプロイするか、2 つのファイルを zip パッケージに圧縮してデプロイします。

単一ファイルの展開

bpmn ファイルと png 画像ファイルをそれぞれ展開します。

public class ActivitiDemo {
    /**
     * 部署流程定义
     */
    @Test
    public void testDeployment(){
//        1、创建ProcessEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        2、得到RepositoryService实例
        RepositoryService repositoryService = processEngine.getRepositoryService();
//        3、使用RepositoryService进行部署
        Deployment deployment = repositoryService.createDeployment()
                .addClasspathResource("bpmn/evection.bpmn") // 添加bpmn资源
                .addClasspathResource("bpmn/evection.png")  // 添加png资源
                .name("出差申请流程")
                .deploy();
//        4、输出部署信息
        System.out.println("流程部署id:" + deployment.getId());
        System.out.println("流程部署名称:" + deployment.getName());
    }
}

この操作を実行すると、Activiti は上記のコードで指定された bpm ファイルと画像ファイルを Activiti データベースに保存します。

圧縮パッケージの展開方法

圧縮しevection.bpmnevection.pngzipパッケージに圧縮します。

@Test
 public void deployProcessByZip() {
  // 定义zip输入流
  InputStream inputStream = this
    .getClass()
    .getClassLoader()
    .getResourceAsStream(
      "bpmn/evection.zip");
  ZipInputStream zipInputStream = new ZipInputStream(inputStream);
  // 获取repositoryService
  RepositoryService repositoryService = processEngine
    .getRepositoryService();
  // 流程部署
  Deployment deployment = repositoryService.createDeployment()
    .addZipInputStream(zipInputStream)
    .deploy();
  System.out.println("流程部署id:" + deployment.getId());
  System.out.println("流程部署名称:" + deployment.getName());
 }

この操作を実行すると、Activiti は上記のコードで指定された bpm ファイルと画像ファイルを Activiti データベースに保存します。

動作データシート

プロセス定義のデプロイ後の操作アクティビティに関する 3 つのテーブルは次のとおりです。

  • act_re_deploymentプロセス定義デプロイメント テーブル、各デプロイメントによりレコードが追加されます
  • act_re_procdefプロセス定義テーブル。新しいプロセス定義をデプロイするたびに、このテーブルにレコードが追加されます。
  • act_ge_bytearrayプロセスリソーステーブル

次に、どのようなデータが書き込まれるかを見てみましょう。

SELECT * FROM act_re_deployment #流程定义部署表,记录流程部署信息

結果:

SELECT * FROM act_re_procdef #流程定义表,记录流程定义信息

結果:

KEY フィールドは、さまざまなプロセスを一意に識別するために使用されるキーワードであることに注意してください。

SELECT * FROM act_ge_bytearray #资源表

結果:

知らせ:

act_re_deployment1act_re_procdef対多の関係では、デプロイメントはプロセス デプロイメント テーブルにレコードを生成しますが、デプロイメントは複数のプロセス定義をデプロイすることができ、各プロセス定義はプロセス定義テーブルにレコードを生成します。各プロセス定義にはact_ge_bytearray、bpmn と png という 2 つのリソース レコードがあります。

提案: 一度に 1 つのプロセスをデプロイして、デプロイメント テーブルとプロセス定義テーブルが 1 対 1 の関係になるようにします。これは、プロセスのデプロイメントとプロセス定義の情報を読み取るのに便利です。

6.3 プロセスインスタンスの起動

Activitiにプロセス定義を展開すると、ワークフローで業務プロセスを管理できるようになり、上記で展開した出張申請プロセスが利用できるようになります。

この処理において、処理を開始するということは、出張申請フォームを新規に起動することを意味しており、JavaクラスとJavaオブジェクトの関係に相当します。クラスを定義した後、newでオブジェクトを作成する必要があります。複数のオブジェクトを新規作成できます。出張申請プロセスの場合、Zhang San は出張申請フォームを開始するときにプロセス インスタンスを開始する必要があり、出張申請フォームが出張オーダーを開始するときにプロセス インスタンスを開始する必要があります。

コードは以下のように表示されます:

    /**
     * 启动流程实例
     */
    @Test
    public void testStartProcess(){
//        1、创建ProcessEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        2、获取RunTimeService
        RuntimeService runtimeService = processEngine.getRuntimeService();
//        3、根据流程定义Id启动流程
        ProcessInstance processInstance = runtimeService
                .startProcessInstanceByKey("myEvection");
//        输出内容
        System.out.println("流程定义id:" + processInstance.getProcessDefinitionId());
        System.out.println("流程实例id:" + processInstance.getId());
        System.out.println("当前活动Id:" + processInstance.getActivityId());
    }

出力は次のとおりです。

動作データシート

  • act_hi_actinstプロセスインスタンスの実行履歴
  • act_hi_identitylinkプロセス参加ユーザ履歴情報
  • act_hi_procinstプロセスインスタンスの履歴情報
  • act_hi_taskinstプロセスタスクの履歴情報
  • act_ru_executionプロセス実行情報
  • act_ru_identitylinkプロセスの参加ユーザー情報
  • act_ru_taskタスク情報

6.4 タスククエリ

プロセスが開始された後、タスクの担当者は現在処理する必要があるタスクをクエリできます。クエリされたタスクはすべてユーザーの To Do タスクです。

/**
     * 查询当前个人待执行的任务
      */
    @Test
    public void testFindPersonalTaskList() {
//        任务负责人
        String assignee = "zhangsan";
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        创建TaskService
        TaskService taskService = processEngine.getTaskService();
//        根据流程key 和 任务负责人 查询任务
        List<Task> list = taskService.createTaskQuery()
                .processDefinitionKey("myEvection") //流程Key
                .taskAssignee(assignee)//只查询该任务负责人的任务
                .list();

        for (Task task : list) {

            System.out.println("流程实例id:" + task.getProcessInstanceId());
            System.out.println("任务id:" + task.getId());
            System.out.println("任务负责人:" + task.getAssignee());
            System.out.println("任务名称:" + task.getName());

        }
    }

出力は次のとおりです。

流程实例id:2501
任务id:2505
任务负责人:zhangsan
任务名称:创建出差申请

6.5 プロセスタスクの処理

タスク リーダーは、To Do タスクを照会し、処理するタスクを選択し、タスクを完了します。

// 完成任务
    @Test
    public void completTask(){
//        获取引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        获取taskService
        TaskService taskService = processEngine.getTaskService();

//        根据流程key 和 任务的负责人 查询任务
//        返回一个任务对象
        Task task = taskService.createTaskQuery()
                .processDefinitionKey("myEvection") //流程Key
                .taskAssignee("zhangsan")  //要查询的负责人
                .singleResult();

//        完成任务,参数:任务id
        taskService.complete(task.getId());
    }

6.6 プロセス定義情報の問い合わせ

プロセス定義、プロセス展開、プロセス定義バージョンなどのプロセス関連情報のクエリ

    /**
     * 查询流程定义
     */
    @Test
    public void queryProcessDefinition(){
        //        获取引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        repositoryService
        RepositoryService repositoryService = processEngine.getRepositoryService();
//        得到ProcessDefinitionQuery 对象
        ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
//          查询出当前所有的流程定义
//          条件:processDefinitionKey =evection
//          orderByProcessDefinitionVersion 按照版本排序
//        desc倒叙
//        list 返回集合
        List<ProcessDefinition> definitionList = processDefinitionQuery.processDefinitionKey("myEvection")
                .orderByProcessDefinitionVersion()
                .desc()
                .list();
//      输出流程定义信息
        for (ProcessDefinition processDefinition : definitionList) {
            System.out.println("流程定义 id="+processDefinition.getId());
            System.out.println("流程定义 name="+processDefinition.getName());
            System.out.println("流程定义 key="+processDefinition.getKey());
            System.out.println("流程定义 Version="+processDefinition.getVersion());
            System.out.println("流程部署ID ="+processDefinition.getDeploymentId());
        }

    }

出力結果:

流程定义id:myEvection:1:4
流程定义名称:出差申请单
流程定义key:myEvection
流程定义版本:1

6.7 プロセスの削除

public void deleteDeployment() {
  // 流程部署id
  String deploymentId = "1";

    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    // 通过流程引擎获取repositoryService
  RepositoryService repositoryService = processEngine
    .getRepositoryService();
  //删除流程定义,如果该流程定义已有流程实例启动则删除时出错
  repositoryService.deleteDeployment(deploymentId);
  //设置true 级联删除流程定义,即使该流程有流程实例启动也可以删除,设置为false非级别删除方式,如果流程
  //repositoryService.deleteDeployment(deploymentId, true);
 }

例証します:

  • repositoryServiceを使用してプロセス定義を削除すると、履歴テーブルの情報は削除されません
  • プロセス定義配下に実行中のプロセスがない場合は、通常の手順で削除できます。

プロセス定義の下にすでに実行中のプロセスがある場合は、共通削除を使用してエラーを報告し、カスケード削除メソッドを使用してすべてのプロセスおよび関連レコードを削除します。

最初に未完了のプロセスノードを削除し、最後にプロセス定義情報を完全に削除します

プロジェクト開発におけるカスケード削除操作は、通常、スーパー管理者のみが実行できます。

6.8 プロセスリソースのダウンロード

これで、プロセス リソース ファイルがデータベースにアップロードされました。他のユーザーがこれらのリソース ファイルを表示したい場合は、データベースからローカルにリソース ファイルをダウンロードできます。

解決策は次のとおりです。

  • Jdbc は BLOB タイプと CLOB タイプのデータを読み取り、ファイル ディレクトリに保存します。
  • Activiti の API を使用して達成する

commons-io.jar を使用して IO 操作を解決する

commons-io依存パッケージの導入

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>

プロセス定義オブジェクトを通じてプロセス定義リソースを取得し、bpmn と png を取得します

import org.apache.commons.io.IOUtils;

@Test
    public void deleteDeployment(){
//        获取引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        获取repositoryService
        RepositoryService repositoryService = processEngine.getRepositoryService();
//        根据部署id 删除部署信息,如果想要级联删除,可以添加第二个参数,true
        repositoryService.deleteDeployment("1");
    }

    public void  queryBpmnFile() throws IOException {
//        1、得到引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        2、获取repositoryService
        RepositoryService repositoryService = processEngine.getRepositoryService();
//        3、得到查询器:ProcessDefinitionQuery,设置查询条件,得到想要的流程定义
        ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
                .processDefinitionKey("myEvection")
                .singleResult();
//        4、通过流程定义信息,得到部署ID
        String deploymentId = processDefinition.getDeploymentId();
//        5、通过repositoryService的方法,实现读取图片信息和bpmn信息
//        png图片的流
        InputStream pngInput = repositoryService.getResourceAsStream(deploymentId, processDefinition.getDiagramResourceName());
//        bpmn文件的流
        InputStream bpmnInput = repositoryService.getResourceAsStream(deploymentId, processDefinition.getResourceName());
//        6、构造OutputStream流
        File file_png = new File("d:/evectionflow01.png");
        File file_bpmn = new File("d:/evectionflow01.bpmn");
        FileOutputStream bpmnOut = new FileOutputStream(file_bpmn);
        FileOutputStream pngOut = new FileOutputStream(file_png);
//        7、输入流,输出流的转换
        IOUtils.copy(pngInput,pngOut);
        IOUtils.copy(bpmnInput,bpmnOut);
//        8、关闭流
        pngOut.close();
        bpmnOut.close();
        pngInput.close();
        bpmnInput.close();
    }

例証します:

  • deploymentIdプロセスの ID をデプロイする
  • resource_nameact_ge_bytearrayテーブルの NAME_ 列の値です
  • 使用されるrepositoryServiceメソッドはgetDeploymentResourceNames、指定されたデプロイメント内のすべてのファイルの名前を取得できます。
  • デプロイメント ID とリソース イメージ名を渡すために使用されるrepositoryServiceメソッドは、デプロイメントの下で指定された名前を持つファイルの入力ストリームを取得できます。getResourceAsStream

最後のものは、入力ストリーム内の画像リソースを出力します。

6.9 プロセス履歴情報の表示

プロセス定義が削除された場合でも、プロセス実行の履歴情報は、以前の分析を通じて引き続きアクティビティのact_hi_*関連テーブルに保存されます。したがって、引き続きプロセス実行の履歴情報をクエリでき、HistoryService関連する履歴レコードを を通じて表示できます。

    /**
     * 查看历史信息
     */
    @Test
    public void findHistoryInfo(){
//      获取引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        获取HistoryService
        HistoryService historyService = processEngine.getHistoryService();
//        获取 actinst表的查询对象
        HistoricActivityInstanceQuery instanceQuery = historyService.createHistoricActivityInstanceQuery();
//        查询 actinst表,条件:根据 InstanceId 查询
//        instanceQuery.processInstanceId("2501");
//        查询 actinst表,条件:根据 DefinitionId 查询
        instanceQuery.processDefinitionId("myEvection:1:4");
//        增加排序操作,orderByHistoricActivityInstanceStartTime 根据开始时间排序 asc 升序
        instanceQuery.orderByHistoricActivityInstanceStartTime().asc();
//        查询所有内容
        List<HistoricActivityInstance> activityInstanceList = instanceQuery.list();
//        输出
        for (HistoricActivityInstance hi : activityInstanceList) {
            System.out.println(hi.getActivityId());
            System.out.println(hi.getActivityName());
            System.out.println(hi.getProcessDefinitionId());
            System.out.println(hi.getProcessInstanceId());
            System.out.println("<==========================>");
        }
    }

要約する

基本的な機能の紹介と完了ですが、プロセス インスタンスの一時停止、アクティブ化、プロセス変数などのより高度な機能が必要な場合は、こちらを参照してください。

https://andyoung.blog.csdn.net/article/details/118345330

ワークフローエンジンActivitiとSpring Bootを組み合わせることで開発が容易になります。見てみましょう

https://andyoung.blog.csdn.net/article/details/118372175

出典: https://blog.csdn.net/agonie201218/article/details/118198535

最近のおすすめ記事:

1. 1,000 を超える Java 面接の質問と回答 (2022 年最新バージョン)

2.素晴らしい!Java コルーチンが登場します。

3. Spring Boot 2.x チュートリアル、包括的すぎる!

4.画面を爆発や爆発で埋め尽くさないで、デコレーターモードを試してください。これがエレガントな方法です。

5.最新リリースの「Java 開発マニュアル (松山編)」をすぐにダウンロードしてください!

気分がいいので、「いいね!」+「転送」を忘れないでください!

おすすめ

転載: blog.csdn.net/youanyyou/article/details/130705348