Lists Home |
Date Index |
At 09:43 AM 2004-08-31, Chiusano Joseph wrote:
> or a dynamic retrieval of
those choices from a
> UDDI repository (basically a standards-based way) would be a good
Yes, one can use UDDI to dynamically retrieve a WSDL document of
So if this means retreiving a WSDL document that contains multiple
soap:address values, then that is on target.
If all you need at runtime from a WSDL file is the soap:address, you can
put the URL in the UDDI bindingTemplate/accessPoint, and not bother with
A bindingTemplate allows only one accessPoint, so for load balancing you
would want multiple bindingTemplates.
There are options about how these bindingTemplates are organized in a
- The bindingTemplates could be all within the same
businessService (same businessEntity),
- in different businessService entries (same
- spread across different businessEntities (e.g.,
This last option is an interesting case, and probably not amenable to a
single WSDL with multiple soap:address.
The UDDI Business Registry (UBR) has multiple "operators" (IBM,
Microsoft, SAP) that provide the UDDI SOAP interface to the same
(virtual) data. A query to one should return the same results as
the same query to the others (more or less, depending on latency for
replication among the operators). We can look at UBR's SOAP
interfaces as an example that may be representative of any web
service. Each operator has its own businessEntity .
Each provides the SOAP Inquiry interface, which has a tModel  for the
generic WSDL document (without soap:address). This tModel's
tModelKey appears in the "fingerprint" .
If you search UBR for businesses whose "fingerprint" includes
, (and you drill down on the resulting set of businesses to the
associated bindingTemplate), you will find all bindings that implement
the UDDI SOAP inquiry interface. I found 5 such businessEntities in
the UBR: 3 for UBR itself, one for Systinet , and one that
looks bogus. Now you can't tell that some of these refer to UBR,
and others do not, but that is another issue.
So, given that the UDDI inquiry returns multiple results, the client
would need to decide somehow which one to use. You may be able to
refine the query so that UDDI would return a single binding, or perhaps a
smaller set that you know are all equal in terms of the underlying data
(e.g., the 3 UBR entries ). At design time you want to
think about what UDDI fingerprint should be used for runtime inquiry
(late binding), and design appropriate selection processing into the
If your query was able to narrow down the results to the three UBR
entries, then the consumer can try one, and if unsuccessful, can try
another (i.e., failover).
The UBR operators have no way of load balancing across the three
operators. Any one operator may do load balancing transparently
(e.g., DNS returning a different IP address, or other load balancing
Whether your consumer is designed to look for multiple soap:address
entries in a WSDL, or looks in UDDI as described above, are design time
issues. I refer to this as "Binding Patterns". One
binding pattern would be to look for multiple soap:addresses in a single
WSDL. Another binding pattern might involve UDDI. Other
binding patterns can be used, such as, looking for an inspection.wsil, or
other techniques. This is analogous to the various ways that an
application can be provided with bootstrap info; e.g., look in the
Windows Registry, environment variable, command line parameter, Java
.properties file, or hard-coded default. A web service consumer
application may implement several binding patterns, with a certain
precedence (e.g., command line parameter overrides UDDI
I recommend that a URI be used to identify each binding pattern.
Perhaps a tModel in UBR can be published for each binding pattern.
UBR would assign a tModelKey, and a URL can be constructed using it
(e.g., ). The overviewURL in the tModel would point to a
document that describes the binding pattern. To facilitate
searching for "registered" binding patterns, the tModel used to
register the pattern would include a categoryBag with an appropriate
taxonomy , for example,
keyName="" keyValue="bindingPattern" />