Java编程Webservice指定超时时间代码详解

 更新时间:2017年11月28日 12:01:19   投稿:mengwei  
这篇文章主要介绍了Java编程Webservice指定超时时间代码详解,简单介绍了webservice,然后分享了通过使用JDK对Webservice的支持进行Webservice调用实现指定超时时间完整示例,具有一定借鉴价值,需要的朋友可以参考下。

WebService是一种跨编程语言和跨操作系统平台的远程调用技术

所谓远程调用,就是一台计算机a上的一个程序可以调用到另外一台计算机b上的一个对象的方法,譬如,银联提供给商场的pos刷卡系统(采用交互提问的方式来加深大家对此技术的理解)。

远程调用技术有什么用呢?商场的POS机转账调用的转账方法的代码是在银行服务器上,还是在商场的pos机上呢?什么情况下可能用到远程调用技术呢?例如,amazon,天气预报系统,淘宝网,校内网,百度等把自己的系统服务以webservice服务的形式暴露出来,让第三方网站和程序可以调用这些服务功能,这样扩展了自己系统的市场占有率,往大的概念上吹,就是所谓的SOA应用。

所谓跨编程语言和跨操作平台,就是说服务端程序采用java编写,客户端程序则可以采用其他编程语言编写,反之亦然!跨操作系统平台则是指服务端程序和客户端程序可以在不同的操作系统上运行。

除了WebService外,常见的远程调用技术还有RMI(Remotemethodinvoke)和CORBA,由于WebService的跨平台和跨编程语言特点,因此比其他两种技术应用更为广泛,但性能略低。

使用JDK对Webservice的支持进行Webservice调用时通常的操作步骤如下:

//1、创建一个javax.xml.ws.Service实例
javax.xml.ws.Service service = javax.xml.ws.Service.create(wsdl, serviceName);
//2、通过Service实例获取对应的服务接口的代理
HelloService helloService = service.getPort(portName, HelloService.class);
//3、通过获取到的Webservice服务接口的代理调用对应的服务方法
helloService.sayHello("Elim")

在上述的步骤一在构建Service实例的同时,在Service内部会构建一个ServiceDelegate类型的对象赋给属性delegate,内部持有。然后在第二步会利用delegate创建一个服务接口的代理对象,同时还会代理BindingProvider和Closeable接口。然后在第三步真正发起接口请求时,内部会发起一个HTTP请求,发起HTTP请求时会从BindingProvider的getRequestContext()返回结果中获取超时参数,分别对应com.sun.xml.internal.ws.connection.timeout和com.sun.xml.internal.ws.request.timeout参数,前者是建立连接的超时时间,后者是获取请求响应的超时时间,单位是毫秒。如果没有指定对应的超时时间或者指定的超时时间为0都表示永不超时。所以为了指定超时时间我们可以从BindingProvider下手。比如:

public class Client {

	public static void main(String[] args) throws Exception {
		String targetNamespace = "http://test.elim.com/ws";
		QName serviceName = new QName(targetNamespace, "helloService");
		QName portName = new QName(targetNamespace, "helloService");
		URL wsdl = new URL("http://localhost:8888/hello");
		//内部会创建一个ServiceDelegate类型的对象赋给属性delegate
		Service service = Service.create(wsdl, serviceName);
		//会利用delegate创建一个服务接口的代理对象,同时还会代理BindingProvider和Closeable接口。
		HelloService helloService = service.getPort(portName, HelloService.class);
		
		
		BindingProvider bindingProvider = (BindingProvider) helloService;
		Map<String, Object> requestContext = bindingProvider.getRequestContext();
		requestContext.put("com.sun.xml.internal.ws.connection.timeout", 10 * 1000);//建立连接的超时时间为10秒
		requestContext.put("com.sun.xml.internal.ws.request.timeout", 15 * 1000);//指定请求的响应超时时间为15秒
		
		//在调用接口方法时,内部会发起一个HTTP请求,发起HTTP请求时会从BindingProvider的getRequestContext()返回结果中获取超时参数,
		//分别对应com.sun.xml.internal.ws.connection.timeout和com.sun.xml.internal.ws.request.timeout参数,
		//前者是建立连接的超时时间,后者是获取请求响应的超时时间,单位是毫秒。如果没有指定对应的超时时间或者指定的超时时间为0都表示永不超时。
		
		System.out.println(helloService.sayHello("Elim"));
	}
	
}

