看似是一个variable有name和mapped-name两个名称,其实情况很复杂。看例子。
假定我们有一个极其简单的流程vartest (surprisingly it also means V-Artest, but i must say that i'm not a Laker fan) 。在start-state的controller里添加一个variable,name为"var",mapped-name为"variable",如下:
<?xml version="1.0" encoding="UTF-8"?>
<process-definition xmlns="" name="vartest">
<start-state name="start-state1">
<task>
<controller>
<variable access="read,write" name="var" mapped-name="variable"></variable>
</controller>
</task>
<transition to="task-node1"></transition>
</start-state>
<task-node name="task-node1"
<transition to="end-state1"></transition>
</task-node>
<end-state name="end-state1"></end-state>
</process-definition>
然后我们来写一个Test Case:
public class AccessVariable extends TestCase
{
public void testPayProcess() throws Exception
{
JbpmContext jc = JbpmConfiguration.getInstance().
createJbpmContext();
ProcessDefinition pd = jc.getGraphSession().
findLatestProcessDefinition("vartest");
ProcessInstance pi = pd.createProcessInstance();
ContextInstance ci = pi.getContextInstance();
TaskInstance ti = pi.getTaskMgmtInstance().createStartTaskInstance()
//hint 1:
//ci can create new variable (not declared in <controller>)
//and ti can access the variable ci created
ci.setVariable("abc", "ABC");
System.out.println(ti.getVariable("abc")); //ABC
ti.setVariable("abc", "CBA");
System.out.println(ci.getVariable("abc")); //CBA
//hint 1:
//also, ti can create this kind of variables
//and ci can access the variable ti created
ti.setVariable("def", "DEF");
System.out.println(ci.getVariable("def")); //DEF
ci.setVariable("def", "FED");
System.out.println(ti.getVariable("def")); //FED
//hint 2:
//for the variables declared in <controller>, it's the same situation
//both ci and ti can create and access this kind of variable
ci.setVariable("var", "VAR");
System.out.println(ti.getVariable("var")); //VAR
ti.setVariable("var", "RAV");
System.out.println(ci.getVariable("var")); //RAV
//hint 3:
//"var" doesn't affect "variable"
System.out.println(ti.getVariable("variable")); //null
System.out.println(ci.getVariable("variable")); //null
//hint 4:
//things becaome a little different when using mapped-name
ti.setVariable("variable", "VARIABLE");
System.out.println(ti.getVariable("variable")); //VARIABLE
System.out.println(ci.getVariable("variable")); //null
//hint 4:
//it's clear that ti and ci both holds an "variable", respectively
ci.setVariable("variable", "ELBAIRAV");
System.out.println(ti.getVariable("variable")); //VARIABLE
System.out.println(ci.getVariable("variable")); //ELBAIRAV
//hint 3:
//and "variable" doesn't affect "var"
System.out.println(ti.getVariable("var")); //RAV
System.out.println(ci.getVariable("var")); //RAV
ti.end();
pi.end();
jc.close();
}
}
输出结果如注释所示。
可以看出,除了mapped-name之外,ti和ci可以随意SetVariable(key, value),SetVariable的过程包含了create的过程,key可以是name,也可以是其他字符串,且这种类型的变量(名称为name或是任意字符串,只要不是mapped-name)ti和ci可以随意访问,这类变量对ti和ci的作用域是一样的(类似于全局变量)。
但name和mapped-name变量没有任何关系,如hint 3所示,"var"的值不会影响"variable",反过来"variable"的值也不会影响"var"。
且mapped-name变量对ti和ci来说更像是2个变量,其作用域严格区分,没有任何交集,如hint 4所示。
分享到:
相关推荐
$ npm i --save @nestjs/mapped-types 快速开始 构建功能时,在基本实体类型上构建变体通常很有用。 这种变体的一个很好的例子是数据传输对象(DTO)。 数据传输对象是用于封装数据并将其从应用程序的一部分发送到...
【go-mapped-csv:构建高效CSV处理的利器】 在编程世界中,CSV(Comma Separated Values)格式因其简洁性和通用性而被广泛应用。在Go语言中,标准库`encoding/csv`为我们提供了读写CSV文件的基础功能。然而,有时...
内存映射文件(Memory-Mapped File)是一种在操作系统中实现高效数据交换的技术,它允许将文件的内容直接映射到进程的虚拟地址空间中,使得文件的读写操作如同访问普通内存一样快速便捷。在Windows CE这样的嵌入式...
每个`context-param`包含一个`param-name`和一个`param-value`子元素,分别表示参数名和参数值。DTD定义如下: ```xml <!ELEMENT context-param ((param-name, param-value), description?)> <!ELEMENT param-name ...
- **距离公式**:两点之间的距离可通过距离公式 \( d = \sqrt{(x_2 - x_1)^2 + (y_2 - y_1)^2} \) 计算。 - **角度计算**:通过向量内积可以计算两个向量之间的夹角。 ##### 1.3 多边形 - **多边形面积计算**:可以...
- **性能优化**:对于那些需要频繁读取的大型文件来说,使用Memory-Mapped Files可以显著加快读取速度,减少CPU和内存的负担。 - **安全性考量**:由于IFILE_Map API只支持只读模式,因此不会对文件内容造成意外修改...
### ibatis Dynamic SQL ...- **`open`** 和 **`close`**:用于设置动态 SQL 片段的开头和结尾字符串,例如括号、引号等。 #### 四、示例解析 下面通过具体的示例来进一步理解 `<dynamic>` 标签的使用方法。 ```xml ...
- **最小生成树(prim+mapped_heap邻接表)**:Prim算法结合映射堆用于求解最小生成树问题。 - **最小生成树(prim邻接阵)**:另一种实现Prim算法的方式。 #### 十二、图论—最短路径 - **最短路径(单源dijkstra+...
映射国家语言代码具有相应语言的国家/地区的哈希值和具有相应国家/地区的语言的哈希值。 包括全名和代码哈希。 ISO 3166-1 和 639-1 我在一个项目中需要这个,但在网络上的任何地方都找不到它,所以我做了一些爬行并...
- **地址映射**(Address-Mapped):将物理地址转换为逻辑地址的过程,以便于数据存储和检索。 #### 高级库与数据包模型 - **高级库格式**(Advanced Library Format, ALF):一种用于描述IP核和硬件组件的标准...
0x000080e4 : 0xe52d0004 str r0, [sp, #-4]!; 0x000080e8 : 0xe59f0010 ldr r0, [pc, #16]; 0x000080ec : 0xe59f3010 ldr r3, [pc, #16]; 0x000080f0 : 0xe52dc004 str ip, [sp, #-4]!; 0x000080f4 : 0xeb00003c bl...
前几天在网上下载一个struts2的helloword的例子,那个作者也真够缺德的,搞个错误的程序,害得我查了一天的程序错误。 最后发现竟然是struts.xml被写成啦sturts.xml。 碰见这样的问题先鄙视下提供例子的作者, ...
##### 4.1 MappedStatements - **Statement的类型**:包括`INSERT`、`UPDATE`、`DELETE`和`SELECT`等。 - **SQL语句**:定义具体的SQL语句。 - **自动生成的主键**:支持插入后自动生成主键。 - **存储过程**:支持...
### Life After BerkeleyDB: OpenLDAP's Memory-Mapped Database #### Introduction In the realm of database management systems, OpenLDAP's new MDB (Memory-Mapped Database) library marks a significant ...
- **输入接口**:可以是Avalon® Memory Mapped (Avalon-MM)写入从属接口或Avalon Streaming (Avalon-ST)接收端接口。 - **输出接口**:可以是Avalon-ST发送端接口或Avalon-MM读取主控接口。无论何种信号(如通道、...
This section describes how the system memory is organized and mapped, including the allocation of addresses for the CPU, peripherals, and external memory. ###### 6.2.3 AHBBus Arbitration The Advanced...
本文主要介绍了一种名为MDB(Memory-Mapped Database)的读优化数据库库及其作为OpenLDAP后端的应用。该技术由Howard Chu开发,并在Symas Corp.以及OpenLDAP项目中得到应用。MDB作为一种专门为OpenLDAP设计的内存...
标题中的"PyPI 官网下载 | mapped_config-2.34-py2-none-any.whl"表明这是一个从Python Package Index(PyPI)官方源获取的软件包,名为`mapped_config`,版本号为2.34。PyPI是Python开发者发布和分享他们创建的开源...
- **Mapped Statement**:代表了一个具体的 SQL 语句,包含了 SQL 文本、参数类型、结果类型等信息。 ##### 3.2 动态 SQL MyBatis 支持基于 XML 的动态 SQL 处理,允许开发者在 SQL 语句中使用 if、choose(when/...