1.1.1 wsdl擴充實現結構
我們知道,在WSDL的標準namespace(xmlns=http://schemas.xmlsoap.org/wsdl/)中,有types,message和portType等標籤。但在BPEL標準的wsdl部分,還有一個很重要的標籤,那就是partnerLinkType。partnerLinkType是wsdl本身不包括的擴充部分,那這些擴充部分在jBPM BPEL中是怎麼樣來實現的呢?我們先來看看下面的jBPM BPEL的WSDL實現階層圖:(這個內容是HongSoft本人正在寫的一本工作流程書中的一小塊的草稿。圖這裡發不了,sorry。這裡寫的不太容易懂,和和,其他部分比較容易懂)
javax.wsdl.* (Sun主導制定的規範介面) |
com.ibm.wsdl.* (IBM的wsdl標準實現) |
org.jbpm.bpel.wsdl.* (jBPM bpel對wsdl的擴充) |
最頂層是javax.wsdl.*,是在JSR中制定的WSDL規範的介面表達,在jBPM BPEL代碼中對應於wsdl4j.jar。第二層是com.ibm.wsdl.*,是IBM公司對wsdl標準的一個實現,基本上沒有加入自己的任何擴充,在jBPM BPEL代碼中對應於wsdl4j.jar。最底層是jBPM對BPEL中WSDL部分的擴充實現,它使用了wsdl4j.jar,然後加入了特殊部分的解析。
1.1.2擴充點註冊器
擴充點註冊器(ExtensionRegistry)是WSDL本身的概念,WSDL使用它來註冊新的擴充點。在wsdl4j.jar的WSDLFactoryImpl.java中,實現了ExtensionRegistry功能,而jBPM就是使用IBM的這個註冊器實現加入了三個擴充點,wsdl4j.jar的實現結構如下::(這個內容是HongSoft本人正在寫的一本工作流程書中的一小塊的草稿。圖這裡發不了,sorry。這裡寫的不太容易懂,和和,其他部分比較容易懂)
1.1.3 擴充點
一個擴充點註冊器可以註冊多個擴充點。擴充點的意思是需要新加入的WSDL標準中沒有規定的新的標籤,比如BPEL的partnerLinkType就是一個擴充點。
每註冊一個擴充點需要確定三個方面的內容:
1)在本流程中,需要能夠把一個partnerLinkType對象序列化為對應的XML檔案,這個XML檔案用來在網路中傳送,然後到對方流程中還原序列化。比如對於partnerLinkType擴充點的實現為registry.registerSerializer(Definition.class, WsdlConstants.Q_PARTNER_LINK_TYPE, plinkTypeSerializer);這裡的plinkTypeSerializer是一個擴充了ExtensionSerializer介面的類。而ExtensionSerializer介面要求必須實現marshall()方法的。
2)如前面所述,對方流程需要能夠把XML檔案還原序列化為partnerLinkType對象。比如對於partnerLinkType擴充點的實現為registry.registerDeserializer(Definition.class, WsdlConstants.Q_PARTNER_LINK_TYPE, plinkTypeSerializer); 這裡的plinkTypeSerializer是一個擴充了ExtensionDeserializer介面的類。而ExtensionDeserializer介面要求必須實現unmarshall ()方法的。
3) 序列化和還原序列化的方法中,都只需要給出對應的partnerLinkType對象的介面就可以了,而真正的使用是需要具體類的。BPEL的WSDL擴充實現了QName和具體類的映射關係如下:registry.mapExtensionTypes(Definition.class, WsdlConstants.Q_PARTNER_LINK_TYPE, PartnerLinkTypeImpl.class);這裡的PartnerLinkTypeImpl是實現了PartnerLinkType介面的具體類。而PartnerLinkType介面是在marshall()方法和unmarshall ()方法中需要使用的。
1.1.4 BPEL的WSDL擴充點
jBPM對WSDL加了三個擴充點,分別用來實現PartnerLinkType功能,Property功能和PropertyAlias功能。具體如表所示:
QName |
序列化 |
還原序列化 |
映射類 |
WsdlConstants. Q_PARTNER_LINK_TYPE |
PartnerLinkType Serializer |
PartnerLinkType Serializer |
PartnerLinkTypeImpl |
WsdlConstants. Q_PROPERTY |
Property Serializer |
Property Serializer |
PropertyImpl |
WsdlConstants. Q_PROPERTY_ALIAS |
PropertyAlias Serializer |
PropertyAlias Serializer |
PropertyAliasImpl |
QName表示“qualified name”,它由兩部分組成:1)name所在的name space;2)name在XML中的元素(element)名稱。一個QName對應一個擴充點,而擴充點註冊器(ExtensionRegistry)用QName作為key值的map來儲存全部的擴充點。
jBPM中的序列化和還原序列化組件都是同時實現了ExtensionDeserializer,ExtensionSerializer, Serializable這三個介面,分開實現其實也是可以的。
映射類用來做到介面與實現的分離,每個映射類都對應了一個介面,這個介面才是jBPM的其他部分所大量使用的。