Java编程Webservice指定超时时间代码详解
WebService是⼀种跨编程语⾔和跨操作系统平台的远程调⽤技术
所谓远程调⽤,就是⼀台计算机a上的⼀个程序可以调⽤到另外⼀台计算机b上的⼀个对象的⽅法,譬如,银联提供给商场的pos刷卡系统(采⽤交互提问的⽅式来加深⼤家对此技术的理解)。
远程调⽤技术有什么⽤呢?商场的POS机转账调⽤的转账⽅法的代码是在银⾏服务器上,还是在商场的上呢?什么情况下可能⽤到远程调⽤技术呢?例如,amazon,天⽓预报系统,淘宝⽹,校内⽹,百度等把⾃⼰的系统服务以webservice服务的形式暴露出来,让第三⽅⽹站和程序可以调⽤这些服务功能,这样扩展了⾃⼰系统的市场占有率,往⼤的概念上吹,就是所谓的SOA应⽤。
所谓跨编程语⾔和跨操作平台,就是说服务端程序采⽤java编写,客户端程序则可以采⽤其他编程语⾔编写,反之亦然!跨操作系统平台则是指服务端程序和客户端程序可以在不同的操作系统上运⾏。
除了WebService外,常见的远程调⽤技术还有RMI(Remotemethodinvoke)和CORBA,由于WebService的跨平台和跨编程语⾔特点,因此⽐其他两种技术应⽤更为⼴泛,但性能略低。
使⽤JDK对Webservice的⽀持进⾏Webservice调⽤时通常的操作步骤如下:
//1、创建⼀个l.ws.Service实例
//2、通过Service实例获取对应的服务接⼝的代理
HelloService helloService = Port(portName, HelloService.class);
//3、通过获取到的Webservice服务接⼝的代理调⽤对应的服务⽅法
helloService.sayHello("Elim")
在上述的步骤⼀在构建Service实例的同时,在Service内部会构建⼀个ServiceDelegate类型的对象赋给属性delegate,内部持有。然后在第⼆步会利⽤delegate创建⼀个服务接⼝的代理对象,同时还会代理BindingProvider和Closeable接⼝。然后在第三步真正发起接⼝请求时,内部会发起⼀个HTTP请求,发起HTTP请求时会从BindingProvider的getRequestContext()返回结果中获取超时参数,分别对应l.tion.timeout和l.quest.timeout参数,前者是建⽴连接的超时时间,后者是获取请求响应的超时时间,单位是毫秒。如果没有指定对应的超时时间或者指定的超时时间为0都表⽰永不超时。所以为了指定超时时间我们可以从BindingProvider下⼿。⽐如:
public class Client {
public static void main(String[] args) throws Exception {
String targetNamespace = "test.elim/ws";
QName serviceName = new QName(targetNamespace, "helloService");
QName portName = new QName(targetNamespace, "helloService");
URL wsdl = new URL("localhost:8888/hello");
//内部会创建⼀个ServiceDelegate类型的对象赋给属性delegate
Service service = ate(wsdl, serviceName);
//会利⽤delegate创建⼀个服务接⼝的代理对象,同时还会代理BindingProvider和Closeable接⼝。
HelloService helloService = Port(portName, HelloService.class);
BindingProvider bindingProvider = (BindingProvider) helloService;
Map<String, Object> requestContext = RequestContext();
requestContext.put("l.tion.timeout", 10 * 1000);//建⽴连接的超时时间为10秒
requestContext.put("l.quest.timeout", 15 * 1000);//指定请求的响应超时时间为15秒
//在调⽤接⼝⽅法时,内部会发起⼀个HTTP请求,发起HTTP请求时会从BindingProvider的getRequestContext()返回结果中获取超时参数,
//分别对应l.tion.timeout和l.quest.timeout参数,
//前者是建⽴连接的超时时间,后者是获取请求响应的超时时间,单位是毫秒。如果没有指定对应的超时时间或者指定的超时时间为0都表⽰永不超时。 System.out.println(helloService.sayHello("Elim"));
}
}
完整⽰例如下:
服务接⼝:
@WebService(portName="helloService", serviceName="helloService", targetNamespace="test.elim/ws")
public interface HelloService {
String sayHello(String name);
}
服务接⼝实现:
@WebService(portName="helloService", serviceName="helloService", targetNamespace="test.elim/ws")
public class HelloServiceImpl implements HelloService {
private Random random = new Random();
@Override
public String sayHello(String name) {
try {
TimeUnit.SECONDS.sleep(5 + int(21));
调用webservice服务//随机睡眠5-25秒
}
catch (InterruptedException e) {
e.printStackTrace();
}
return "Hello " + name;
}
}
服务端代码:
public class Server {
public static void main(String[] args) {
Endpoint.publish("localhost:8888/hello", new HelloServiceImpl());
}
}
在上述的服务端代码中随机睡眠了5-25秒,⽽客户端指定的超时时间是15秒,所以在测试的时候你会看到有时候服务调⽤会超时,有时会正常响应。
总结
以上就是本⽂关于Java编程Webservice指定超时时间代码详解的全部内容,希望对⼤家有所帮助。如有不⾜之处,欢迎留⾔指出。感谢朋友们对本站的⽀持!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论