【Java】Web 服务编程技巧与窍门: 在 UDDI 注册中心为 Web 服务注册开发 UDDI Java 应用程序

本技巧建立了一个使用统一描述、发现和集成 (Universal Description, Discovery, and Integration,UDDI) 来注册应用程序级消费的 Web 服务实例。作者提供了详细的代码示例以及基于 Java 的统一描述、发现和集成 (Universal Description, Discovery,and Integration for Java,UDDI4J) API 的扩展 API,通过这些可以使您使用 UDDI 来进行您自己的开发。

0 评论:

Andrew J. Bradfield ([email protected]), Author, EMC

2004 年 8 月 01 日

  • 内容

引言

统一描述、发现和集成(UDDI) 正在快速成为在 Web 上存储可用业务流程的标准。虽然 UDDI 能够存储大量不同类型的数据,但就本技巧而言,我将把重点放在如何使用 UDDI 来注册 Web 服务,从而使 Web 服务可用于应用程序级的消费。

回页首

假设

  • 您正在使用IBM® WebSphere® Studio Application Developer V5.0 (Application Developer) 或者其它的 J2EE 兼容开发环境,例如 Eclipse IDE
  • 已经安装了DB2 ®,并且创建了示例数据库(本示例要用到 Employee 表和 Department 表。要创建示例数据库,打开“DB2 First Steps”,然后单击“Create Sample Database”链接)。
  • 已经安装并正确配置了 UDDI 注册中心。请参阅用于自动安装 UDDI 注册中心来使用 Cloudscape 数据库的 InstallUDDI 清单。从命令窗口执行installuddilibs.bat来创建必需的目录结构。

回页首

本技巧涵盖了哪些内容

本技巧给 Java® 开发人员提供了一种快速并且简单的方法来开发他们自己的 UDDI Java 应用程序,并使用这些应用程序来消费在注册中心注册了的 Web 服务。附带的示例代码包含一个 Payroll Web 服务(从一个实体 bean 部署而来的)和一个 UDDI 会话 bean。

回页首

技巧背景

本技巧主要是基于教程“使用 WSDK V5.1 发现 Web 服务:UDDI”(developerWorks, 2003 年 11 月),参考资料部分引用了该教程。我的目的是提出基础的 Java 的统一描述、发现和集成 (UDDI4J) 类的扩展,从而帮助您快速建立您自己的 Web 服务 UDDI 注册中心。完成“Discover Web services with the WSDK V5.1: UDDI”这个教程的过程中,我开发了一个提供更高级访问 UDDI4J API 的扩展 API。因为本技巧的目的是注册、发现和消费存储在 UDDI 注册中心的 Web 服务,所以只展开了 UDDI4J 功能的一小部分。有关 UDDI 以及它在存储 Web 服务上的应用的更广泛的讨论,请参阅 Tom Bellwood 的文章“理解 UDDI”(developerWorks,2002 年 7 月)。

回页首

Payroll Web 服务

附带的Payroll.ear文件包含一个名为PayrollEjbPrj的企业 JavaBean (EJB) 方案。在这个 EJB 方案里有两个实体 bean(Department 和 Employee)以及一个会话 bean (Payroll)。Department 和 Employee 这两个实体 bean 显示了用于示例数据库的 getter 和 setter 方法。Payroll bean 显示了 12 种方法,它使用实体 bean 的 getter 方法从示例数据库中查询各种信息片断。示例代码很容易被扩展,从 Payroll bean 内部提供 setter 函数。显示所有的示例数据库字段不在本技巧的范围之内。

回页首

UDDIClient 会话 EJB

UDDIClient 会话 bean 几乎全部由下一部分讨论的 UDDI 实用 API 构成。

UDDI 注册中心可以包括业务、服务以及 TModel。UDDIClient bean 为每类 UDDI 条目提供了一个 publish() 方法和两个 delete() 方法。如下面的清单 1所示,把任务移交给 UDDI 实用 API 处理时,方法签名(method signature)方法尽可能的简单。

清单 1.方法签名
public String publishBusiness(String busName)
	{
		return BusinessUtilities.publishBusiness(busName);
	}

