Oracle SOA通过添加Sensor过滤实例(二)
在Composite中添加Sensor后,在EM中Sensor的值有时候是一个xml字符串,并不是实际值,而且通过sensor字段查实例只能用"类似"来查询不能使用“相等”,更有时候当值是xml类型的时候,通过sensor关键字查询不到实例。
登录到SOA数据源数据库,通过表COMPOSITE_INSTANCE_ID找到实例sensor信息,如下
这里有个VALUE_TYPE字段,如果该字段为2005则sensor的值就以xml的形式保存在CLOB_VALUE里,如果该字段的值为12则sensor就以实际值保存在STRING_VALUE字段里,因此一种解决方法就是将CLOB_VALUE里面的值写到STRING_VALUE再将VALUE_TYPE改为12,但最好的解决方法是在composite中修改sensor的值类型。
回到JDeveloper中,一般JCA适配器组件比如DBAdapter,BAMAdapter等都会从数据源中自动解析数据类型生成的相应的xsd文件,如果是字符串类型,则做如下的解析:
<element minOccurs="0" name="_ID"> <simpleType> <restriction base="xsd:string"> <maxLength value="100"/> </restriction> </simpleType> </element>
系统将字符串类型解析成了simpleType类型,为该字段添加sensor后,打开sensor.xml文件
<?xml version="1.0" encoding="UTF-8"?> <sensors xmlns="http://xmlns.oracle.com/bpel/sensor"> <sensor sensorName="ID" kind="reference" target="undefined" filter="" xmlns:imp1="http://xmlns.oracle.com/bam"> <referenceConfig reference="InsertOrder" expression="$in._Order1Collection/imp1:_Order1Collection/imp1:_Order1/imp1:_ID" operation="writetoBAM" outputDataType="anonymous" outputNamespace="anonymous"/> </sensor> </sensors>
outputDataType的类型为anonymous,如果类型为anonymou则sensor的值就会以xml的形式存储。
找到原因后解决方法就很简单,一个是修改xsd文件将类型修改为xsd:string类型,比如上面的xml可以做如下修改
<element name="_ID" type="xsd:string" />
然后删除sensor.xml文件重新添加sensor,但这样做会丢失验证信息,不建议修改xsd文件。
最好的解决方法是修改sensor.xml文件,将outputDataType修改为string并修改名称空间,如上面的sensor.xml可以做如下修改
<?xml version="1.0" encoding="UTF-8"?> <sensors xmlns="http://xmlns.oracle.com/bpel/sensor"> <sensor sensorName="ID" kind="reference" target="undefined" filter="" xmlns:imp1="http://xmlns.oracle.com/bam"> <referenceConfig reference="InsertOrder" expression="$in._Order1Collection/imp1:_Order1Collection/imp1:_Order1/imp1:_ID" operation="writetoBAM" outputDataType="string" outputNamespace="http://www.w3.org/2001/XMLSchema"/> </sensor> </sensors>
这样就可以解决EM中sensor的值以xml形式出现的问题,也可以对sensor的值进行精确查找。
PS:如果修改outputDataType后发现EM中sensor没有值,那可能是sensor记录的字段不是字符串类型,则要做相应的类型转换。