在开发uddi的客户端程序时,我们一般考虑的都是ibm提供的uddi4j,但不知道大家注意到没有,在bea的weblogic中也提供了一个非常方便的uddi client api。只是它被包含在weblogic.jar文件中而没有单独发布。weblogic uddi client api的结构完全遵循了uddi的体系结构,所以,通过对这套api类库的学习和实践,相信也有助于我们更好地理解uddi的体系架构。
inquiry和publish的基础
对uddi注册中心的操作不外乎两大类:查询和发布(删除)。所以weblogic定义了二个类,分别对应查询与发布的操作:inquiry类用于查询,publish类用于发布。这两个类位于weblogic.uddi.client.service包里,它们都继承于uddiservice类。在uddiservice类里定义了一个url属性,保存着查询或发布的url地址。
inquiry和publish类通过父类uddiservice的seturl方法来设置它们的查询或发布地址。
查询 inquiry
向uddi注册中心查询的目标有四类:商业实体(businessentity)、商业服务(businessservice)、绑定模板信息(bindingtemplate)和tmodel。我们来看inquiry类里的方法,不难发现,这四种目标的查询,正对应inquiry类里的四个find方法:
它包括两类方法find和get,其中find类方法用于查找与发现,而get类方法用于获取详细信息。
四个find方法对应四种查询,五个get方法对应uddi定义的四个数据模型(商业实体对应两个方法)。
一般查询的步骤是先通过find方法得到数据模型的基本信息,以及它的一个唯一标识key。然后就可以根据这个key调用get方法获取这个模型的详细信息。
商业实体(businessentity)查询
通过inquiry类定义的findbusiness方法结合getbusinessdetail方法可以在uddi注册中心数据库中查询商业实体的各种信息。
findbusiness方法要求一个findbusiness对象作为参数,用来定义查询的条件。
构建findbusiness对象并设置它的一些属性,比如setname(new name(“ibm”),查询以ibm命名的商业实体。
查询结果可以得到所有满足查询条件的businessinfo对象的vector。
businessinfo定义了商业实体的基本信息,比较重要的是name和businesskey。
getbusinessdetail方法根据businesskey的值可以得到businessentity对象的vector。
在businessentity对象中定义了多个商业实体的详细信息,包括contact、operator、discoveryurl、description,以及category和identifier信息。
下面是一段简化的代码,演示了如何根据参数查询businessentity的信息。
| void echobusiness(string parm){ try { findbusiness fb = new findbusiness(); fb.setname(new name(parm)); vector vbusinessinfo = finder.findbusiness(fb).getbusinessinfos().getbusinessinfovector(); for(int i=0;i businessinfo binfo = (businessinfo)vbusinessinfo.elementat(i); log(binfo.getname().getvalue()+" ["+binfo.getbusinesskey()+"]"); getbusinessdetail gbt = new getbusinessdetail(); gbt.addbusinesskey(binfo.getbusinesskey()); vector vbusinessentity = finder.getbusinessdetail(gbt).getbusinessentityvector(); for(int j=0;j businessentity bentity = (businessentity)vbusinessentity.elementat(j); log( "authorizedname is "+bentity.getauthorizedname() +" operator is "+bentity.getoperator()); } } } catch (exception ex) { ex.printstacktrace(); } } |
虽然在inquiry类中定义了findservice方法,但是一般情况下可以根据查询到的businessinfo对象来进一步查询此businessentity下属的businessservice。注意到在businessinfo类中有一个方法getserviceinfos,它可以帮助我们得到此商业实体所提供的商业服务。
从businessinfo对象可以获取此商业实体下所有的serviceinfo对象的集合。serviceinfo对象定义了商业服务的基本信息,比较重要的有name和servicekey。
类似地,用inquiry类提供的getservicedetail方法可以得到商业服务的详细信息,即businessservice类。它包括商业服务的多种有用信息,如:description,category等。
进一步,根据businessservice类定义的getbindingtemplates方法,又可以取得此服务下的所有绑定模板信息。
在bindingtemplate对象中定义了绑定模板的一些重要属性,如:accesspoint等。
再进一步,可以从bindingtemplate中提供的方法gettmodelinstancedetails中获取tmodel instance的详细信息,即instancedetails对象。包括有overviewdoc。
从overviewdoc可以得到overviewurl,这就是我们在发布webservice时的wsdl的url地址。
下面,笔者也给出一段代码演示了这个查询过程:
| void echobusiness2(string parm){ try { file://查询businessinfo findbusiness fb = new findbusiness(); fb.setname(new name(parm)); vector vbusinessinfo =finder.findbusiness(fb).getbusinessinfos().getbusinessinfovector(); for(int i=0;i businessinfo binfo = (businessinfo)vbusinessinfo.elementat(i); log(binfo.getname().getvalue()+" ["+binfo.getbusinesskey()+"]"); file://查询serviceinfo vector vserviceinfo = binfo.getserviceinfos().getserviceinfovector(); for(int j=0;j serviceinfo sinfo = (serviceinfo)vserviceinfo.elementat(j); log(sinfo.getname().getvalue()+"["+sinfo.getservicekey()+"]"); file://查询businessservice getservicedetail gsd = new getservicedetail(); gsd.addservicekey(sinfo.getservicekey()); vector vbusinessservice = finder.getservicedetail(gsd).getbusinessservicevector(); for(int k=0;k businessservice bservice = (businessservice)vbusinessservice.elementat(k); file://查询bindingtemplate vector vbindingtemplate = bservice.getbindingtemplates().getbindingtemplatevector(); for(int p=0;p bindingtemplate btemplate = (bindingtemplate)vbindingtemplate.elementat(p); log(btemplate.getaccesspoint().getvalue()); file://查询tmodelinstanceinfo vector vtmodelinstanceinfo = btemplate.gettmodelinstancedetails().gettmodelinstanceinfovector(); for(int q=0;q tmodelinstanceinfo tminstanceinfo = (tmodelinstanceinfo)vtmodelinstanceinfo.elementat(q); file://直接显示了instancedetails的overviewdoc的信息 log(tminstanceinfo.getinstancedetails().getoverviewdoc().getoverviewurl().getvalue()); } } } } } } catch (exception ex) { ex.printstacktrace(); } } |
这段代码比较长,嵌套很多,但是理清了头绪相信读者还是能够看明白的。无非就是一层层查询:从businessinfo -> serviceinfo -> businessservice -> bindingtemplate -> tmodelinstanceinfo -> instancedetail,最后显示它的overviewdoc的url值。
查询tmodel
tmodel的查询有两条路,一条是上面的从businessinfo开始的层级查询,最终得到tmodel的instacedetail对象。另一条路则也是从inquiry开始的,用find方法查询全部的tmodel数据模型。
先从inquiry对象的findtmodel方法查询全部合乎条件的tmodel对象,同样要求有输入参数findtmodel对象定义查询条件。
然后,同样用gettmodeldetail方法取得tmodel对象的详细信息,即tmodel类。它包括了tmodel的主要属性,如category,identifier,operator,overviewdoc等等。
下面这段代码演示了这种查询过程:
| void echotmodel(string param){ try { findtmodel ftm = new findtmodel(); ftm.setname(new name(param)); vector vtmodelinfo = finder.findtmodel(ftm).gettmodelinfos().gettmodelinfovector(); for(int j=0;j tmodelinfo tinfo = (tmodelinfo)vtmodelinfo.elementat(j); log(tinfo.getname().getvalue()+"["+tinfo.gettmodelkey()+"]"); gettmodeldetail gtd = new gettmodeldetail(); gtd.addtmodelkey(tinfo.gettmodelkey()); vector vtmodel = finder.gettmodeldetail(gtd).gettmodelvector(); for(int i=0;i tmodel tmodel = (tmodel)vtmodel.elementat(i); log(tmodel.getname().getvalue()+" "+tmodel.getauthorizedname()); } } } catch (exception ex) { ex.printstacktrace(); } } |
闽公网安备 35060202000074号