public void deleteBusinessByName(String busName)
{
    BusinessUtilities.deleteBusinessByName(busName);
}
public void deleteBusinessByKey(String busKey)
{
	BusinessUtilities.deleteBusinessByKey(busKey);
}
public String publishService(String serviceName, String busName,
String tModelName, String tModelOverviewDoc,
String accessPointStr, String description)
{
      return
ServiceUtilities.publishService(serviceName,busName,tModelName,
tModelOverviewDoc,accessPointStr,description);
}
public void deleteServiceByName(String serviceName)
{
	ServiceUtilities.deleteServiceByName(serviceName);
}
public void deleteServiceByKey(String serviceKey)
{
	ServiceUtilities.deleteServiceByKey(serviceKey);
}
public String publishTModel(String tModelName, String overviewDocString)
{
	return
ModelUtilities.publishTModel(tModelName,overviewDocString);
}

public void deleteTModelByName(String tModelName)
{
	ModelUtilities.deleteTModelByName(tModelName);
}
public void deleteTModelByKey(String tModelKey)
{
	ModelUtilities.deleteTModelByKey(tModelKey);
}

getService 和 executeService 方法

UDDIClient bean 的 getService 和 executeService 方法演示了如何重新获得我们的 Payroll Web 服务并调用其中的一些方法。executeService 方法用一个字符串表示一个存储在注册中心的服务的名称。在示例代码中,注册的服务是 Payroll Web 服务。为了达到本技巧的预期效果,我硬编码了两个方法,供注册中心内创建的 Payroll Web 服务调用,如清单 2所示。

