在项目中使用webservice时,最常用的方式是通过创建动态客户端的方式,如下:
JaxWsDynamicClientFactory clientFactory = JaxWsDynamicClientFactory.newInstance();
client = clientFactory.createClient(WS_ADDRESS);
但是在大量并发的情况下,重复的创建客户端会占用大量内存并且创建客户端的代价非常昂贵。因此,在每次使用完客户端之后将客户端保存到队列中,如下:
public static Client getClient(){
Client client = CLIENT_LINKED_BLOCKING_QUEUE.poll();
if(null == client){
JaxWsDynamicClientFactory clientFactory = JaxWsDynamicClientFactory.newInstance();
client = clientFactory.createClient(WS_ADDRESS);
}
return client;
}
public static void closeClient(Client client) throws InterruptedException {
CLIENT_LINKED_BLOCKING_QUEUE.put(client);
}
这样即可避免重复创建客户端。需要注意的是,同一客户端同一时刻只能被一个线程消费,否则可能会因争用导致莫名其妙的错误。因此,队列采用的是阻塞队列。