在項目中使用webservice時,最常用的方式是通過創(chuàng)建動態(tài)客戶端的方式,如下:
JaxWsDynamicClientFactory clientFactory = JaxWsDynamicClientFactory.newInstance();
client = clientFactory.createClient(WS_ADDRESS);
但是在大量并發(fā)的情況下,重復(fù)的創(chuàng)建客戶端會占用大量內(nèi)存并且創(chuàng)建客戶端的代價非常昂貴夏跷。因此,在每次使用完客戶端之后將客戶端保存到隊列中,如下:
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);
}
這樣即可避免重復(fù)創(chuàng)建客戶端烘浦。需要注意的是,同一客戶端同一時刻只能被一個線程消費萍鲸,否則可能會因爭用導(dǎo)致莫名其妙的錯誤闷叉。因此,隊列采用的是阻塞隊列脊阴。