清单 2. getService 和 executeService 方法
/**
	* Execute a Service found in the UDDI registry
	* @param serviceName Service name used to search for
	and execute available UDDI Services
	*/
	public void executeService(String serviceName)
	{
		//Obtain all access points for services providing this
service
		Map accessPoints =
ServiceUtilities.getServiceAccessPoints(serviceName);

		//Create a set of accespoints
		Set accessSet = accessPoints.keySet();
		Iterator it = accessSet.iterator();

		Payroll payroll = null;
		Object obj = null;

		while(it.hasNext())
		{
			try
	          {
		          //For each access point, create an
PayrollService object
		          String accessPoint = (String)it.next();
		          System.out.println("Service Access Point: " +
accessPoint);
		          payroll = getService(accessPoint);

		          if(payroll != null)
		          {
				    System.out.println("Employee 000010‘s
bonus is " + payroll.getBonus("000010"));
				    System.out.println("Employee 000010‘s
phone number is " + payroll.getPhoneNo("000010"));
				}
			}
			catch(Exception e)
			{
				e.printStackTrace();
			}
		}
	}
/**
	* Create a Service object, to communicate with the
Web service defined by the URL
	* @param urlString the URL of the Web service
	* @return A PayrollService object.
	*/
	private Payroll getService(String urlString)
	{
		PayrollServiceLocator payrollServiceLocator =
new PayrollServiceLocator();
		Payroll payroll = null;

		try
		{
			URL url = new URL(urlString);
			System.out.println("Payroll URL: " + url.toString());
			System.out.println("Getting Payroll object");
			payroll =
payrollServiceLocator.getPayroll(url);
			System.out.println("Payroll object retrieved
successfully");
		}
		catch (MalformedURLException e)
		{
			System.out.println("URL Exception: " + e.toString());
		}
		catch(javax.xml.rpc.ServiceException se)
		{
			System.out.println("Service Exception: " +
se.toString());
		}

		return payroll;
	}

回页首

UDDI 实用 API

UDDI 实用 API 有四个主要的类,我将在清单34以及5中详细描述其中的三个。第 4 个 (Utilities.class) 包含所有的 UDDI 注册的设置信息。 "使用 WSDK V5.1 将服务发布到 UDDI 注册中心"(developerWorks,2003 年 11 月)这个教程详细解释了其中的值和结构。

清单 3. BusinessUtilities
/**
	* Display business information of a BusinessEntity
	* @param businessKey The businessKey of the BusinessEntity
	whose detail is to be displayed
	*/
	public static void showBusinessDetail(String businessKey)
/**
	* Locate a Business by name
	* @param busName The business name used to search for a business
	* @return Vector: This method returns a Vector of Strings.
	Each String represents the businessKey of a business matching the query
	*/
	public static Vector findBusinessByName(String busName)
/**
	* Locate a Business by key
	* @param businessKey The business key used to search for a business
	* @return BusinessList: This function returns a BusinessList on success.
	In the event that no matches were located for the specified criteria,
	a BusinessList structure with zero BusinessInfo structures is returned.
	*/
	public static BusinessList findBusinessByKey(String businessKey)
/**
	* Delete a Business by name
	* @param busName Business name used to find and delete a business
	*/
	public static void deleteBusinessByName(String busName)
/**
	* Delete a Business by key
	* @param businessKey A Business key used to find and delete a business
	*/
	public static void deleteBusinessByKey(String businessKey)
/**
	* Publish a Business
	* @param busName The name of the business to be published
	* @return String: This method returns a String representing the
	key of the newly published Business
	*/
	public static String publishBusiness(String busName)
清单 4. ModelUtilities
/**
	* Locate a technical Model by name
	* @param tModelName the Name
	* @return Vector: This method returns a Vector of
	tModelKey Strings
	*/
	public static Vector findTModelByName(String tModelName)
/**
	* Locate a technical Model by key
	* @param tModelName The TModel key used to search for a TModel
	* @return TModelList: This method returns a TModelList
	of TModelInfos objects
	*/
	public static TModelList findTModelByKey(String tModelKey)
/**
	* Delete a technical Model by name
	* @param tModelKey TModel name used to delete a TModel
	*/
	public static void deleteTModelByName(String tModelName)
/**
	* Delete a technical Model by key
	* @param tModelKey TModel key used to delete a TModel
	*/
	public static void deleteTModelByKey(String tModelKey)
/**
	* Publish a technical Model
	* @param tModelName The TModel name
	* @param overviewDocString This parameter expects a
	URL-String representation of the WSDL address.
	EX: http://localhost:9080/MyRouter/Test.wsdl
	* @return String: This method returns a String
	representing the key of the newly published TModel
	*/
	public static String publishTModel(String tModelName,
	String overviewDocString)
清单 5. ServiceUtilities
/**
	* Locate a Service by name
	* @param serviceNames A vector of Name objects
	* @return Map: This method returns a Map of service
	and business key pairs
	*/
	public static Map findServiceByName(Vector serviceNames) 

/**
	* Locate a Service by key
	* @param serviceKey A key used to search for a Service
	* @return ServiceList: This method returns a ServiceList of
	ServiceInfos objects
	*/
	public static ServiceList findServiceByKey(String serviceKey)
/**
	* Delete a Service by name
	* @param serviceName Service name used to find
	and delete a Service
	*/
	public static void deleteServiceByName(String serviceName)
/**
	* Delete a Service by key
	* @param serviceKey Service key used to find and delete
	a Service
	*/
	public static void deleteServiceByKey(String serviceKey)
/**
	* Publish a Service
	* @param serviceName The name of the Service to be published
	* @param businessName The Business name used to
	associate the service to. If Business name does not exist
	in the registry, a Business entry will be created.
	* @param tModelName The TModel that the service implements.
	If TModel is not found in the registry and the
	TModelOverviewDoc parameter is not null, a TModel entry
	will be created.
	* @param tModelOverviewDoc Required only if the TModel name
	provided in the tModelName parameter is not
	found in the registry.
	This parameter expects a URL-String representation of the
	WSDL address.  EX: http://localhost:9080/MyRouter/Test.wsdl
	* @param accessPointStr
	* @param description Optional Service description.
	* @return String: This method returns a String representing
	the key of the newly published Service
	*/
	public static String publishService(String serviceName,
	String busName, String tModelName, String tModelOverviewDoc,
	String accessPointStr, String description)

回页首

结束语

正如您所看到的,UDDI 程序设计是在使用 UDDI 注册中心的网络上共享信息的非常有效的途径。这里的示例代码,更具体地说,UDDI 实用 API 提供了一个起点,从这个起点出发您能够开发更加用户化的解决方案。

http://www.ibm.com/developerworks/cn/webservices/ws-tip-uddijava.html

【Java】Web 服务编程技巧与窍门: 在 UDDI 注册中心为 Web 服务注册开发 UDDI Java 应用程序

时间: 2024-09-29 15:33:57

【Java】Web 服务编程技巧与窍门: 在 UDDI 注册中心为 Web 服务注册开发 UDDI Java 应用程序的相关文章

关于《Java数字图像处理-编程技巧与应用实践》一书 源代码

关于<Java数字图像处理-编程技巧与应用实践>一书 源代码 本书所有的源代码我已经整理上传到华章图书的官方网站与 我自己的GITHUB上,本人GITHUB的地址如下: https://github.com/gloomyfish/mybook-java-imageprocess其 中书中的多数内容在本人的博客专栏上面有覆盖,但是不完全 是博客内容的翻版,阅读本人博客想找可以运行源代码的读者 可以到github上自己下载,如果发现有任何源代码错误,请给我 发邮件或者留言,本人感激不尽. 特此声明

Dubbo之多注册中心以及zookepeer服务的查看

配置多注册中心 打开 provider 模块的 spring-provider.xml 配置文件,修改成如下: 1 <?xml version="1.0" encoding="UTF-8"?> 2 <!-- 添加 DUBBO SCHEMA --> 3 <beans xmlns="http://www.springframework.org/schema/beans" 4 xmlns:xsi="http://

Java web开发路线--Java学习资料汇总

Java web开发是什么? 先来说说java体系,包含:javaSE.javaEE.javaME,其实目前关注主要是javaEE,但学些javaEE必须先学习javaSE(因为这个是java基础).Java web开发其实是应用javaEE实现web应用的开发,是用Java技术来解决相关web互联网领域的技术总和. web开发主要包括前端开发和后端开发,前端主要是HTML.CSS.JS等相关技术,后端技术主要有JavaEE技术.数据库技术.文件存储技术等.java体系比较庞大,也是很多人比较迷

WCF技术剖析之三十:一个很有用的WCF调用编程技巧[上篇]

原文:WCF技术剖析之三十:一个很有用的WCF调用编程技巧[上篇] 在进行基于会话信道的WCF服务调用中,由于受到并发信道数量的限制,我们需要及时的关闭信道:当遇到某些异常,我们需要强行中止(Abort)信道,相关的原理,可以参考我的文章<服务代理不能得到及时关闭会有什么后果?>.在真正的企业级开发中,正如我们一般不会让开发人员手工控制数据库连接的开启和关闭一样,我们一般也不会让开发人员手工去创建.开启.中止和关闭信道,这些工作是框架应该完成的操作.这篇文章,我们就来介绍如果通过一些编程技巧,

Java的多线程编程模型5--从AtomicInteger开始

Java的多线程编程模型5--从AtomicInteger开始 2011-06-23 20:50 11393人阅读 评论(9) 收藏 举报 java多线程编程jniinteger测试 AtomicInteger,一个提供原子操作的Integer的类.在Java语言中,++i和i++操作并不是线程安全的,在使用的时候,不可避免的会用到synchronized关键字.而AtomicInteger则通过一种线程安全的加减操作接口. 来看AtomicInteger提供的接口. //获取当前的值 publ

Audio Queue Services Programming Guide(音频队列服务编程指南)

Audio Queue Services 的苹果官方文档: https://developer.apple.com/library/ios/documentation/MusicAudio/Conceptual/AudioQueueProgrammingGuide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40005343-CH1-SW1 网友对上面的苹果官方文档的部分翻译: 音频队列服务编程指南(Audio Queue Servi

【Java】理解 UDDI 注册中心的 WSDL

如何发布和查找 WSDL 服务描述 Web 服务描述语言(WSDL)有多种用法.特别是,根据应用程序的需要,WSDL 在 UDDI 注册中心有好几种使用方法.在这第 1 篇文章中(本系列共三篇),我们将介绍一下在 UDDI 注册中心使用 WSDL 的几种不同的方法. Web 服务描述语言(WSDL)是用于描述 Web 服务的一种 XML 语言,它将 Web 服务描述为一组对消息进行操作的网络端点.一个 WSDL 服务描述包含对一组操作和消息的一个抽象定义,绑定到这些操作和消息的一个具体协议,和这

【转】Eureka服务注册中心搭建

转自:https://blog.csdn.net/pengjunlee/article/details/86538997 Spring Cloud是一系列框架的集合,它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,构建了服务治理(服务注册与发现).配置中心.消息总线.负载均衡.断路器.数据监控.分布式会话和集群状态管理等功能,为我们提供一整套企业级分布式云应用的完美解决方案. Spring Cloud的服务治理等核心功能主要是通过Spring Cloud Netfl

基于Spring Cloud的微服务构建学习-3 服务治理-Spring Cloud Eureka之高可用注册中心

什么叫高可用 高可用一般指服务的冗余,一个服务挂了,可以自动切换到另一个服务上,不会影响到客户体验. 高可用注册中心 在微服务架构这样的分布式环境中,我们需要充分考虑发生故障的情况,所以在生产环境中必须对各个组件进行高可用部署,对于微服务如此,对于服务中心也一样. Eureka Server的设计一开始就考虑了高可用问题,在Eureka的服务治理设计中,所有节点既是服务提供方,也是服务消费方,服务注册中心也不例外.在前一篇随笔中用到过这样的配置: eureka.client.register-w