# 工作流扩展
# 开发功能库函数
- 使用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>
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>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
示例maven工程结构
使用命令
mvn package
打包为一个单独的jar将jar放到
igserver_for_java\workflow\FunctionLibrary\GIS\xxx\jar
,启动xxx为新建的目录执行
igserver_for_java\bin\start-function-library-server-host.bat
,启动功能仓库服务,如下图
# 创建工作流
打开program下IGSWorkflow.exe, 添加功能仓库配置工具 ,注意可能没有功能仓库设置按钮,这是需要手动添加按钮,将图中按钮拖放到工具条上
配置工作流仓库
注册包含功能的jar包
注册好的文件会在功能仓库里面显示
右键点击注册好的文件,点击注册功能模块
右键点击注册好的功能模块,点击注册功能
新建流程,流程目录的数量固定,不能添加,在系统流程目录中任选一个,右键点击并选择新建流程,新建的流程必须填入流程名称,其它的可以按需填写
在新建的流程中添加开始节点与结束节点,并添加功能仓库中第六步注册好的功能。开始节点与结束节点的添加方式为:右键->选择添加节点(结束节点)->鼠标左键按住不放拖拽出一个矩形->创建完成,功能节点可以直接在功能仓库中拖拽出来。将鼠标放在一个节点按住拖拽至另一个节点即可让两节点相连
编辑流程参数,右键点击第七步创建好的流程,选择编辑流程参数,编辑输入参数与输出参数
编辑节点属性,双击第八步创建的功能节点,修改节点属性
执行测试,右键点击第七步新建的流程,选择执行,填入参数,点击确定
导出工作流模板,测试结果与预期一致后,右键流程,选择导出,并在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
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一起加进来。