完整示例如下:

服务接口:

@WebService(portName="helloService", serviceName="helloService", targetNamespace="http://test.elim.com/ws")
public interface HelloService {

	String sayHello(String name);
	
}

服务接口实现:

@WebService(portName="helloService", serviceName="helloService", targetNamespace="http://test.elim.com/ws")
public class HelloServiceImpl implements HelloService {
	private Random random = new Random();
	@Override
		public String sayHello(String name) {
		try {
			TimeUnit.SECONDS.sleep(5 + random.nextint(21));
			//随机睡眠5-25秒
		}
		catch (InterruptedException e) {
			e.printStackTrace();
		}
		return "Hello " + name;
	}
}

服务端代码:

public class Server {
	public static void main(String[] args) {
		Endpoint.publish("http://localhost:8888/hello", new HelloServiceImpl());
	}
}

在上述的服务端代码中随机睡眠了5-25秒,而客户端指定的超时时间是15秒,所以在测试的时候你会看到有时候服务调用会超时,有时会正常响应。

总结

以上就是本文关于Java编程Webservice指定超时时间代码详解的全部内容,希望对大家有所帮助。如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

相关文章

  • Java并发编程之LockSupport类详解

    Java并发编程之LockSupport类详解

    LockSupport是一种线程阻塞工具,它可以在线程内任意位置让线程阻塞.接下来就带着大家详细了解一下LockSupport类,,需要的朋友可以参考下
    2021-05-05
  • SpringBoot如何优雅的整合Swagger Api自动生成文档

    SpringBoot如何优雅的整合Swagger Api自动生成文档

    在多人协作的开发过程中,API文档不仅可以减少等待,也能保证开发的持续进行,这篇文章主要给大家介绍了关于SpringBoot如何优雅的整合Swagger Api自动生成文档的相关资料,需要的朋友可以参考下
    2021-07-07
  • Java MethodHandles介绍与反射对比区别详解

    Java MethodHandles介绍与反射对比区别详解

    这篇文章主要为大家介绍了Java MethodHandles介绍与反射对比区别详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • 解读Jvm的内存结构与GC及jvm参数调优

    解读Jvm的内存结构与GC及jvm参数调优

    这篇文章主要介绍了解读Jvm的内存结构与GC及jvm参数调优方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • packages思维及使用Java添加Android平台特定实现

    packages思维及使用Java添加Android平台特定实现

    这篇文章主要为大家介绍了packages思维及使用Java添加Android平台特定实现在Flutter框架里的体现和运用详解,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • 如何使用Java计算修改文件的MD5值

    如何使用Java计算修改文件的MD5值

    这篇文章主要介绍了如何使用Java计算修改文件的MD5值,MD5是一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值,用于确保信息传输完整一致,需要的朋友可以参考下
    2023-04-04
  • 聊聊SpringCloud和SpringCloudAlibaba的区别

    聊聊SpringCloud和SpringCloudAlibaba的区别

    这篇文章主要介绍了SpringCloud和SpringCloudAlibaba的区别,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • java定义受限制的类型参数操作

    java定义受限制的类型参数操作

    这篇文章主要介绍了java定义受限制的类型参数操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • JAVA中的字符串常量池使用操作代码

    JAVA中的字符串常量池使用操作代码

    Java中的字符串常量池是Java堆中的一块特殊存储区域,用于存储字符串。它的实现是为了提高字符串操作的性能并节省内存,这篇文章主要介绍了JAVA中的字符串常量池,需要的朋友可以参考下
    2022-12-12
  • 一文带你掌握Java8中函数式接口的使用和自定义

    一文带你掌握Java8中函数式接口的使用和自定义

    函数式接口是 Java 8 引入的一种接口,用于支持函数式编程,下面我们就来深入探讨函数式接口的概念、用途以及如何创建和使用函数式接口吧
    2023-08-08

最新评论