重複請求

重複請求是指在全球資訊網中,瀏覽器或全球資訊網客戶向伺服器傳送一個請求,如果在短時間得不到回應,就會再一次傳送請求或者瀏覽器或全球資訊網客戶短時間傳送多次請求。重複請求是應用程式中一個常見的問題,重複請求發生的原因有多種多樣,如網路較差,伺服器端忙等。

基本介紹

  • 中文名:重複請求
  • 外文名:Repeat Request
簡介,原因,例子,

簡介

重複請求是指在全球資訊網中,瀏覽器或全球資訊網客戶向伺服器傳送一個請求,如果在短時間得不到回應,就會再一次傳送請求或者瀏覽器或全球資訊網客戶短時間傳送多次請求。重複請求是應用程式中一個常見的問題,重複請求是應用程式中一個常見的問題,重複請求發生的原因有多種多樣,如網路較差,伺服器端忙等。

原因

發生重複請求的原因如下:
1)在套用層中,HTTP協定定義了瀏覽器怎樣向全球資訊網伺服器請求全球資訊網文檔,以及伺服器怎樣把文檔傳送給瀏覽器。從層次的角度看,HTTP是面向事務套用層協定,它是全球資訊網上能夠可靠地交換檔案(包括文本、聲音、圖像等各種多媒體檔案)的重要基礎。HTPP協定是無狀態,同一個客戶第二次訪問同一個頁面時,伺服器反應與第一次請求相同,這也是重複請求發生的重要原因之一,儘管較新的HTTP協定使用了持續連結,這個問題沒有完全解決。
2)伺服器端很忙,當一個伺服器有很多客戶都傳送請求時,伺服器就會很忙,為了等到回響,就需要不斷重複請求。例如很多學生都在同一時間都在登錄成績查詢系統,就需要不斷重複請求。
3)當網路性能很差時,我們為了能更快得到回響,需要重複請求。

例子

例如有一個java webservice實現的生成訂單接口,遇到了重複下單的問題,客戶端2次請求相差時間間隔小,幾乎是同時到達,導致了重複下單的問題。webservice調用的客戶端我們干預不了,而且用戶較多,所以只能考慮在服務端做處理。下面是怎么解決重複請求。做法就是把這個方法裡的那段代碼加個同步塊,同時把該數據的某一唯一性欄位(如訂單號)放入記憶體中,執行完之後從記憶體中移除,每次到這個代碼段時先判斷記憶體中有沒有這個訂單號,有的話就不執行,沒有就執行下面的操作,代碼如下。
if(ConRunningMap.containsItem(this.fillOrder.trim())) {//判斷記憶體中是否有這個訂單號
return null;
} else {
ConRunningMap.addItem(this.fillOrder.trim());//訂單號放到記憶體中
執行代碼……
最後把訂單號從記憶體中移除
ConRunningMap.removeItem(this.fillOrder.trim());
}
ConRunningMap 類:
public class ConRunningMap {
private static Map<String, String> runningMap ;
public static Map<String, String> powerInvoiceMap ;
public static Map<String, String> getPowerInvoiceMap() {
return powerInvoiceMap;
}
public static voidsetPowerInvoiceMap(Map<String, String> powerInvoiceMap) {
ConRunningMap.powerInvoiceMap =powerInvoiceMap;
}
public static synchronized void addItem(Stringitem) {
if(!item.equals("")){
runningMap.put(item,"");
}
}
public static synchronized void removeItem(String item) {
if(!item.equals("")){
runningMap.remove(item);
}
}
public static synchronized booleancontainsItem(String item) {
if(!item.equals("")&&runningMap.containsKey(item)){
return true;
}
return false;
}
public static void init() {
runningMap = new HashMap<String, String>();
powerInvoiceMap = CPower.invoiceCodeMap();
}
}

相關詞條

熱門詞條

聯絡我們