我开始使用 JAX WS 研究 Java Web 服务。我正在阅读的这本书的第一章展示了如何仅使用 java SE 构建和部署一个简单的 jax ws Web 服务。特别是,Web 服务是通过 Endpoint 类发布的。发布 Web 服务后,作者指定“开箱即用,端点发布者一次处理一个客户端请求......如果给定请求的处理应该挂起,那么所有其他客户端请求都被有效阻止。一个示例本章末尾展示了 Endpoint 如何同时处理请求,以便一个挂起的请求不会阻塞其他请求。”
为了看到这一点,我尝试向具有 2 个线程的 Web 服务发送两个请求。这是代码:
@WebService(endpointInterface = "ProveVelociJava.WS.MyWsWithJavaSE.SayHello")
public class SayHelloImpl implements SayHello {
public String greetings(String param) {
System.out.println("\nStarting " + param + "...\n");
if(param.equals("miao")) {
try {
Thread.sleep(9000);
}
catch(Exception e) {}
}
System.out.println("Ended " + param + "\n\n");
return "Hi, " + param;
}
}
public class SayHelloPublisher {
public static void main(String[ ] args) {
// 1st argument is the publication URL
// 2nd argument is an SIB instance
Endpoint.publish("http://127.0.0.1:9899/say", new SayHelloImpl());
}
}
class MyClient extends Thread {
private static URL url;
private static QName qname;
private static Service service;
private static SayHello eif;
static {
try {
url = new URL("http://127.0.0.1:9899/say?wsdl");
qname = new QName("http://MyWsWithJavaSE.WS.ProveVelociJava/", "SayHelloImplService");
service = Service.create(MyClient.url, MyClient.qname);
// Extract the endpoint interface, the service "port".
eif = service.getPort(SayHello.class);
}
catch(Exception e) {}
}
private String name;
public MyClient(String n) {
name = n;
}
public void run() {
System.out.println(MyClient.eif.greetings(this.name));
}
public static void main(String args[ ]) throws Exception {
MyClient t1 = new MyClient("miao");
MyClient t2 = new MyClient("bau");
t1.start();
t2.start();
}
}
如果我启动 MyClient 类,名为“miao”的线程会发送它的请求,然后进入睡眠状态。但是,名为“bau”的线程不会等待前一个线程,它的请求会立即得到满足。
我错过了什么吗?java线程可以用来模拟多个请求吗?
非常感谢你的帮助,尼科。