2012-01-23 97 views
2

請在下面找到我的要求。java實現:輪詢web服務

要求:輪詢Web服務。屬性文件中配置了兩個關鍵的輪詢參數max_timeout,polling_interval。總體目標是花費整體時間獲得迴應。如果我們在max_timeout中獲得響應,我們可以將響應返回給客戶端。否則,我們會拋出一個錯誤,指出操作不成功。

下面是我寫的代碼片段。

int maxTimeOut = 10; 
int interval = 2; 

int iterations = maxTimeOut/interval; 
boolean success = false; 

for (int i = 0; i < iterations; i++) 
{ 
    System.out.println("Number of iteration = " + i); 
    try 
    { 
     Thread.sleep(interval * 1000); 
     System.out.println("Waited for " + interval + " seconds"); 

     success = getWSResponse(i); 
     System.out.println("CALL" + ((success) ? "SUCCESSFUL" : "FAIL")); 

     if(success) break; 

    }catch (InterruptedException ie) 
    { 
     System.out.println(ie.getMessage()); 
    } 
} 

//Send the success flag to client 

如果這是輪詢的正確實施,你能糾正我嗎?我有點擔心這段代碼假設web服務調用很快返回。如果這需要2-3秒(通常是這樣),那麼我們將單獨花費超過max_timeout。我們如何解決這個問題。有沒有比這更好的方法。

+1

'catch(InterruptedException ie){System.out.println(ie.getMessage()); }'不要那樣做。只需重新拋出它{{拋出新的RuntimeException(ie)}' – artbristol

+0

感謝artbristol爲您的建議。我將使此代碼更改爲拋出RTE而不是SOP。 –

回答

1

如果輪詢僅表示web服務已啓動並正在運行,則在您的輪詢代碼中,您可以嘗試打開與webservice的連接(連接超時)。如果您能夠成功連接,則表示web服務已啓動。

HttpURLConnection connection = null; 
URL url = new URL("URL"); 
connection = (HttpURLConnection) url.openConnection(); 
connection .setConnectTimeout(timeout);//specify the timeout and catch the IOexception 
connection.connect(); 

編輯

或者,你可以調用使用執行人的Web服務(見java.util.concurrent.ExecutorService中)與超時任務,並可以相應地決定。示例:

// Make the ws work a time-boxed task 
      final Future<Boolean> future= executor.submit(new Callable<Boolean>() {   
       @Override 
       public Boolean call() throws Exception { 
        // get ws result 
         return getWSResponse(); 
       } 
      }); 
try { 
       boolean result = future.get(max_wait_time, TimeUnit.SECONDS); 
      } catch (TimeoutException te) { 
throw e; 
} 
+0

Nrj,我們必須實際調用Web服務的方法來返回大的xml,我們需要解析它,然後我們找出響應是「成功」還是「進行中」。整個事件在上面的getWSResponse **調用中被抽象出來。目的不在於檢查連通性。 –

+1

看我的編輯。這應該有助於 – Nrj

+0

感謝Nrj的代碼片段。讓我試試看。 –

2

你可以結合與HttpURLConnection -Timeout使用ScheduledExecutorService在一個給定的延遲輪詢 - 和中止任務,如果它需要任何更長的時間。

+0

謝謝光。您可以傳遞正確描述此場景的示例代碼/網址嗎?順便說一句,你看到任何問題與我附加的代碼片段(除了我指定的問題) –

+1

你的代碼的一個問題將是中斷。由於您不傳播中斷標誌或拋出中斷的異常。 –