Java编程Webservice指定超时时间代码详解
作者:mengwei 发布时间:2023-11-02 23:17:12
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秒,所以在测试的时候你会看到有时候服务调用会超时,有时会正常响应。
来源:http://elim.iteye.com/blog/2394410


猜你喜欢
- 前言 OFD是国家标准版式文档格式,于2016年生效。OFD文档国家标准参见《电子文件存储与交换格式版式文档》。既然是国家标准,O
- 防止程序运行多个实例的方法有多种,如:通过使用互斥量和进程名等.而我想要实现的是:在程序运行多个实例时激活的是第一个实例,使其获得焦点,并在
- .NET中提供了读写Cookie的多种方法,Request.Cookies 是客户端通过 Cookie 标头形式由客户端传输到服务器的 Co
- 效果图白话分析:多线程:肯定是多个线程咯断点:线程停止下载的位置续传:线程从停止下载的位置上继续下载,直到完成任务为止。核心分析:断点:当前
- fifter、servlet、interceptorfifter用来处理请求头、请求参数、编码的一些设置,然后转交给servlet,处理业务
- 一、项目概述本系统采用MVC架构设计,SQLite数据表有用户表、成员表和活动表,有十多个Activity页面。打开应用,进入欢迎界面,3s
- 前言今天主要讲的是如何把通过接口获取到的Xml数据转换成(反序列化)我们想要的实体对象,当然Xml反序列化和Json反序列化的方式基本上都是
- Intellij是进行scala开发的一个非常好用的工具,可以非常轻松查看scala源码,当然用它来开发Java也是很爽的,之前一直在用sc
- 本篇文章是SpringBoot最入门的介绍。我们不借助任何额外的工具,从无到有创建一个Spring Boot的web项目,并运行这个项目。项
- Parallel类是对线程的一个抽象。该类位于System.Threading.Tasks名称空间中,提供了数据和任务并行性。Paralle
- 相信大家使用多点对图片进行缩放,平移的操作很熟悉了,大部分大图的浏览都具有此功能,有些app还可以对图片进行旋转操作,QQ的大图浏览就可以对
- 本文实例讲述了C#编程获取客户端计算机硬件及系统信息功能。分享给大家供大家参考,具体如下:这里使用C#获取客户端计算机硬件及系统信息 ,包括
- 本人是用易语言起步的,起初是为了兴趣,后来由于易语言被杀软误杀严重,连空白程序都杀,后来转到了学C#,随着学习的深入,接触越来越复杂的东西之
- 一:JTextField的(文本框)使用:JTextField 是一个轻量级组件,它允许编辑单行文本。1.JTextField的常用构造方法
- 一、OutputStreamWriter流 API说明:OutputStreamWriter是从字符流到
- 目前Android在全世界市场上大约有75%的占有率,国人Android手机的持有比例更甚,甚至达到90%以上。因此搞计算机的一听说手机应用
- 使用lamda表达式对list进行求和Lambda 表达式是 JDK8 的一个新特性,最近写项目中求和计算使用的较多,写篇文章记录下。1、实
- 一、选择结构大纲if单选择结构if双选择结构if多选择结构嵌套的if结构switch多选择结构二、if单选择结构我们很多时候需要去判断一个东
- Spring Boot 默认为我们提供了静态资源处理,使用 WebMvcAutoConfiguration 中的配置各种属性。建议大家使用S
- 一、简介Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新spring应用的初始搭建以及开发过程。该框架使用