# 工作流扩展

# 开发功能库函数

  1. 使用maven创建jar项目,并编写工作流执行函数 参考pom配置
<project xmlns="http://maven.apache.org/POM/4.0.0"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <artifactId>xxx-workflow-library</artifactId>
   <description>xxx</description>
   <dependencies>
      <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-api</artifactId>
          <scope>provided</scope>
      </dependency>
      <dependency>
          <groupId>com.zondy.mapgis.igs</groupId>
          <artifactId>mapgis-igs-common-core</artifactId>
          <version>${project.version}</version>
          <scope>provided</scope>
      </dependency>
      <!--igs-local为本地依赖-->
      <dependency>
          <groupId>igs-local</groupId>
          <artifactId>mapgis_geoobjects</artifactId>
          <version>1.0.0</version>
          <scope>provided</scope>
      </dependency>
      <dependency>
          <groupId>igs-local</groupId>
          <artifactId>mapgis_geomap</artifactId>
          <version>1.0.0</version>
          <scope>provided</scope>
      </dependency>
      <dependency>
          <groupId>igs-local</groupId>
          <artifactId>mapgis_geodatabase</artifactId>
          <version>1.0.0</version>
          <scope>provided</scope>
      </dependency>
      <dependency>
          <groupId>igs-local</groupId>
          <artifactId>mapgis_geoanalysis</artifactId>
          <version>1.0.0</version>
          <scope>provided</scope>
      </dependency>
   </dependencies>
   <build>
       <plugins>
           <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-assembly-plugin</artifactId>
               <version>3.1.0</version>
               <configuration>
                   <descriptorRefs>
                       <descriptorRef>jar-with-dependencies</descriptorRef>
                   </descriptorRefs>
                   <!--这里不加版本号,因为注册功能时会记住文件名,也方便覆盖更新-->
                   <finalName>${project.artifactId}</finalName>
                   <appendAssemblyId>false</appendAssemblyId>
                   <attach>false</attach>
                   <archive>
                       <manifest>
                           <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                           <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
                       </manifest>
                   </archive>
               </configuration>
               <executions>
                   <execution>
                       <id>make-assembly</id>
                       <phase>package</phase>
                       <goals>
                           <goal>single</goal>
                       </goals>
                   </execution>
               </executions>
           </plugin>
       </plugins>
   </build>
</project>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78

针对框架中已提供的依赖,可以将其设置为provided,减轻工作流插件jar包大小 已提供的依赖包括

   <dependency>
       <groupId>org.slf4j</groupId>
       <artifactId>slf4j-api</artifactId>
       <version>${slf4j.version}</version>
   </dependency>
   <dependency>
       <groupId>igs-local</groupId>
       <artifactId>mapgis_geoobjects</artifactId>
       <version>1.0.0</version>
   </dependency>
   <dependency>
       <groupId>igs-local</groupId>
       <artifactId>mapgis_geomap</artifactId>
       <version>1.0.0</version>
   </dependency>
   <dependency>
       <groupId>igs-local</groupId>
       <artifactId>mapgis_geodatabase</artifactId>
       <version>1.0.0</version>
   </dependency>
   <dependency>
       <groupId>igs-local</groupId>
       <artifactId>mapgis_geoanalysis</artifactId>
       <version>1.0.0</version>
   </dependency>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
  1. 示例maven工程结构 示例maven工程

  2. 使用命令mvn package打包为一个单独的jar

  3. 将jar放到igserver_for_java\workflow\FunctionLibrary\GIS\xxx\jar,启动xxx为新建的目录

  4. 执行igserver_for_java\bin\start-function-library-server-host.bat,启动功能仓库服务,如下图 启动功能仓库服务

# 创建工作流

  1. 打开program下IGSWorkflow.exe, 添加功能仓库配置工具 ,注意可能没有功能仓库设置按钮,这是需要手动添加按钮,将图中按钮拖放到工具条上

    打开自定义窗口

    添加功能仓库配置工具

  2. 配置工作流仓库

    配置工作流仓库

  3. 注册包含功能的jar包

    注册包含功能的jar包

  4. 注册好的文件会在功能仓库里面显示

    注册文件

  5. 右键点击注册好的文件,点击注册功能模块

    注册文件

  6. 右键点击注册好的功能模块,点击注册功能

    注册文件

  7. 新建流程,流程目录的数量固定,不能添加,在系统流程目录中任选一个,右键点击并选择新建流程,新建的流程必须填入流程名称,其它的可以按需填写

    新建流程 新建流程示例

  8. 在新建的流程中添加开始节点与结束节点,并添加功能仓库中第六步注册好的功能。开始节点与结束节点的添加方式为:右键->选择添加节点(结束节点)->鼠标左键按住不放拖拽出一个矩形->创建完成,功能节点可以直接在功能仓库中拖拽出来。将鼠标放在一个节点按住拖拽至另一个节点即可让两节点相连

    添加节点

  9. 编辑流程参数,右键点击第七步创建好的流程,选择编辑流程参数,编辑输入参数与输出参数

    编辑流程参数

  10. 编辑节点属性,双击第八步创建的功能节点,修改节点属性

    编辑节点属性

  11. 执行测试,右键点击第七步新建的流程,选择执行,填入参数,点击确定

    执行测试

  12. 导出工作流模板,测试结果与预期一致后,右键流程,选择导出,并在IGServer Manager中导入该流程

# 工作流的类加载器

使用了类似pf4j的插件化类隔离技术,解决多个工作流库之间的类相互污染,这里使用的策略是插件的类加载器优先,类似tomcat容器的框架与web应用的关系。

${MapGIS_HOME}/igserver_for_java/workflow/FunctionLibrary/GIS文件夹下每个文件夹为一个单独的工作流库,系统为每个工作流库创建一个单独的ClassLoader,该ClassLoader的parent为workflow-host-x.x.x.x.jar进程的ClassLoader。

igserver_for_java
  └── workflow
       └── FunctionLibrary
             └── GIS
                  ├──  Lib1                       #------------ 类加载1
                  │      └── jar
                  │           └── xxx.jar
                  ├──  Lib2                       #------------ 类加载2
                  └──  Libx                       #------------ 类加载x
1
2
3
4
5
6
7
8
9

框架的依赖可以通过打开workflow-host-x.x.x.x.jar文件(Springboot FatJar),查看其依赖的jar包。一定要注意,如果框架内包括的依赖A还需要补充间接依赖B(B为可选依赖,框架中并不包含),一定要在插件中将框架依赖A和间接依赖B一起加到插件中,这是由类加载全盘负责委托机制决定的,即框架依赖的间接依赖B只能框架自己提供,因此需要补充间接依赖B的时候,必须把框架依赖A+间接依赖B一起加进来。