将数据管理操作集成到工作流系统中的制作方法

文档序号:6566614阅读:217来源:国知局
专利名称:将数据管理操作集成到工作流系统中的制作方法
技术领域
本发明的实施例涉及将数据管理操作集成到工作流系统中。
背景技术
工作流管理系统(WFMS)支持业务进程的模型化和执行,也可 以称为"工作流系统"。业务进程指定工件网络中的哪个工件以什么顺
序执行以及利用哪些资源来执行工件。单个工件可以在通过某种网络 连接起来的多个不同的计算机系统上分布。
诸如产品IBM MQSeries Workflow (IBM公司推出的)之 类的强大而先进的工作流管理系统支持将业务进程模型化为由活动 组成的网络。使用定向的、非循环的、加权的彩色图作为元模型,构 建此由活动组成的网络,进程模型。图形中的节点代表活动,这些活 动定义将要执行的单个任务。任何其他元模型,如分层的元模型,也 可以用于构建进程模型。 一般而言,每一个活动都与为该活动实现合 适的任务的一段代码关联。图形的边缘,控制链路,描述了执行活动 的潜在的顺序。控制链路被表示为箭头;箭头描述了控制流在进程中 移动的方向。
控制链路在其中启动的活动叫做"源活动",而控制链路在其中结 束的活动叫做"目标活动"。对于不同的控制链路,活动可以是源活动 和目标活动.没有传入的控制链路的活动叫做"启动活动",因为它们 启动了进程。没有传出的控制链路的活动叫做"结束活动",因为在它 们完成之后进程结束。活动可以是启动活动,也可以是结束活动。具 有多个传出的控制链路的活动叫做"分岔活动";而具有多个控制链路 的活动叫做"联合活动"。
有不同的工作流语言可用,业务进程执行语言(BPEL)就是一
个这样的工作流语言。BPEL可以被描述为基于XML的语言,该 语言可以使用Web服务的组合,对于分布式计算环境,进行任务共 享。术语"BPEL,,有时也用来指语言的其他版本,如,Web服务的业 务进程执行语言(BPEL4WS)或BPELWS。 BPEL也可以被描述为 用于描述和设计业务进程活动的标准。WebSphere 业务集成(WBI) 产品(IBM公司推出的)提供了用于设计和执行基于BPEL的业务 进程的实施方式。WBI的组件叫做 WebSphere Process Choreographer (WPC)工作流系统。
术语"Web,,用来指World Wide Web,它可以被描述为一组支持 以超文本标记语言(HTML)格式化的文档的因特网服务器。Web服 务(也称为"应用程序服务")可以被描述为Web服务器所提供的服 务,Web服务器通常由连接到Web的程序进行调用。
<}0{>BPEL4WS定义用于基于Web服务指定业务进程行为的 表示法。<o} (Business Process Execution Language for Web Services Specification,版本1.1,2003年5月5日,下面简称为"BPEL4WS 规范")BPEL4WS规范表示,业务进程可以被描述为可执行的业务 进程,这些进程模型化业务交互中的参与者的实际行为,或描述为业 务协议,这些协议使用进程描述,这些描述指定参与协议的每一方的 相互可见的消息交换行为,而不暴露它们的内部行为。
根据BPEL4WS规范,BPEL4WS提供了业务进程和业务交互 协议的形式说明语言,并定义可互操作集成模型,该模型有助于在^> 司内部和企业到企业空间中的自动进程集成的扩展.此夕卜,BPEL4WS 规范也定义受支持的活动。
在常规工作流系统中,从工作流系统内对数据管理系统进行访问 不必要地复杂化。常规工作流系统提供下列方法中的一个或两个
1. 数据管理操作必须以传统的编程语言进行编码,例如,通过 编写一些JavaTM代码并利用由数据管理系统所提供的应用程序编 程接口 (API)。 (Java以及所有基于Java的商标和徽标是Sun Microsystems, Inc.公司在美国,其他国家或两者的商标。)
2.必须通过Web服务提供数据管理操作。
WPC工作流系统,例如,支持两种方法。WPC工作流系统允 许通过Java代码来实现进程活动,并允许使用Web服务作为进程 活动。
当使用第一方法时,WPC用户必须对Java活动进行编码。除 了有关结构化查询语言(SQL)和Java数据库连接(JDBC) API 的知识之外,用户还必须具有Java开发知识,Java数据库连接 (JDBC) API可使用户从Java环境内发出SQL语句。SQL语句本 身构成单行代码。然而,通过JDBC发出SQL语句(一种"查询"), 从WPC工作流系统变量中获取输入参数,向查询中馈送输入参数, 并将查询的结果写入到WPC工作流系统变量中,需要编写大量的代 码,并需要大量时间来进行编码。
当使用第二种方法时,WPC工作流系统用户必须对SQL语句 进行编码,并将SQL语句包装到Web服务中。可能需要许多步骤 和不同的产品才能实现这一点。无论用户如何构建Web服务,都还 可能需要向业务进程中添加两个另外的活动("分配,,活动),以给 Web服务提供所需要的输入并处理结果。
两种方法对用户来说都比较麻烦,尽管访问数据管理系统是业务 进程的典型的活动。
此外,诸如由BPEL代表的那些工作流,表达了处理活动的序 列。最常见的情况是,这些活动一次对单一数据记录进行操作。然而, 在越来越多的情况下,优选情况下,对记录集合(也称为"集合")进 行操作,而不是一次对一个记录进行操作.此模式类似于在数据仓储 应用程序中使用的提取转换负栽(ETL)模式,以对数据进行处理。 利用ETL,从数据库中检索("提取") 一组记录,对它们进行处理 ("转换"),以及将它们加栽到数据库中。
如此,使用工作流引擎来将一些面向集合的操作与面向记录的操 作混合是有用的。最常见的是,这些集合活动实际上是对来自一个或 多个数据源(例如,关系数据库)的信息进行处理。例如,作为数据
库查询的一部分,活动可以从一个或多个数据源检索信息或更新信 息。在常规工作流系统中,为执行这样的活动的序列,工作流引擎通 常必须实体化整个数据集(即,从一个或多个数据源检索所有信息), 通过复制数据,将此数据集传递到另一个活动,该活动进行其处理, 并将数据集传递到再一个活动等等。如此,复制整个数据集,并在数 据活动之间传递。由于性能原因,通过复制传递大型集合是不可接受 的,因为效率不高,难以发展。
常规的业务进程运行时系统在设计和执行数据管理操作方面具 有一些弱点。例如,常规的业务进程运行时系统假设静态环境,其中, 在运行业务进程之前,数据管理活动应该针对的集合(例如,表)是 已知的(即,在设计时或者在部署时指定它们)。
虽然对于某些应用程序,假设静态数据管理环境是可以接受的, 但是,这样的假设可能不适用于动态的按需的应用情况,在这种情况 下,选择相关的数据可能取决于,例如,服务级别协议。在按需的应 用情况下,可能有其中数据以不同的服务质量特征冗余地存储在多个 位置的数据管理环境。按需应用可能需要为不同的用户选择不同的数 据源,具体情况取决于与相应的用户签定的服务级别协议。选择数据 源可能取决于,例如,访问时间、相应的数据源的可用性和/或时效性 特征。
如此,许多按需应用将受益于直接允许延迟有关在运行时使用哪 些数据源的判断的工作流系统,

发明内容
提供了用于处理工作流的方法、计算机程序,以及系统。接收包 括一个或多个数据管理活动的工作流。从工作流生成包括对一个或多 个数据管理活动的描述的工作流描述。从工作流描述生成一个或多个 数据管理操作。针对一个或多个数据管理系统,执行一个或多个数据 管理操作。
优选情况下,提供了将数据管理操作集成到工作流系统中的解决
方案。


现在将参考下面的附图,只作为示例,对本发明的实施例进行描

图1显示了其中可以实现某些实施例的计算机体系结构的细节。
图2显示了用于将数据管理操作集成到根据某些实施例的工作 流系统中的逻辑。
图3显示了由根据某些实施例的工作流设计时系统所提供的显示器。
图4显示了根据某些实施例的数据源定义向导。 图5显示了根据某些实施例的"Add or Edit an InputSetReference,,屏幕。
图6A、 6B和6C提供了根据某些实施例的工作流的示例伪代码。
图7显示了由根据某些实施例的工作流设计时系统所提供的显示器。
图8显示了根据某些实施例的结果集引用定义向导。 图9A、 9B、 9C、 9D和9E提供了根据某些实施例的工作流的 示例伪代码。
图10显示了可以根据某些实施例使用的计算机系统的体系结
构o
类似的附图标记代表对应的部分.
具体实施例方式
在下面的描述中,将参考附图,附图构成了本发明的一部分,并 显示了本发明的多个实施例。应该理解,在不偏离本发明的范围的情 况下,可以利用其他实施例,也可以进行结构性的和操作更改。
图1显示了其中可以实现某些实施例的工作流系统100的细
节。计算设备110包括工作流设计时系统120,用于允许用户创建 工作流的图形表示(例如,图3的310)。工作流设计时系统120包 括工作流描述编辑器122,该编辑器从工作流的图形表示生成工作流 描述130。工作流描述130被路由到包括工作流运行时系统150的 计算设备140。工作流运行时系统150能够执行工作流描述130。 工作流运行时系统150包括数据管理操作支持组件152,该组件用 来对集成到工作流描述130中的数据管理操作进行处理。数据管理 操作被提交到一个或多个数据管理系统160a... 160n (其中,省略号 表示,除数据管理系统160a和160n之外,还可以有任意数量的数 据管理系统)。数据管理系统160a. . . 160n可以描述为提供对数据 的访问的计算设备(例如,服务器计算机)。
术语"活动"是指工作流的"节点"(例如,图 3的 CheckltemlnStock 320 ),而术语"操作"是指对数据管理系统 160a...l60n执行的语句(即,其中输入的参数和输入的集合引用已经 被对应的值替代的语句)。活动的执行可能涉及多个操作。
图2显示了用于将数据管理操作集成到根据某些实施例的工作 流系统中的逻辑。控制从方框200开始,工作流设计时系统120接 收用户已经创建了包括由实施例所提供的一个或多个数据管理活动 的工作流(也简称为"控制流")的指示,具体来说,实施例提供了新 的数据管理活动的组,作为对工作流语言(例如,BPEL)的扩展, 数据管理活动允许从工作流系统内对数据管理系统160a".160n (例 如,关系数据库系统)进行访问和管理,
数据管理活动可以对集合进行操作,为实现这一点,实施例提供 了具有生命周期属性的集合引用。如此,数据管理活动可以包括具有 生命周期属性的集合引用,集合引用可以被描述为指向驻留在数据管 理系统(而不是在业务进程中)的一组数据的指示器(例如,指针)。 集合引用包含对数据管理系统进行访问和管理对应的集合所需的信 息。通过使用集合引用,实施例避免了在活动之间传递大型的信息集 合。此外,实施例通过允许用户选择生命周期属性,为集合提供了生
命周期管理支持,属性确定,例如,集合在多长时间内可用,以及何 时将丢弃集合。
数据管理活动包括,例如,结构化查询语言(SQL)活动、实体 化活动,以及系统命令活动。SQL活动的示例包括select、select into、 call、 insert、 update、 delete、 merge、 values、 values into, 以及数振 定义语言(DDL)操作。DDL操作包括,例如,create、 alter、 drop、 refresh、 revoke、 grant,以及set。 实体化活动4吏集合引用的内容 对工作流系统可用(例如,作为XML文档)。系统命令活动的示例 包括启动数据管理系统、停止数据管理系统,备份,恢复,重新组 织,以及runstats。
另外,实施例还提供了扩展性机制,该机制可使用户添加新的活 动类型。此外,每一种活动类型也可以映射到数据管理系统的一个或 多个操作。例如,新活动可以是"从远程系统加栽数据",此新活动的 执行导致产生在数据管理系统中执行的多个操作(例如,多个创建操 作,接下来是选择操作)。
此外,实施例可使业务进程变量用作数据管理活动的输入和/或 输出参数。业务进程变量可以被描述为工作流语言变量(例如,BPEL 变量)。
此外,实施例允许进行数据源定义,这些定义可以允许在运行时 选择数据源。
现有的工作流语言不包括这样的数据管理操作,集合引用、或集 合引用的生命周期管理。此外,现有的工作流语言没有提供作为活动 的参数的业务进程变量的扩展用法,如实施例所提供的那样(即,现 有的工作流语言常常对使用业务进程变量具有限制,例如,BPEL中 的Web服务活动只能以单个变量作为输入,以单个变量作为输出)。 此外,现有的工作流语言也不允许在运行时进行数据源选择。
通过提供新的数据管理活动并允许创建另外的活动,实施例将数 据管理操作集成到工作流系统中,以便轻松地调用数据管理操作,并 允许在数据管理系统和工作流系统之间以集合的形式共享信息。
此外,通过扩展工作流语言以包括数据管理活动,并提供引用了 数据集的集合引用而无需实体化数据,实施例可以实现单个工作流内 的面向记录的和面向集合的活动的混合。此外,实施例允许数据管理 活动被"内嵌地"指定为工作流描述的一部分(例如,作为工作流描述
内的SQL语句)。
返回到图2,在方框202中,工作流描述编辑器122自动地从 工作流生成工作流描述。工作流描述包括对一个或多个数据管理活动 的描述。如果选择,工作流描述还包括任何集合引用的描述,以及它 们的生命周期属性,被用作输入和/或输出参数的业务进程变量,以及 数据源定义。
在方框204中,工作流运行时系统150从工作流描述自动地生 成一个或多个数据管理操作(例如, 一个或多个SQL查询)。在方 框206中,工作流运行时系统150针对一个或多个数据管理系统 160a...l60n执行一个或多个数据管理操作。在某些实施例中,向单个 数据管理系统160a".160n提交活动,而取决于附属于活动的数据源 定义,可以针对不同的数据管理系统160a,,.160n执行不同的数据管 理操作。在方框208中,将查询的结果返回到工作流运行时系统 150。
仅仅为加强对本发明的理解,这里的示例可以指将SQL操作集 成到基于BPEL的工作流系统中。在某些实施例中,SQL操作被集 成到WebSphere Process Choreographer (WPC)工作流系统中.
可以扩展实施例的技术,以涵盖其他的数据管理操作类型及其他 集合和数据管理系统类型(例如,XML数据库系统和内容管理系统)。 此外,技术也可以被扩展到XQuery (这是可扩展标记语言(XML) 查询语言)和存储在XML数据库系统中的XML文档的集合,以 及可以被扩展到内容访问和操纵操作和存储在文档管理系统中的文 档的集合。对于工作流系统,也可以将实施例的技术扩展到其他不基 于BPEL的面向服务的工作流系统。即,实施例的技术可以与任何 工作流语言一起使用(例如,表单定义标记语言(FDML)或XLANG
(来自微软公司的规范))。
图3显示了由根据某些实施例的工作流设计时系统120提供 的显示器。用户能够创建工作流310的图形表示。在图3中,工作 流310包括"CheckltemlnStock"数据管理活动320,该活动检查库 存中的给定商品是否可用。在工作流310中,如果库存中没有商品, 这是利用过渡条件检查的,则调用Web服务,以订购新的商品。如 果商品没有库存,则工作流310返回Web服务的输出,或商品有 库存,则返回默认值。
窗格330显示了使用工作流设计时系统120构建的SQL语 句,该工作流^L计时系统120允"^午用户直接指定SQL语句,SQL 语句是工作流描述130的一部分。ItemCount和itemid链接分别 指向输入/输出参数,而这些参数链接到业务进程变量。ItemTable链 接指向输入的集合引用。当用户选择(例如,点击)这些链接时,工 作流设计时系统120的实施例提供了向导,以分别更新参数或集合 引用。可以通过选择"新建,,按钮340,创建新的参数和集合引用。即, 可以将新的参数和集合引用(例如,输入/输出集合引用)映射到业务 进程变量(例如,BPEL变量和/或属性)。此外,variable-DataSource part=myDataSource语句表示,SQL语句的数据源由业务进程变量 "DataSource,,的"myDataSource,,部分来标识。
为指定要由"CheckltemlnStock,,数据管理活动320使用的特定 数据源,用户选择"CheckltemlnStock,,数据管理活动320,并选择"定 义数据源按钮",这会导致"数据源定义向导"400被显示出来(图4), 然后,用户可以提供数据源类型410(例如,通过指定到业务进程变 量或业务进程变量430的一部分的映射)。用户也可以内嵌地提供 数据源定义,如此,通过将数据源映射到业务进程变量(例如,BPEL 变量)或业务进程变量的一部分(例如,BPEL变量的一部分),可 以指定SQL活动的数据源。
此外,实施例还允许将输入的集合引用映射到业务进程变量(例 如,BPEL变量)或业务进程变量的一部分(例如,BPEL变量的一
部分)。图 5显示了根据某些实施例的"添加或编辑 InputSetReference"屏幕500,该屏幕允许映射到业务进程变量和部 分520。为指定要由"CheckltemlnStock"数据管理活动320使用的 输入的集合引用和生命周期属性,用户选择"CheckltemlnStock"数据 管理活动320,并选择"新建"按钮340,这就会导致显示出"添加或 编辑 I叩utSetReference,,屏幕 500 。在设置的"添加或编辑 InputSetReference"屏幕500中,用户识别业务进程变量和部分520 并识别生命周期属性,如是否需要清理510以及应该在哪一个时间 点执行清理。
通过在工作流描述中使用内嵌 SQL来指定 "CheckltemlnStock"数据管理活动。下面的示例伪代码A显示了 "CheckltemlnStock"数据管理活动的工作流描述。
伪代码A
<invoke name。,,Checklt柳lnStock" operation="null" partnerLinWrnjll" portType-"wpcs加ll" wpddisplayName-"Checklt柳InStock,' wpC2id="6"> <dataManagementActivity xsi:type二"tDataManage肺ntActivity" <statement xsistypes"tSqlStatement"
<dataSource pairt-"inyDataSource" variable口,'DataSource" /> <body>
SELECT count(*) INTO
(parameter kind="out" property=nmyint" variable "ItemCount" />
FROM
<setReference cleanup="no" part "mySetReference" pi:邻aratioWno11 variable。,,SetReferencen
/>
WHERE it柳id =
(parameter kind=,'inw property=,'itemidw variable="lnputvariable" />
</body> </statement> </dataManagementActivity> <sourcss>
<source linkName="Iiinlcl,'> <ti:ansitionCondition expression!Language="http2//www ibm, co1n/咖lns/p2rocl/树ebsphere/business-p1:oce ss/expression-lang/java/v6 ()〃'>
<!CDATA[return ItemCount,get ("myint") == 0M> </transitionCondition> </sourcs>
</scmrces> </imroke>
在伪代码 A 中,数据管理活动语句元素 ("dataManagementActivity,,)包含数据源定义元素("dataSource,,) 和正文元素("body")。
数据源定义元素引用了包含实际数据源定义的BPEL变量 ("myDataSource,,)。
针对由数据源定义元素标识的数据源,执行语句的正文元素中定 义的SQL。具体来说,正文元素定义SQL"SELECT INTO,,语句。 SQL令牌与setReference和参数元素混合。setReference元素引用 了包含集合引用定义的BPEL变量"SetReference",所述集合引用定 义用于确定实际数据库表。输入参数引用了包含要在SQL语句的
where子句中使用的itemid的BPEL变量"InputVariable"。语句 的结果存储在如输出参数所定义的变量"ItemCount"中。此外,集合 引用还具有cleanup-"no"和preparation-,,no"的生命周期选项, 这表示不需要准备即可使用集合引用,并且不删除对应的集合。 "ItemCount.get ("myint") == 0" 的过渡条件通过检查 "CheckltemlnStock"数据管理活动的结果,检查是否需要调用Web 服务。
工作流运行时系统150从伪代码A生成数据管理操作(例如, SQL查询),然后,可以针对数据管理系统160a... 160n执行所述 数据管理操作。生成的用于执行的数据管理操作取决于任何输入参数 和输入的集合引用的值。
具体来说,在工作流运行时系统 150 中执行 "CheckItemInStock"活动包括数据管理操作支持组件152接收此活 动的工作流描述,以及进程的上下文。上下文包括BPEL变量和属 性。数据管理操作支持组件152首先检查输入参数,并检查输入的 集合引用变量,并从指定的BPEL变量中获取对应的值。例如,从 BPEL变量"InputVariable"中提取itemid。在此示例中,假设整数 的值是135。从BPEL变量"SetReference,,的"mySetReference"部分 提取选择查询中所使用的表的名称。在此示例中,假设表的名称是 "ITEMS",
数据管理操作支持组件152确定应该针对其执行查询的数据 源。在此示例中,通过BPEL变量"DataSource"的"myDataSource" 部分的内容来指定数据源。对于此示例,假设值是jndi名称 "jdbc/sample,,。数据管理操作支持组件 152创建与数据源 "jdbc/sample,,的连接,并执行其中输入参数和输入的集合引用被从 BPEL变量中提取的值替代的SQL语句。下面是生成的查询示例
SELECT COUNT(" INTO :OUTPUTPARAMETERl FROM "ITEMS" WHERE ITEMID = 135
数据管理操作支持组件152将"OUTPUTPARAMETERl"的值
写入到BPEL变量"ItemCount,,中。
为便于理解,提供了另一个简化的在工作流运行时系统140中 执行"GetEuropeanOrders"活动的第一个语句的示例。在此示例中, 工作流运行时系统150中的数据管理操作支持组件152接收活动 的描述,以及进程的上下文。此上下文包括BPEL变量和属性。
数据管理操作支持组件152首先检查输入参数,并检查输入的 集合变量。在此示例中,有输入的集合引用。从BPEL变量 "SetReference_OrdersEurope,,的"mySetReference,,部分提取选择查 询中所使用的表的名称。对于此示例中,假设表的名称是 "INPUT.EUROPEANORDERS"。
数据管理操作支持组件152确定应该针对其执行查询的数据 源。在此示例中,通过 BPEL变量"DataSourceVariable,,的 "myDataSource"部分的内容来指定数据源。对于此示例,假设值是 jndi名称"jdbc/sample"。数据管理操作支持组件152创建与数据源 "jdbc/sample"的连接,并执行SQL语句
SELECT OID, CID, TYPE, TOTPRICE, DATE FROM "INPUT.EUROPEANORDERS" WHERE ITEMID = 135
指定了结果集引用。如此,数据管理操作支持组件152将此查 询的结果写入到由变量"ResultSetReference_Europe"的 "mySetReference"部分指定的表中。为此表指定了生命周期管理选 项。在当前进程的寿命结束时,从数据管理系统中删除表。数据管理 操作支持组件152永久地存储此信息。在进程执行结束时,由工作 流运行时系统150调用数据管理操作支持组件152以执行清理工 作。
图6A、 6B和6C提供了根据某些实施例的工作流610的示 例伪代码600、 610、 620。伪代码A是所显示的伪代码600、 610、 620的一部分。
图7显示了由根据某些实施例的工作流设计时系统120所提 供的显示器。用户能够创建工作流710的图形表示。在图7中,工
作流710包括"GetEuropeanOrders,,720 、 "GetUSOrders,,722 、 "UnionOrders,,724,以及"MaterializeOrders"726数据管理活动。在 图7中,工作流加栽来自两个不同地理区域(欧洲和美国)的定单 数据。在将两个数据流连接到一起之前,进行货币兑换(欧元对美元)。 在联接两个数据集之后,将所产生的数据实体化为XML文档。最后, 作为工作流的输出,返回XML文档。
下面的示例伪代码B显示了 GetEuropeanOrders数据管理活 动720的工作流描述。GetEuropeanOrders数据管理活动720将 European(欧洲)数据加载到存储在 BPEL 变量 ResultSetReference_Europe中的集合引用中(语句1),然后执行 从欧元到美元的货币兑换(语句2)。通过SQL UPDATE语句进行 转换。集合引用BPEL变量ResultSetReference—Europe被作为转 换语句的输入的集合引用。
伪代码B
<invoJce name="GetEuropeanOrders" operatiorv "null" partnerLink-,'nuil" portTypee"wpcmull" wpcsdisplayName-"GetEuropeanOrders" wpc2id "7"> <dataManagementActivity xsi: type-"tDataManagementActivity" <statement xsi: type頃"tSqlStat柳ent"
<dataSource varlablea"DataSourceVariable"
part="myDataSource" /> <resultSetReference variable="ResultSetReference—Europe"
part "mySetRefe]:ence,,
preparation="ifNeeded"
cleanup="yes"
cleamjpScopeeBinstarice', />
<body>
SELECT OID, CID, TYPE, TOTPRICE, DATE FROM <setReference variables,'SetRefeirence-Oirdei:sEurope
parWmySetReference" preparatiom^no" cl的nup-"no" />
</statement>
《stat柳抑t xsistype-ntSqlStat柳ent" <dataSource part="myDataSourcew
variable-"DataSouj:ceVariable,' />
<body>
UPDATE
<setReference variableo"ResultSetReference一Europe
part="mySetRefei:ence" preparation=wno" cl的加p-"no" /> SET TOTPRICE -BO,EURO一TO一DOLLAR《TOTPRICE) </body> </stateroent> </dataManagementActivity> <sources>
<source lin3tName-,'I#inW_', /> </sourc6S>
下面的示例伪代码C显示了 GetUSOrders数据管理活动 722的工作流描述。GetUSOrders数据管理活动722将美国数据加 栽到存储在BPEL变量ResultSetReference—US中的集合引用中。 以这样的方式设置此结果集引用的生命周期属性,以便只有在基础数 据库表不存在的情况下(preparation = ,,ifNeeded,,)才创建基础数据
库表,将删除表(cleanup = "yes"),在进程实例结束时执行表的删 除(cleanupScope = "instance")。 伪代码C
<invoke name="GetUSOrdei:s,' operation-,'加11,, partnejrLinW加ll" portType="wpc:mill" wpcsdisplayN柳e一"GetUSOrders" wpc:id "8">
<dataManagementActivity xsi - type "tDataManagementAct:ivity"> <statement xsi:type "tSqlStatement"> <dataSource part-,'myDataSouirce,'
variable="DataSourceVariable" /> <resultSetReference variablee"ResultSetReference—US"
part-,,tnySetReference,' p3:epar3ticm一"ifNeedeci" cleanupB,'y的,'
cl的mipScope一"irkst抑ce" />
<body>
SELECT OID, CID, TYPE, TOTPRICE, DATE FROM "etKeference variablee"SetReference一OrdersUS" part-,'mySetReference" preparation—"no" cl的加p頃"no" />
</body> </stat€ment> </dataManagementActivity>
<source linkName="liiiiW" /> </sourcss> </invoke>
下面的示例伪代码D显示了 UnionOrders数据管理活动724 的工作流描述。UnionOrders数据管理活动724代表美国和经过转 换的欧洲订单的联合。数据的结果集作为集合引用存储在BPEL变 量ResultSetReference_Union中。
伪代码D
<invo)ce name="UnionOrdeirs" operation="rmll" partxierliinksMnull,' portType "wpcsnull" wpc:displayNaroe "UnionOrders" wpc:id坊""〉
<dataManagementActivity xsis type>=HtDataManagementActivity"> <statement xsistype-wtSqlStatement">
《dataSource part="myDataSource"
variablee"DataSoui:ceva:ciable" /> <resultSetReference cleanups"no" parte"iaySetReference,'
preparations"i fNeeded"
vaxriable-"ResultSetReference—union"/>
<body>
SELECT OID, CI" TYPE, TOTPRICE, DATE FROM <setReference variableo"ResultSetReference一Europe
pairt="mySetReference" preparation=',no,, cleanup^no1* /> UNION ALL SELECT OID, CID, TYPE, TOTPRICE, DATE FROM
<setReference cleanup-"no" part="mySetReference" prej>arationsnno,,
variable=nResultSetReference—US" />
</body> </statement> </dataManagementActivity>
<target linkName="I*in)cl" />
<target lin欣ame-"Iiink2" /> </tsrgets> <sources>
<source linkName="Iiin]c3" /> </sources> </invoke>
下面的示例伪代码E显示了 MaterializeOrders数据管理活 动726的工作流描述。MaterializeOrders数据管理活动726将统 一的订单表的内容实体化为进程上下文,在语句的<from>元素中, 指定了用于实体化的数据来源,<to>元素代表实体化目标.即,集 合引用ResultSetReference_Union的内容将被实体化为BPEL变 量MaterializedOrders, myMaterializationResult部分。
伪代码E
<invoke name ,'MaterializeOrdei:sM operation=,,mall" partnei:liinlc-,'nu1111 poi:tType="wpc:null,, wpc:di3playName="Materialize0rdersn wpc:id-,,10"> <dataManagementActivity xsi 2 type="tDataManagementActivity">
<statentent xsi2type="tMatei:ializationStatement"> <from part-"mySetReference"
variable。"ResultSetReference一Union" /> <to part "myMaterializationResult" variable="MaterializedOi:ders" /> </statement> </dataManagementActivity> <targets>
<tairget linkName="Iiink3" /> </targets> </irrvoke>
作为创建结果集的数据管理活动的指定的一部分,指定结果集引 用。为指定结果集引用,用户选择"创建结果集引用"按钮,这会导致
结果集引用定义向导800被显示出来(图8)。图8对应于 "GetEuropeanOrders,,活动720中使用的结果集引用(图7)。在"结 果集引用定义向导,,800中,可以使用此面板的"属性"部分来定义生 命周期管理选项。例如,用户识别生命周期属性810,如是否需要清 理810,以及应该在什么时间点执行清理。在此示例中,在进程结束 时(即,在"instance"结束时)将清理结果集。
用户还提供结果集引用的定义820,例如,通过提供数据源,以 及要保存结果的现有的表的标识,或通过指定应该由数据管理操作支 持组件生成结果集。在此示例中,明确地指定数据源、架构名称和表 名称。
图9A、9B、9C、9D和9E为根据某些实施例的工作流810提 供了示例伪代码900、 910、 920、 930、 940。伪代码B、 C、 D和E 是所显示的伪代码900、 910、 920、 930、 940的一部分。
如此,为将数据管理操作集成到工作流系统中,将数据管理操作 作为第一类公民集成到业务进程的工作流系统中。实施例提供了数据 管理操作的下列特征
1. 包括数据管理操作的声明性描述的新的数据管理活动。
2. 直接指定作为这些操作的输入参数的业务进程变量的机制。
3 .直接指定这些操作的结果如何存储在业务进程变量中的机 制。
4 .指定要在运行时使用的数据源的机制。
5 .定义具有生命周期属性的集合引用的机制。 实施例消除了常规方法所存在的问题,如减少了实现数据管理活
动所需要的技能集,缩短了这样做所需要的开发时间。
通过在三个不同级别支持作为第一类公民的数据管理操作,实现
集成系统在设计时系统工具120中,在工作流语言内(用于工作 流描述130),以及在工作流运行时系统150中。通过对特定数据 管理活动的支持,加强工作流设计时系统120。通过"内嵌地,,指定数 据管理活动作为工作流描述的一部分的机制,包括直接使用进程变量 作为活动的输入和输出参数的能力,加强工作流语言。
工作流运行时系统150接收工作流描述130。通过能够执行工 作流描述130中所定义的数据管理操作的数据管理操作支持组件 152,包括对集合引用和对应的集合的生命周期管理的支持,加强工 作流运行时系统150。数据管理操作支持组件152对一个或多个数 据管理系统160a...l60n进行访问,以执行指定的数据管理操作。
提供了另 一个示例,以加强对本发明的实施例的理解。具体来说, 在此示例中,有关订单的信息存储在关系数据库系统中,业务进程检 查来自某一区域的订单的总量.在此示例中,区域是对业务进程的输 入参数(即,业务进程输入变量)。数据库管理操作是SELECT查 询.查询的结果存储在变量中,以便结果可以供后继的活动使用。
实施例提供了业务进程的工作流语言(例如,BPEL)的内嵌的 SQL.在WPC工作流系统和SQL支持的情况下,作为第一类乂^民 集成到工作流运行时系统150中意味着,工作流运行时系统150直 接支持SQL代码。内嵌的SQL语句允许数据管理活动的声明性描 述(叫做"SQL片断"或"DMA",类似于"Java片断")包括在工作流 描述130中。
作为伪代码F,显示了 WPC工作流运行时系统的SQL活动 的伪代码示例。伪代码F的文本"select count(*) into" 、 "from
ORDERS",以及"where REGION-"显示了如何指定SQL查询。 元 素 <dataSource variable-"DMA Data—Source"
part="dataSource,,/>指定了要使用的数据源。元素-parameter
kind-,,out" property="NB—EXCEPTIONAL—ORDERS"
variable=,,Parameter" />指定了输出参数。
元素 -parameter kind-"in" property-"MAX一PRICE" variable-"Parameter"/>指定了输入参数。如此,业务进程变量可以 是输入和输出参数,可以通过业务进程变量来指定数据源。
伪代码F
< xrol versione"i,o" encodLing=,'UTF-8,'?> <wpcsdataManagementActivity >
<dataSouirce variable—"DMA一Data一Soui:ce,' part "dataSource"/> <dmaStatement xsi: type一"wpcs DMAStatementType">
<operation type=Mqueryw scsi - type=wwpc-OperationType,,> select count《*) into -parameter kind-"out,' property="NB—EXCEPTIONAL—ORDERS" variabJLe-"Para鹏ter11 /> from ORDERS where REGION 。
<psrameter kinWin" pjroperty "MAX—PRICE" variable="Parameterw />
</operation>
</dmaStatement>
</wpc: datdManagemeiitActivity>
集成系统能够理解业务进程本身的语义(例如,活动彼此如何相 关)以及此业务进程内的数据管理活动的语义。
实施例提供了支持集合引用的概念的工作流系统,集合引用克服 了常规工作流系统的缺陷。
集合引用可以描迷为指向一组数据的指针。例如,集合引用可以 是表名称和用于定位数据集的其他信息。集合引用可以包括,例如,
有关如何对集合进行访问的信息;有关集合的元信息;以及诸如要创 建和删除集合的语句之类的集合属性。集合引用可以被绑定到业务进 程变量,并可以被用作语句的输入和输出集合。集合引用允许通过转 发集合引用而不是通过复制数据集来在多个活动之间传递集合。例 如,第一数据管理活动可以创建集合引用,而第二数据管理活动可以
使用该集合引用。集合引用支持动态基础架构(例如,可以在业务进 程运行时改变源集合和目标集合)。
在某些实施例中,集合引用指向可通过单个数据管理系统
160a…160n进行访问的集合(例如,关系数据库系统中的表或视图)。 数据管理系统160a... 160n可以是能够处理集合的联合系统,其中, 对应的记录驻留在不同的数据管理系统160a".160n中。
下列伪代码作为伪代码G提供了定义集合引用的示例。伪代码 G 使 用 resultSetReference part="reference"
v3ri3ble=,'SelectedEmployeesSetReferenceVari3ble,,/ 和 sctRcferencc p3rt="referencc,' variable-"AHEmployeesSetReferenceVariable"/来定义集合引用。
伪代码G
<resultSetReference p t=wreference" vai:iables"SelectedEmploy的sSetRefer抑ceVariableV〉 select empno, fii:stnine, lastnamerphoneno, sex from <setReference parWreference" variable="AllEmployeesSetReferenceVariable"/> where lastname like
,<parameter JcimieWiii" property "namePrefixw variable=wInputVariable"/>
集合引用可以指向现有的集合,并代表还没有执行的数据管理活 动的结果.在后一种情况下,集合引用可以包含元信息,指示了有关 集合应该服从的特征的数据管理活动,
对于集合引用的支持包括下列工作流系统功能
1. 通过工作流系统的工作流工具和API来支持集合引用,用 户可以直接指定和修改集合引用(第一类公民支持示例)。
2. 可以在各种时间点指定和修改集合引用,包括在业务进程 的设计时,在业务进程的部署时,或在业务进程运行时。
3. 集合引用可以直接被用作数据管理活动的输入和输出参数。
作为示例,集合引用可以代表关系数据库系统中的表或视图。地 址信息包含对数据集进行访问所需的信息(例如,数据源的指定(例
如,JNDI名称)、架构和表名称,以及如何进行验证的描述(例如, 利用正在运行业务进程的当前用户的凭据))。集合引用中的元数据 信息描述了表或视图的列。
集合引用支持允许通过业务进程活动将某一数据源中的现有的 表绑定到集合引用"S1"。此活动可以,例如,是注册表查询操作。然 后,可以在随后的SQL SELECT活动的FROM子句中使用SI (即,SI可以被用作集合估值的输入参数)。此SQL SELECT语 句的结果可以绑定到第二集合引用"S2",而此第二集合引用"S2,,可以 再次在后续数据管理活动中使用。
可以使用工作流语言执行面向集合的处理,同时,在代表表的行 的一组对象上循环,在表中的一些数据源中进行查询,以丰富数据, 调用Web服务,以检查某些特征,基于此特征,进行更新。此外, 可以提供单个面向集合的SQL更新操作。面向集合的处理避免了大 型集合的实体化,并减少对数据源进行访问的数量。
实施例提供了由业务进程所创建的集合的生命周期管理。用户创 建集合以便将它们用于某些业务进程活动中以及一旦不再需要它们 而将它们丟弃是一项频繁的任务。因此,实施例为集合引用提供了简 化集合的创建和删除的生命周期管理扩展。扩展包括在某一时间点自 动地创建集合的机制,时间点包括在业务进程部署时,在业务进程创 建时间,当业务进程内的某一范围启动时,或当业务进程内的某一活 动启动时,
扩展还包括丢弃由业务进程在某一时间点自动地创建的集合的 机制,时间点包括在创建集合的活动结束时,在在其中创建了集合的 范围结束时,在业务进程结束时,或在非部署时间。创建和丟弃也可 以是用户管理的(即,集合可以经受得住业务进程)。
下列伪代码作为H提供了使用生命周期管理扩展的用法示例。 在伪代码H 中,cleanup=''yes,, cleanupScope=,'process,'
preparation="yes,,表示,当业务进程结束时,丢弃集合,每次执行 包含伪代码H的活动时,由数据管理操作支持组件152自动地创建 新集合。
伪代码H
<resultSetReference c_Iea nupCTWyes" cleanupScope="process" prepsra t i on: "yes "
part=ffreference" variable="SelectedEmployeesSetReferenceVariablew/> select empno,firstnme,lastname,phoneno,sex from <setReference part="reference" variable-,,AllEmployeesSetRefei:enceVariable"/〉
where lastn柳e like '<parameter kind win,, propertye"namePrefix" variable=":£nputVariableV>,

实施例允许将数据操作集成到工作流中,并允许优化包含数据操
作的工作流。实施例还可以与ETL和业务进程集成一起使用。
IBM、 MQSeries、 Websphere和DB2是IBM ^>司在美国和/ 或外国的注册商标和/或通用法律标记。Oracle是Oracle Corporation在美国和/或外国的注册商标或通用法律标记。Excel是 Microsoft Corporation在美国和/或外国的注册商标或通用法律标 记。
另外的实施例细节
所描述的实施例可以通过使用标准的编程和/或工程技术,作为 方法、设备、计算机程序或产品来实现,以产生软件、固件、硬件或 其任何組合.这里所使用的术语"产品,,和"电路,,是指以硬件逻辑(例 如,集成电路芯片、可编程门阵列(PGA)、专用集成电路(ASIC)等 等)或计算机可读取的介质,如磁存储介质(例如,硬盘驱动器、软 盘、磁带等等),光存储器(CD-ROM、光盘等等),易失性和非易 失性存储器设备(例如,EEPROM、 ROM、 PROM、 RAM、 DRAM、 SRAM、固件、可编程逻辑等等)实现的状态机、代码或逻辑。计算 机可读取的介质中的代码可以由处理器进行访问和执行。当代码或逻 辑由处理器执行时,电路可以包括包含了代码或逻辑的介质以及执行
从介质中加载的代码的处理器。可以进一步通过传输介质或通过网络 从文件服务器对其中实现优选实施例的代码进行访问。在这样的情况 下,其中实现代码的产品可以包括传输介质,如网络传输线、无线传 输介质,通过太空、无线电波、红外信号等等传播的信号。如此,"产 品"可以包括其中实现代码的介质。另外,"产品,,还可以包括在其中 实现代码,对代码进行处理,并执行代码的硬件和软件组件的组合。 当然,那些精通相关技术的人将认识到,可以对此配置作出许多修改, 产品可以包括已知的任何信息携带介质。另外,也可以在适配器或主 板上的一个或多个集成电路中实现多个设备、适配器等等。
某些实施例可以是提供通过人或自动处理来部署计算基础架构 (将计算机可读取的代码集成到了计算系统中)的方法,其中,代码 和计算系统组合起来,以便能够执行所描述的实施例的操作。
术语"逻辑,,可以包括,例如,软件、硬件和/或软件和硬件的组合。
图2的逻辑描述了按特定顺序进行的特定操作。在备选实施例 中,某些逻辑操作可以按不同的顺序执行,也可以加以修改或删除。 此外,还可以向上文所描述的逻辑中添加操作,仍符合所描述的实施 例。此外,这里所描述的操作可以连续地进行,或者,某些操作可以 并行地处理,被描述为由单个进程执行的操作也可以由分布式进程执 行。
图2所显示的逻辑可以以软件、硬件、可编程和非可编程门阵 列逻辑或以硬件、软件或门阵列逻辑的某种组合来实现。
图10说明了可以根据某些实施例使用的计算机系统的体系结 构1000。计算设备100和140可以实现体系结构1000。计算机体 系结构1000可以实现处理器1002(例如,微处理器)、存储器1004 (例如,易失性存储器设备),以及存储器1010 (例如,非易失性 存储区域,如磁盘驱动器、光盘驱动器、磁带驱动器等等)。操作系 统1005可以在存储器1004中执行。存储器1010可以包括内部存 储设备或外接的或可通过网络进行访问的存储器。存储器1010中的
计算机程序1006可以加栽到存储器1004中,并由处理器1002以 已知的方式执行。体系结构进一步包括用于与网络进行通信的网卡 1008。输入设备1012用来向处理器1002提供用户输入,并可以包 括键盘、鼠标、笔尖、麦克风,触敏显示屏幕,或已知的任何其他激 活或输入机制。输出设备1014能够从处理器1002,或诸如显示监 视器、打印机、存储器等等其他组件呈现信息。计算机系统的计算机 体系结构1000可以包括比所显示的更少的组件,这里所没有显示的 另外的组件,或所显示的组件和另外的组件的某种组合。
计算机体系结构1000可以包括当前已知的任何计算设备,如大 型机、服务器、个人计算机、工作站、膝上型电脑、手持式计算机、 电话设备、网络设备、可视化设备、存储控制器等等。可以使用当前 技术中已知的任何处理器1002和操作系统1005。
前面的对实施例的描述只是为了说明和描述。它不是详尽的说明 或将实施例限于所说明的准确的形式。根据上述原理,许多修改方案 和变化也是可以的。实施例的范围不被此详细描述的限制,而是由所 附的权利要求进行限制。上面的说明、示例和数据提供了产品的完整 的描述,以及实施例的构成的用法。由于在不偏离本发明的精神和范 围的情况下,可以使出许多发明,所述实施例都在下面所附的权利要 求或任何随后提出的权利要求,以及它们的等效内容的范围内。
权利要求
1.一种用于处理工作流的方法,包括接收包括一个或多个数据管理活动的工作流;从所述工作流生成包括对所述一个或多个数据管理活动的描述的工作流描述;从所述工作流描述生成一个或多个数据管理操作;以及针对一个或多个数据管理系统,执行所述一个或多个数据管理操作。
2. 根据权利要求1所述的方法,其中,至少一个数据管理 活动包括集合引用。
3. 根据权利要求2所述的方法,其中, 一个或多个生命周 期属性与所述集合引用关联。
4. 根据权利要求2或3所述的方法,其中,所述集合引用 包括到业务进程变量或业务进程变量的一部分的映射。
5. 根据前面的任何一个权利要求所述的方法,其中,至少一 个数据管理活动包括业务进程变量作为输入参数。
6. 根据前面的任何一个权利要求所述的方法,其中,至少一 个数据管理活动包括业务进程变量作为输出参数。
7. 根据前面的任何一个权利要求所述的方法,其中,至少一 个数据管理活动包括数据源定义。
8. 根据权利要求7所述的方法,其中,所述数据源定义包 括将数据源映射到业务进程变量或业务进程变量的一部分。
9. 根据前面的任何一个权利要求所迷的方法,进一步包括 从所述一个或多个数据管理系统接收结果。
10. 根据前面的任何一个权利要求所述的方法,其中,第一数 据管理活动定义集合引用,并且第二数据管理活动使用所述集合引 用。
11. 根据前面的任何一个权利要求所述的方法,其中,所述数 据管理操作包括查询。
12. 根据前面的任何一个权利要求所述的方法,其中,每一个 数据管理活动都对应于所述一个或多个数据管理活动中的一个。
13. 根据前面的任何一个权利要求所述的方法,进一步包括允 许创建新的数据管理活动。
14. 一种用于处理工作流的计算机程序,其中,所述程序使得 能够执行操作,所述操作包括接收包括一个或多个数据管理活动的工作流; 从所述工作流生成包括对所述一个或多个数据管理活动的描述的工作流描述;从所述工作流描述生成一个或多个数据管理操作;以及 针对一个或多个数据管理系统,执行所述一个或多个数据管理操作。
15. 根据权利要求14所述的计算机程序,其中,至少一个 数据管理活动包括集合引用。
16. 根据权利要求15所述的计算机程序,其中, 一个或多 个生命周期属性与所述集合引用关联。
17. 根据权利要求15或16所述的计算机程序,其中,所述 集合引用包括到业务进程变量或业务进程变量的一部分的映射。
18. 根据权利要求14到17中的任何一个权利要求所述的 计算机程序,其中,至少一个数据管理活动包括业务进程变量作为输 入参数。
19. 根据权利要求14到18中的任何一个权利要求所述的 计算机程序,其中,至少一个数据管理活动包括业务进程变量作为输 出参数。
20. 根据权利要求14到19中的任何一个权利要求所述的 计算机程序,其中,至少一个数据管理活动包括数据源定义。
21. 根据权利要求20所述的计算机程序,其中,所述数据源 定义包括将数据源映射到业务进程变量或业务进程变量的一部分。
22. 根据权利要求14到21中的任何一个权利要求所述的 计算机程序,其中,所述操作进一步包括从所述一个或多个数据管理 系统接收结果。
23. 根据权利要求14到22中的任何一个权利要求所述的 计算机程序,其中,第一数据管理活动定义集合引用,并且第二数据 管理活动使用所述集合引用。
24. 根据权利要求14到23中的任何一个权利要求所述的 计算机程序,其中,所述数据管理操作包括查询。
25. 根据权利要求14到24中的任何一个权利要求所述的 计算机程序,其中,每一个数据管理活动都对应于所述一个或多个数 据管理活动中的一个。
26. 根据权利要求14到25中的任何一个权利要求所述的 计算机程序,其中,所述操作进一步包括允许创建新的数据管理活动。
27. —种用于处理工作流的系统,包括 能够导致操作被执行的电路,所述操作包括 接收包括一个或多个数据管理活动的工作流; 从所述工作流生成包括对所述一个或多个数据管理活动的描述的工作流描述;从所述工作流描述生成一个或多个数据管理操作;以及 针对一个或多个数据管理系统,执行所述一个或多个数据管理操作.
28. 根据权利要求27所述的系统,其中,至少一个数据管理 活动包括集合引用。
29. 根据权利要求28所述的系统,其中, 一个或多个生命周 期属性与所述集合引用关联。
30. 根据权利要求28或29所述的系统,其中,所述集合引 用包括到业务进程变量或业务进程变量的一部分的映射。
31. 根据权利要求27到30中的任何一个权利要求所述的 系统,其中,至少一个数据管理活动包括业务进程变量作为输入参数。
32. 根据权利要求27到31中的任何一个权利要求所述的 系统,其中,至少一个数据管理活动包括业务进程变量作为输出参数。
33. 根据权利要求27到32中的任何一个权利要求所述的 系统,其中,至少一个数据管理活动包括数据源定义。
34. 根据权利要求33所述的系统,其中,所述数据源定义包 括将数据源映射到业务进程变量或业务进程变量的一部分。
35. 根据权利要求27到34中的任何一个权利要求所述的 系统,其中,所述操作进一步包括从所述一个或多个数据管理系统接 收结果。
36. 根据权利要求27到35中的任何一个权利要求所述的 系统,其中,第一数据管理活动定义集合引用,并且第二数据管理活 动使用所述集合引用。
37. 根据权利要求27到36中的任何一个权利要求所述的 系统,其中,所述数据管理操作包括查询。
38. 根据权利要求27到37中的任何一个权利要求所述的 系统,其中,每一个数据管理活动都对应于所述一个或多个数据管理活动中的一个.
39. 根据权利要求27到38中的任何一个权利要求所述的 系统,其中,所述操作进一步包括允许创建新的数据管理活动。
全文摘要
提供了用于处理工作流的技术。接收包括一个或多个数据管理活动的工作流。从所述工作流生成包括对所述一个或多个数据管理活动的描述的工作流描述。从所述工作流描述生成一个或多个数据管理操作。针对一个或多个数据管理系统,执行所述一个或多个数据管理操作。
文档编号G06Q10/00GK101116095SQ200680004574
公开日2008年1月30日 申请日期2006年2月27日 优先权日2005年3月1日
发明者奥利弗·苏里, 查尔斯·D.·沃尔夫森, 艾伯特·梅尔, 迈克·格拉塞尔特, 马赛厄斯·塔斯查夫勒, 马赛厄斯·科洛普曼 申请人:国际商业机器公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1