# 外部代码表
为了在流程表单中使用外部代码表,首先要在IDE中新建外部代码表,然后在字段配置CodeTable中选择这个外部代码表。表单运行时流程引擎服务器会向流程messenger发送FIELD_SUGGESTING事件请求数据,messenger有三种方式可以返回外部代码表数据,以下将举例说明,同时您也可参考外部代码表实现。
# 非共享外部代码表
当代码表仅在单个流程中使用的,可通过非共享外部代码表的方式注册到流程messenger上,返回非共享外部代码表数据需要重载getSuggestionData方法来实现
示例 非共享外部代码表
<bean id="sampleMessenger" class="edu.sjtu.messengers.SampleMessenger">
<property name="workflow" value="test_workflow"/>
<property name="secret" value="2ec811b"/>
<!--
缓存时间(毫秒),缺省3600000,最小60000
-->
<property name="timeout" value="600000"/>
<!--
注册所有本流程用到的外部代码表
-->
<property name="codeTables">
<list>
<value>code_table_id</value>
</list>
</property>
</bean>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class SampleMessenger extends AbstractMessenger {
@Override
protected List<? extends CodeItem> getSuggestionData(String code) {
if ("code_table_id".equals(code)) {
List<CodeItemImpl> result = new ArrayList<>();
result.add(new CodeItemImpl("code3", "name3"));
result.add(new CodeItemImpl("code4", "name4"));
return result;
}
return super.getSuggestionData(code);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 共享外部代码表
如果一个代码表被多个流程共用,那么可以通过注册共享外部代码表的方式来实现,在代码上要实现CachableDataBuilder<String, List<? extend CodeItem>>接口的类
<bean id="application" class="edu.sjtu.infoplus.applicationToolkit.InfoPlusApplication" factory-method="defaultApplication">
<property name="service" ref="infoPlusService"/>
<property name="domain" value="sjtu.edu.cn"/>
<property name="messengers">
<list>
<ref bean="sampleMessenger"/>
</list>
</property>
<!--
定义共享外部代码表的Builder
-->
<property name="sharedCodeTableBuilders">
<list>
<bean class="edu.sjtu.messengers.codeTables.SampleSharedCodeTableBuilder"/>
</list>
</property>
</bean>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class SampleSharedCodeTableBuilder implements CachableDataBuilder<String, List<? extends CodeItem>> {
// 缓存时间
@Override
public long getTimeoutMillis() {
return 86400000;
}
// 代码表code
@Override
public String getKey() {
return "shared_code_table_id";
}
@Override
public List<? extends CodeItem> buildCachableData() {
List<CodeItemImpl> result = new ArrayList<>();
result.add(new CodeItemImpl("code1", "name1"));
result.add(new CodeItemImpl("code2", "name2"));
return result;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 重载onFieldSuggesting方法
如果SDK设计的外部代码表方法无法满足实际需求,比如数据全集过于庞大,可以重载onFieldSuggesting方法来提供自己的实现,此种方式比较复杂不推荐使用故不举例说明。