ibm bpm开发 手册
IBM®Business Process Manager(BPM)Advanced V8和最新版本包括一个内部数据处理程序组件,该组件将数据从通用数据格式转换为Java™对象以实现commonj.sdo.DataObject
接口。 它可以管理各种数据格式,例如JavaScript对象表示法(JSON),XML,SOAP,并发版本系统(CVS)和固定宽度。
但是您的数据可能更复杂。 例如,考虑航空航天工业,飞机的一部分(例如机身)可能包含嵌套和重复的部件(例如舷窗),也包含嵌套的部件(例如螺钉和螺母)。 或者考虑一个检查过程的文档,其中包含一个主标题和许多嵌套的文档,这些文档描述了每个特定的检查步骤。
本教程说明如何实现自定义数据处理程序来管理固定宽度的数据,该数据表示具有多个基数的复杂对象。 它还显示了如何将数据处理程序绑定到不同类型的导出,例如Java消息服务(JMS),平面文件和IBM MQ。
如果您在混合云环境中工作,则可以在与云中的IBM BPM流程集成在一起的IBM BPM Advanced模块中实施自定义数据处理程序来管理,转换和处理本地客户数据,以进行人工验证和批准。
本教程中的固定宽度定制数据处理程序是使用IBM BPM API创建的,用于创建定制数据处理程序。 请参阅IBM BPM文档中的“ 开发数据处理程序”主题。
完成本教程所需的内容
- 您必须具有IBM BPM Advanced(包括IBM Integration Designer)的动手经验。
- 您必须精通Java,XML架构定义语言(XSD)和XML解析。
- 您必须安装IBM BPM Advanced(包括IBM Integration Designer)V8.0或更高版本。
- 要跟随本教程中的示例,请从GitHub下载整个项目的代码示例: github.com/elmdor666/HierarchicDataHandler 。 下载项目交换压缩文件,并将其导入到Integration Designer中。 源代码不打算用于生产环境。 使用和修改它需要您自担风险。
XSD文件,IBM BPM数据对象和字节输入流
本教程中的示例解决方案包括以下主要数据结构:
- XSD文件,用于描述数据结构。
- IBM BPM数据对象,该对象在IBM BPM中创建并基于XSD文件。
- 字节输入流,它是IBM BPM处理的外部数据。
XSD文件
对象结构是在一个或多个IBM BPM模块中导入的XSD文件中定义的,以便可以处理对应的commonj.sdo.DataObject
。
考虑一个描述电影的数据结构(括号中为字段类型和大小,仅适用于简单类型):
MOVIE
- Title (String L50)
- Year (String L4)
- Genre (String L10)
- Directors (List of MOVIE_DIRECTOR)
- MovieAwards (List of MOVIE_AWARD)
- Actors (List of MOVIE_ACTOR)
MOVIE_DIRECTOR
- Name (String L50)
- DateOfBirth (String L10)
- DirectedMovie (List of String L50)
MOVIE_AWARD
- Name (String L50)- Year (String L4)
- Category (String L20)
MOVIE_ACTOR
- Role (String L20)
- Name (String L50)
- DateOfBirth (String L10)
- WorkedOnMovie (List of String L50)
- Awards (List of MOVIE_AWARD)
以下四个XSD文件代表数据:
-
MOVIE.xsd
:<?xml version="1.0" encoding="UTF-8"?> <xs:schema elementFormDefault="qualified" targetNamespace="http://www.ibm.com/bpm/schema/MOVIE" xmlns:MOVIE_DIRECTOR="http://www.ibm.com/bpm/schema/MOVIE_DIRECTOR" xmlns:MOVIE_ACTOR="http://www.ibm.com/bpm/schema/MOVIE_ACTOR" xmlns:MOVIE_AWARD="http://www.ibm.com/bpm/schema/MOVIE_AWARD" xmlns:bx="http://www.ibm.com/bpm/schema" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:import namespace="http://www.ibm.com/bpm/schema/MOVIE_DIRECTOR" schemaLocation="MOVIE_DIRECTOR.xsd"/> <xs:import namespace="http://www.ibm.com/bpm/schema/MOVIE_ACTOR" schemaLocation="MOVIE_ACTOR.xsd"/> <xs:import namespace="http://www.ibm.com/bpm/schema/MOVIE_AWARD" schemaLocation="MOVIE_AWARD.xsd"/> <xs:element name="MOVIE"> <xs:annotation> <xs:appinfo> <bx:boDefinition version="3.0.0"/> </xs:appinfo> </xs:annotation> <xs:complexType> <xs:sequence> <xs:element default="" minOccurs="0" name="Title"> <xs:annotation> <xs:documentation/> <xs:appinfo> <bx:boAttribute> <bx:attributeInfo isKey="true"/> </bx:boAttribute> </xs:appinfo> </xs:annotation> <xs:simpleType> <xs:restriction base="xs:string"> <xs:maxLength value="50"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element default="" minOccurs="0" name="Year"> <xs:annotation> <xs:documentation/> </xs:annotation> <xs:simpleType> <xs:restriction base="xs:string"> <xs:maxLength value="4"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element default="" minOccurs="0" name="Genre"> <xs:annotation> <xs:documentation/> </xs:annotation> <xs:simpleType> <xs:restriction base="xs:string"> <xs:maxLength value="10"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element minOccurs="0" name="Directors"> <xs:annotation> <xs:documentation/> <xs:appinfo> <bx:boAttribute> <bx:childObjectInfo version="3.0.0"/> </bx:boAttribute> </xs:appinfo> </xs:annotation> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" ref="MOVIE_DIRECTOR:MOVIE_DIRECTOR"/> </xs:sequence> <xs:attribute default="1" name="size" type="xs:positiveInteger"/> </xs:complexType> </xs:element> <xs:element minOccurs="0" name="MovieAwards"> <xs:annotation> <xs:documentation/> <xs:appinfo> <bx:boAttribute> <bx:childObjectInfo version="3.0.0"/> </bx:boAttribute> </xs:appinfo> </xs:annotation> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" ref="MOVIE_AWARD:MOVIE_AWARD"/> </xs:sequence> <xs:attribute default="1" name="size" type="xs:positiveInteger"/> </xs:complexType> </xs:element> <xs:element minOccurs="0" name="Actors"> <xs:annotation> <xs:documentation/> <xs:appinfo> <bx:boAttribute> <bx:childObjectInfo version="3.0.0"/> </bx:boAttribute> </xs:appinfo> </xs:annotation> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" ref="MOVIE_ACTOR:MOVIE_ACTOR"/> </xs:sequence> <xs:attribute default="1" name="size" type="xs:positiveInteger"/> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
-
MOVIE_DIRECTOR.xsd
:<?xml version="1.0" encoding="UTF-8"?> <xs:schema elementFormDefault="qualified" targetNamespace="http://www.ibm.com/bpm/schema/MOVIE_DIRECTOR" xmlns:bx="http://www.ibm.com/bpm/schema" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="MOVIE_DIRECTOR"> <xs:annotation> <xs:appinfo> <bx:boDefinition version="3.0.0"/> </xs:appinfo> </xs:annotation> <xs:complexType> <xs:sequence> <xs:element default="" minOccurs="0" name="Name"> <xs:annotation> <xs:documentation/> <xs:appinfo> <bx:boAttribute> <bx:attributeInfo isKey="true"/> </bx:boAttribute> </xs:appinfo> </xs:annotation> <xs:simpleType> <xs:restriction base="xs:string"> <xs:maxLength value="50"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element default="" minOccurs="0" name="DateOfBirth"> <xs:annotation> <xs:documentation/> </xs:annotation> <xs:simpleType> <xs:restriction base="xs:string"> <xs:maxLength value="10"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element default="" minOccurs="0" name="DirectedMovie" maxOccurs="unbounded"> <xs:annotation> <xs:documentation/> </xs:annotation> <xs:simpleType> <xs:restriction base="xs:string"> <xs:maxLength value="50"></xs:maxLength> </xs:restriction> </xs:simpleType> </xs:element> </xs:sequence> </xs:complexType> </xs:element </xs:schema>
-
MOVIE_ACTOR.xsd:
<?xml version="1.0" encoding="UTF-8"?> <xs:schema elementFormDefault="qualified" targetNamespace="http://www.ibm.com/bpm/schema/MOVIE_ACTOR" xmlns:MOVIE_AWARD="http://www.ibm.com/bpm/schema/MOVIE_AWARD" xmlns:bx="http://www.ibm.com/bpm/schema" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:import namespace="http://www.ibm.com/bpm/schema/MOVIE_AWARD" schemaLocation="MOVIE_AWARD.xsd"/> <xs:element name="MOVIE_ACTOR"> <xs:annotation> <xs:appinfo> <bx:boDefinition version="3.0.0"/> </xs:appinfo> </xs:annotation> <xs:complexType> <xs:sequence> <xs:element default="" minOccurs="0" name="Role"> <xs:annotation> <xs:documentation/> </xs:annotation> <xs:simpleType> <xs:restriction base="xs:string"> <xs:maxLength value="20"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element default="" minOccurs="0" name="Name"> <xs:annotation> <xs:documentation/> <xs:appinfo> <bx:boAttribute> <bx:attributeInfo isKey="true"/> </bx:boAttribute> </xs:appinfo> </xs:annotation> <xs:simpleType> <xs:restriction base="xs:string"> <xs:maxLength value="50"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element default="" minOccurs="0" name="DateOfBirth"> <xs:annotation> <xs:documentation/> </xs:annotation> <xs:simpleType> <xs:restriction base="xs:string"> <xs:maxLength value="10"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element default="" minOccurs="0" name="WorkedOnMovie" maxOccurs="unbounded"> <xs:annotation> <xs:documentation/> </xs:annotation> <xs:simpleType> <xs:restriction base="xs:string"> <xs:maxLength value="50"></xs:maxLength> </xs:restriction> </xs:simpleType> </xs:element> <xs:element minOccurs="0" name="Awards"> <xs:annotation> <xs:documentation/> <xs:appinfo> <bx:boAttribute> <bx:childObjectInfo version="3.0.0"/> </bx:boAttribute> </xs:appinfo> </xs:annotation> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" ref="MOVIE_AWARD:MOVIE_AWARD"/> </xs:sequence> <xs:attribute default="1" name="size" type="xs:positiveInteger"/> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
-
MOVIE_AWARD.xsd
:<?xml version="1.0" encoding="UTF-8"?> <xs:schema elementFormDefault="qualified" targetNamespace="http://www.ibm.com/bpm/schema/MOVIE_AWARD" xmlns:bx="http://www.ibm.com/bpm/schema" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="MOVIE_AWARD"> <xs:annotation> <xs:appinfo> <bx:boDefinition version="3.0.0"/> </xs:appinfo> </xs:annotation> <xs:complexType> <xs:sequence> <xs:element default="" minOccurs="0" name="Name"> <xs:annotation> <xs:documentation/> <xs:appinfo> <bx:boAttribute> <bx:attributeInfo isKey="true"/> </bx:boAttribute> </xs:appinfo> </xs:annotation> <xs:simpleType> <xs:restriction base="xs:string"> <xs:maxLength value="50"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element default="" minOccurs="0" name="Year"> <xs:annotation> <xs:documentation/> </xs:annotation> <xs:simpleType> <xs:restriction base="xs:string"> <xs:maxLength value="4"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element default="" minOccurs="0" name="Category"> <xs:annotation> <xs:documentation/> </xs:annotation> <xs:simpleType> <xs:restriction base="xs:string"> <xs:maxLength value="20"/> </xs:restriction> </xs:simpleType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
IBM BPM数据对象
您可以通过以下步骤将XSD文件导入IBM BPM模块(也称为中介模块)中的Integration Designer:
- 在“业务集成”透视图中,单击文件>新建>模块,然后添加您的信息。 然后,右键单击模块的数据部分,然后选择导入 。
- 对于导入源,选择WSDL和XSD 。
- 在下一个窗口中,选择Local WSDL或XSD文件,或选择Both 。
- 在“导入”窗口的
\DataHandler\xsd
源目录中,选择MOVIE.xsd 。如以下屏幕截图所示,请确保选中“ 导入依赖资源”复选框,并确保显示了MOVIE_DIRECTOR.xsd , MOVIE_ACTOR.xsd和MOVIE_AWARD.xsd ,以便解析并导入所有依赖资源。
现在,对象在模块的“数据”部分中可用,如以下屏幕截图所示:
您可以以图形方式查看对象,如以下屏幕截图所示:
- 现在,重要的是将引用复杂类型对象列表的字段提升为单独的XSD文件,以确保数据处理程序正常工作。 此步骤至关重要,因为
BOFactory
无法创建“包装”数据对象,因为它缺少目标名称空间和元素定义。
右键单击BOFactory
业务对象,然后选择“ 将私有业务对象设为公共” ,然后选择“ 复制到另一个XSD文件” 。 - 指定文件名,如以下屏幕截图所示:
如以下三个屏幕截图所示,将创建一个新的XSD文件,该文件指定父对象的相同目标名称空间。 (您必须为每个私人业务对象完成此操作。)
查看以下生成的XSD源:
-
Directors
:<?xml version="1.0" encoding="UTF-8"?> <xsd:schema targetNamespace="http://www.ibm.com/bpm/schema/MOVIE" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:bx="http://www.ibm.com/bpm/schema" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:MOVIE_DIRECTOR="http://www.ibm.com/bpm/schema/MOVIE_DIRECTOR"> <xsd:import schemaLocation="MOVIE_DIRECTOR.xsd" namespace="http://www.ibm.com/bpm/schema/MOVIE_DIRECTOR"> </xsd:import> <xs:element name="Directors"> <xs:annotation> <xs:documentation /> <xs:appinfo> <bx:boAttribute> <bx:childObjectInfo version="3.0.0" /> </bx:boAttribute> </xs:appinfo> </xs:annotation> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" ref="MOVIE_DIRECTOR:MOVIE_DIRECTOR" /> </xs:sequence> <xs:attribute default="1" name="size" type="xs:positiveInteger" /> </xs:complexType> </xs:element> </xsd:schema>
-
Actors
:<?xml version="1.0" encoding="UTF-8"?> <xsd:schema targetNamespace="http://www.ibm.com/bpm/schema/MOVIE" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:bx="http://www.ibm.com/bpm/schema" xmlns:MOVIE_ACTOR="http://www.ibm.com/bpm/schema/MOVIE_ACTOR" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xsd:import schemaLocation="MOVIE_ACTOR.xsd" namespace="http://www.ibm.com/bpm/schema/MOVIE_ACTOR"> </xsd:import> <xs:element name="Actors"> <xs:annotation> <xs:documentation /> <xs:appinfo> <bx:boAttribute> <bx:childObjectInfo version="3.0.0" /> </bx:boAttribute> </xs:appinfo> </xs:annotation> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" ref="MOVIE_ACTOR:MOVIE_ACTOR" /> </xs:sequence> <xs:attribute default="1" name="size" type="xs:positiveInteger" /> </xs:complexType> </xs:element> </xsd:schema>
-
MovieAwards
:<?xml version="1.0" encoding="UTF-8"?> <xsd:schema targetNamespace="http://www.ibm.com/bpm/schema/MOVIE" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:bx="http://www.ibm.com/bpm/schema" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:MOVIE_AWARD="http://www.ibm.com/bpm/schema/MOVIE_AWARD"> <xsd:import schemaLocation="MOVIE_AWARD.xsd" namespace="http://www.ibm.com/bpm/schema/MOVIE_AWARD"> </xsd:import> <xs:element name="MovieAwards"> <xs:annotation> <xs:documentation /> <xs:appinfo> <bx:boAttribute> <bx:childObjectInfo version="3.0.0" /> </bx:boAttribute> </xs:appinfo> </xs:annotation> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" ref="MOVIE_AWARD:MOVIE_AWARD" /> </xs:sequence> <xs:attribute default="1" name="size" type="xs:positiveInteger" /> </xs:complexType> </xs:element> </xsd:schema>
字节输入流
根据上一节中定义的数据结构,以下截屏显示了字节输入流的格式:
以下规则适用于输入流:
- 输入流中描述复杂对象的每个部分都以对象名称开头。
- 每个字段都有固定的宽度,如果值不满足其大小,则用特殊字符填充。
- 当属性是简单对象的列表(例如
MOVIE_DIRECTOR
的"DirectedMovie"
元素)时,通过在值列表之前使用4个字节来指定基数。 - 当属性是复杂类型的列表(例如
MOVIE_ACTOR
的"Awards"
)时,请在复杂对象字段值之前使用4个字节指定基数,后跟对象名称(在本示例中为MOVIE_AWARDS
)。 - 如果输入流中不存在子对象,则表示基数的4个字节的值为0,而没有对象名称。
解决方案图
以下解决方案图包括定制数据处理程序的所有高级组件:
![解决方案图,例如自定义数据处理程序](https://i-blog.csdnimg.cn/blog_migrate/74c2cb542ecf3fe723436f0ebd563b7f.png)
Java实现
本教程中的示例定制数据处理程序项目被实现为Java EE连接器体系结构(JCA)模块,该模块由三个主要包组成:
-
com.ibm.it.issw.utils.datahandler
,用于实现数据处理程序。 -
com.ibm.it.issw.utils.xsd
,用于XSD解析器实现。 -
com.ibm.it.issw.utils.logging
,用于基于java.util.logging.Logger
的定制记录器。
您可以在以下屏幕截图中看到软件包:
XSDParser类
XSDParser
类实现了解析器,该解析器从XSD文件中提取定制数据处理程序将数据输入流转换为业务对象所需的所有信息。
它将信息保存在以下类属性中:
-
private String objectName;
XSD文件中主要元素的名称 -
private ParsedXSD parsedAttribues;
用于XSD文件元素 -
private Hashtable<String, XSDParser> parsedXSDs;
用于导入的XSD文件中包含的元素
使用以下方法访问属性:
-
public String getObjectName();
-
public ParsedXSD getParsedAttribues();
-
public Hashtable<String, XSDParser> getParsedXSDs();
解析器的主要功能在parseXSDToProperties
方法中,该方法将XSD文件的xs:elements
转换为ParsedXSD
类型的属性。
XSD文件必须具有类似于Movie示例所描述的结构:
-
xs:schema
标记仅包含1个xs:element
,代表数据对象的名称。 - 主要
xs:element
包含xs:complexType
,其具有xs:sequence
的xs:element
。 - 序列中的每个
xs:element
可以是以下元素之一: - 一个简单的元素是
xs:simpleType
标记,其中包含一个xs:restriction
标记,该标记在嵌套的xs:maxLength
标记(带有属性值)中指定元素的固定长度。 - 一个简单元素的列表是
xs:element
,具有前面描述的相同特征,并且maxOccurs
属性设置为"unbounded"
。 - 一个复杂的元件是
xs:complexType
标签包含一个xs:sequence
的xs:element
与所述datatype
中的属性引用名称。 名称必须与包含数据类型定义的XSD文件的名称相同。
例如, MOVIE_DIRECTOR
XSD文件具有<xs:element maxOccurs="unbounded" ref="MOVIE_DIRECTOR:MOVIE_DIRECTOR"/>
作为序列的xs:element
,而<xs:import namespace="http://www.ibm.com/bpm/schema/MOVIE_DIRECTOR" schemaLocation="MOVIE_DIRECTOR.xsd"/>
作为数据类型定义的导入。
方法签名是public void parseXSDToProperties() throws XSDParserException
。
它在应用程序类路径中搜索XSD文件(在首次实例化XSDParser
对象时指定),如果不存在,则在磁盘上搜索。
然后,解析器使用javax.xml.xpath.XPath
(和org.w3c.dom.Document
)来导航XSD并将其信息保存到类的属性中: objectName
属性中的根元素名称和目标名称空间和parsedAttributes
属性中的子元素。
对于简单元素,请使用parsedAttribues
的putAttributeWithInfo
方法保存属性名称和固定长度。
对于简单元素列表,该方法创建一个ParsedXSD
对象,并在其上调用buildStringListObject
方法,并传递属性名称和固定长度。 然后,它将对象设置为新XSDParser
对象的parsedAttributes
,该对象将添加到原始XSDParser
对象的parsedXSDs
属性中,并带有子对象的名称(由buildStringListObject
方法生成)。 最后,它将属性名称和子对象名称保存在原始XSDParser
对象的parsedAttributes
中。
对于复杂元素,该方法以递归方式启动子元素XSD文件上的parseXSDToProperties
方法,并将相关信息(包含在子XSDParser
对象中)保存到parsedXSDs
属性中。 最后,它将属性名称和子对象名称保存在该类的parsedAttributes
属性中。
XSDParser
类还具有一个public String printParsedXSDs()
方法,可用于打印已解析的属性。 此方法以递归的方式获取整个解析的XSD文件的对象名称,目标名称空间,属性名称以及相关的固定长度或子对象名称,并将它们打印在输出字符串上。
下面的示例显示由printParsedXSDs
方法为MOVIE.xsd
文件生成的输出:
MOVIE:
targetNamespace = http://www.ibm.com/bpm/schema/MOVIE
Title=50
Year=4
Genre=10
Directors=MOVIE_DIRECTOR
MovieAwards=MOVIE_AWARD
Actors=MOVIE_ACTOR
MOVIE\MOVIE_DIRECTOR:
targetNamespace = http://www.ibm.com/bpm/schema/MOVIE_DIRECTOR
Name=50
DateOfBirth=10
DirectedMovie=STRINGLIST_DirectedMovie
MOVIE_DIRECTOR\STRINGLIST_DirectedMovie:
targetNamespace =
STRINGLIST_DirectedMovie=50
MOVIE\MOVIE_AWARD:
targetNamespace = http://www.ibm.com/bpm/schema/MOVIE_AWARD
Name=50
Year=4
Category=20
MOVIE\MOVIE_ACTOR:
targetNamespace = http://www.ibm.com/bpm/schema/MOVIE_ACTOR
Role=20
Name=50
DateOfBirth=10
WorkedOnMovie=STRINGLIST_WorkedOnMovie
Awards=MOVIE_AWARD
MOVIE_ACTOR\STRINGLIST_WorkedOnMovie:
targetNamespace =
STRINGLIST_WorkedOnMovie=50
MOVIE_ACTOR\MOVIE_AWARD:
targetNamespace = http://www.ibm.com/bpm/schema/MOVIE_AWARD
Name=50
Year=4
Category=20
ParsedXSD类
使用ParsedXSD
类保存与XSD文件的元素有关的信息。
该类具有以下两个属性:
-
private String targetNamespace;
XSD文件的目标名称空间 -
private LinkedHashMap<String, String> attributesWithInfo;
XSD文件中存在的属性及其固定长度
使用以下方法来处理类的属性中包含的数据:
-
public LinkedHashMap<String, String> getattributesWithInfo()
方法将属性名称和相关信息的有序列表作为LinkedHasMap
检索。 -
public String getAttributeInfo(String key)
方法将与指定属性相关的信息作为String
检索。 -
public String getTargetNamespace()
方法将targetNamespace
作为String
检索。 - 的
public Set<String> getAttributeNames()
方法检索的属性名称的列表ParsedXSD
对象作为Set
的String
。 -
public void putAttributeWithInfo(String key, String value)
方法将一个元素添加到attributeWithInfo
列表中,并将其放置在有序列表的末尾。 -
public void setTargetNamespace(String targetNamespace)
方法使用传入的值作为输入参数覆盖targetNamespace
属性。 -
public boolean isSimpleAttribute(String key)
方法检查作为输入参数传递的属性是否为简单类型(如果与该属性关联的信息是数字)。 -
public boolean isStringListAttribute(String key)
方法检查作为输入参数传递的属性是否为字符串列表类型(如果与该属性关联的信息以STRINGLIST_
前缀开头)。 -
public String buildStringListObject(String attributeName, String elementLenght)
方法将当前对象的targetNamespace
属性设置为空字符串。 它使用putAttributeWithInfo
方法将添加attributeName
(与改性STRINGLIST_
前缀)和elementLength
作为有序属性的列表的唯一元素ParsedXSD
对象。 - 所述
public String printToString()
方法检索目标的名称空间,属性名称,以及用于相关的固定长度或子对象名称ParsedXSD
对象,并打印他们的输出字符串。
HierarchicFixedWidthDHProperties类
定制分层固定宽度数据处理程序具有以下属性,可以配置:
-
protected char padCharacter;
property是填充字符,将在数据流中使用填充字符,以供数据处理程序进行解析,以使属性值具有适当的固定长度。 它的初始值为空白。 -
protected int dataObjectNameSize;
属性是包含业务对象名称的输入数据流部分的长度。 初始值为40。 -
protected int verbSize;
property是包含动词的输入数据流部分的长度。 它的初始值为10。如果不存在动词(如在Movie示例中),则此属性必须设置为0
。 -
protected String xsdFileName;
property是包含业务对象定义的XSD文件的名称。 如果它在Integration Designer类路径中(如果在创建数据处理程序之前导入XSD对象定义,则为true),则必须仅指定文件名。 否则,需要完整路径。 -
protected XSDParser xsdParser;
属性是XSDParser
对象,其中包含从xsdFileName
属性中指定的XSD文件检索的信息。 指定xsdFileName
时,无法配置此属性,并且会自动设置此属性。 在数据处理程序创建窗口中添加xsdFileName
属性时,将解析相关的XSD文件,并将其信息保存在xsdParsed
属性中。
HierarchicFixedWidthDH类
HierarchicFixedWidthDH
类实现DataHandler
接口,该接口实现以下三种方法:
-
public Object transform(Object source, Class targetClass, Object options) throws DataHandlerException
此方法读取输入流中包含的数据。 它作为Object
在源参数中传递。 它将targetClass
类型的数据对象中的数据写入输出Object
参数。 -
public void transformInto(Object source, Object target, Object options) throws DataHandlerException
此方法将作为对象在源输入参数中传递的数据转换为目标对象。 -
public void setBindingContext(Map context)
此方法将数据处理程序的bindingContext
设置为提供的映射值。
该HierarchicFixedWidthDH
类具有相同的属性HierarchicFixedWidthDHProperties
类和以下附加属性:
-
private String dataObjectString;
属性是将输入对象流转换为String
。 -
private int dataObjectStringLength;
attribute是转换为String
的输入流的长度。 -
private Map bindingContext;
属性是包含HierarchicFixedWidthDHProperties
作为Map
的对象。
transform
方法首先将输入流从可能的输入( InputStream
, Reader
, byte[]
, String
)转换为String
,将其保存到dataObjectString
属性,然后将其长度计算到dataObjectStringLength
属性中。 然后,它调用受保护的方法getDataObjectFromString
以从生成的String
读取数据对象。
protected DataObject getDataObjectFromString(DataObject dataObject) throws HierarchicFixedWidthDHException
方法是在自定义数据处理程序中实现的方法之一。
考虑getDataObjectFromString
方法的以下操作:
- 它从绑定上下文中加载配置,并在数据处理程序对象(
setupConfig
方法)中设置相对属性。 - 它读取数据对象名称和动词(
getDataObjectName
方法)。 - 它实例化与所述检索到的新的数据对象
targetNamespace
和objectName
(createByElement
所述的方法com.ibm.websphere.bo.BOFactory
类)。 - 它调用
parseAllProperties
方法以递归地从输入流String
检索所有信息。
protected void parseAllProperties(DataObject dataObject, XSDParser parsedXSD) throws HierarchicFixedWidthDHException
方法是在自定义数据处理程序中实现的方法之一。
在parseAllProperties
对方法迭代attributeWithInfo
条目组的parsedAttributes
包含在所述parsedXSD
输入参数。
考虑每个属性的以下行为:
- 如果它是简单属性,则该方法从输入流中读取相关的字节数并设置属性值(
dataObject.setString
方法) - 如果它不是简单的属性,则该方法从输入流中读取子对象的数量。 然后,继续进行以下操作:
- 如果该属性是字符串列表,则创建一个
List<String>
,并读取指定数量的相对长度的字符串并将其添加到列表中。 然后,它将列表添加到数据对象(dataObject.setList
方法)。 - 如果属性是一个复杂的类型,它实例用一个新的数据对象
targetNamespace
数据对象和objectName
儿童(createByElement
所述的方法com.ibm.websphere.bo.BOFactory
类),创建了一个List<DataObject>
包含所有子对象。 然后,对每个子对象,它检索对象名称(getDataObjectName
从输入流的方法),创建一个子对象(createByElement
的方法com.ibm.websphere.bo.BOFactory
类),并调用parseAllProperties
方法来检索所有来自输入流String
的信息。 然后,它将子对象添加到列表中,并将列表添加到数据对象中。
使用平面文件适配器和JMS导出进行测试
现在,在本教程中学习如何实现用于测试解决方案的模块。 该模块在IBM BPM中包含两个不同的导出组件:
- 平面文件适配器导出
- JMS导出
- 首先,创建一个名为TestMovieSource的模块。
- 导入定义MOVIE结构的每个XSD文件(按照上一节中的步骤操作)。
新模块如下图所示:
- 在同一工作空间中,导入
HierarchicFixedWidthDH
项目并将其添加到TestMovieSource
Java EE Dependencies。 如以下屏幕截图所示,请确保选中“ 使用模块部署”复选框: - 要创建第一个导出,请打开模块装配图,然后从面板中拖动平面文件入站适配器 。
- 选择简单的选项,如以下屏幕截图所示,然后单击下一步 :
- 如以下屏幕截图所示,将FlatFileExport名称重命名为MovieExport ,然后单击Next。
- 对于业务对象,单击浏览 ,然后选择MOVIE对象作为要管理的主要对象。
- 指定轮询目录,例如
C:\tmp\MOVIE
,然后单击下一步 。 - 选择其他作为数据类型,然后单击选择以指定自定义数据处理程序。
- 选择从工作空间中选择您的自定义数据格式转换 ,然后单击选择 。
- 选择HierarchicFixedWidthDH Java类,如以下屏幕截图所示:
现在
The HierarchicFixedWidthDH
将打开The HierarchicFixedWidthDH
配置窗口,如以下屏幕截图所示:您可以编辑以下信息:
- 输入流中数据对象名称的大小(以字节为单位)。
- 填充字符(一个字符,默认为空白)。
- 动词大小(以字节为单位)。 一些流可能会定义动词,例如create。
- 根
.xsd
文件名。 在模块数据中搜索该文件并进行解析。 如果未找到,则错误消息将显示在属性窗格的顶部。
- 为数据处理程序配置命名,然后单击完成 。
您会看到创建了一个新接口来管理
MOVIE
对象,如以下屏幕截图所示: - 现在创建一个JMS入站导出,并选择与平面文件导出相同的接口。 在JMS导出绑定配置中,为激活规范和目标指定JNDI名称,如以下屏幕截图所示,然后单击Finish 。
这些资源是在部署模块的IBM BPM应用程序服务器运行时环境中创建的。
JMS导出必须定义与平面文件导出相同的定制数据处理程序,如以下两个屏幕截图所示:
- 从面板创建中介流组件,以在从平面文件适配器或JMS导出接收到MOVIE对象时处理该对象。 此中介流组件实现两个导出的相同接口。
现在,组装图看起来像以下屏幕截图:
![装配图的屏幕截图](https://i-blog.csdnimg.cn/blog_migrate/1b429be5de352d012558bd92e12adb23.png)
以下截屏显示了中介实现。 中介实现仅包含用于记录MOVIE服务消息对象的自定义转换。
![中介流程的屏幕截图](https://i-blog.csdnimg.cn/blog_migrate/0503dd7274598e0cdfb2178a52c42fe2.png)
以下屏幕截图显示了中介流的日志组件:
在以下两种情况之一中触发此方案:
- 文本文件(包含上一节中描述的流)被移动到在平面文件导出属性(在此示例中为
C:\tmp\MOVIE
中指定的轮询目录中。 - 相同的数据在名为
jms/MovieQueue
的目标队列中发送。
结论
本教程中的定制数据处理程序样本是管理非标准(例如XML)数据结构的基础,或者在您无法使用IBM BPM标准固定宽度数据处理程序的情况下(因为输入字节流具有分层数据结构)是基础。
在本教程中,您学习了如何为IBM BPM实现定制数据处理程序,以管理具有复杂和递归结构的固定宽度数据。
现在,您可以使用IBM BPM中的数据处理程序接口来实现自己的定制数据处理程序。 使用新的定制数据处理程序,您可以管理超越默认IBM BPM数据处理程序功能的各种非标准数据结构。
致谢
作者要感谢Antonio Dell'Olio对本文的评论和评论。
翻译自: https://www.ibm.com/developerworks/library/mw-1707-pinzauti/1707-pinzauti.html
ibm bpm开发 手册