服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

weblogic uddi client api实例学习(一)


  在开发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();

}

}
businessservice和bindingtemplate的查询

  虽然在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();

 }

}

扫描关注微信公众号