2014-04-01 47 views
0

我已經實現了一個SIP Servlet,我從客戶端接收兩種類型的消息。我可以接收高優先級消息和低優先級消息,當我讀取消息的URI時,我將它們分開,如下面的代碼所示。我必須實現一個基本的秒錶,它增加了下面代碼中聲明的「count」整數。我如何製作這樣的秒錶並重新設置它?具有重置功能的Java中的秒錶

protected void doRequest(SipServletRequest reqfromclient) throws javax.servlet.ServletException, java.io.IOException { 
    if(reqfromclient.getMethod().equals("MESSAGE")) { 
     String MESSAGE = reqfromclient.getContent().toString(); 
     System.out.println("The arrived message is " + MESSAGE);   

     // Assign the callee URI 
     String URICallee = reqfromclient.getTo().getURI().toString(); 

     //Assign the caller URI 
     String URICaller = reqfromclient.getFrom().getURI().toString(); 


     //DECLARE STOPWATCH 
     int count = 0; 


     // Now the Highprio and Lowprio alerts have to be separated 
     if(URICallee.endsWith("policeHigh.com")) { 
      // RESET STOPWATCH 
      //START THE STOPWATCH. INCREMENT COUNT EVERY SECOND 
     } 

     else if(URICallee.endsWith("policeLow.com")) {    
      if(count == 21) {     
      //something 
      } 
     } 
    } 
+0

番石榴有一個'秒錶'類...... – fge

+0

這聽起來像你想知道兩個事件之間的時間。第一個事件是當你得到高優先級的消息。第二個事件是什麼,也就是說,你在什麼條件下報告秒錶的價值? – yotommy

+0

問題是,當我收到高優先級的消息時,我必須啓動秒錶。當另一個高優先級消息到達時,我將重新設置秒錶並重新啓動(從0開始計數)。如果低優先級消息到達,它將等待秒錶,直到計數= 20秒,然後再執行任何操作,因爲它的優先級低。 –

回答

1

要執行基於定時器一些任意代碼,使用可以從TimerService創建的ServletTimer類。有以下幾個部分:

  • 當您要設置一個計時器,請獲取對TimerService的引用。
  • 使用TimerService創建具有所需超時期限的ServletTimer
  • 在某處存儲ServletTimer的ID(作爲SipSessionSipApplicationSession中的屬性)。
  • 如果需要取消定時器,請從會話中檢索定時器ID,使用sipApplicationSession.getTimer(id)檢索定時器並在其上調用cancel()
  • 您將需要一些實現TimerListener接口的類。如果你願意,它可以是你的servlet類。用超時過期時應用程序需要執行的邏輯來實現timeout方法。如this link中所述,在SIP部署描述符中聲明該類爲listener
  • 可選:當您的通話結束時,請致電sipApplicationSession.invalidate(),這將取消任何未完成的定時器。

一個簡單的例子顯示爲here。該示例存在缺陷,因爲它將ServletTimer作爲servlet類的字段存儲,所以隨着後續調用的進入,它將被覆蓋。將ID存儲爲SipApplicationSession的屬性將防止它被覆蓋。