2011-10-06 63 views
1

我試圖通過在連接時間和每次調用的退出時間將新的Date值傳遞給應用程序來獲取基於Web的電話調用的持續時間。檢查Groovy/Grails中的已用時間

代碼看起來有點像這樣:

class Call { 
    Date startTime = new Date() 
    Date endTime = new Date() 
    String callLength = "" 
    String Id = UUID.randomUUID() 
} 
class callController { 

    def connected = { 
     callInstance = Call.findById(params.Id) 

     //Id params are passed through from external voice call 
     Call.executeUpdate("update Call a set a.startTime=? where a.Id='${params.id}'", [new Date()]) 
    } 
    def callEnded = { 
     callInstance = Call.findById(params.Id) 
     Call.executeUpdate("update Call a set a.endTime=? where a.Id='${params.id}'", [new Date()]) 
     timeHandler(callInstance.endTime, callInstance.startTime) 
    } 
    def timeHandler = {end, start-> 
     TimeDuration duration = TimeCategory.minus(end, start) 
     Call.executeUpdate("update Call a set a.callLength='$duration' where a.Id = '${params.id}'") 
    } 
} 

編輯:代碼稍有編輯以產生更好的輸出。

編輯2:

我在Call對象上爲startTime和endTime創建了變量。但是,現在我無法更新日期 - 我想呢,Grails不喜歡更新日期?它說它無法將新日期傳遞給日期變量。這是確切的錯誤:

java.lang.ClassCastException: [Ljava.util.Date; cannot be cast to java.util.Date 

和Stacktrace指向我嘗試更新調用的行。有沒有解決方法?

再次感謝!

編輯3:

修復了正確的代碼。

感謝大家的幫助!

+1

Re:編輯2嘗試'executeUpdate(query,[new Date()])',列表中的參數。但不是'executeUpdate',是否有理由不更新域對象並保存? – ataylor

+0

謝謝!在你提到它之前,我實際上已經實施了這個改變,但它確實解決了一切。爲什麼我選擇使用executeUpdate沒有什麼真正的原因,而不是我習慣於使用它的事實。會更新 - >保存更快完成? –

回答

2

您可以將該值放入會話中,並且它會在請求之間保留。例如:

def connected = { 
    session.startTime = new Date().getTime() 
} 
def callEnded = { 
    def endTime = new Date().getTime() 
    timeHandler(endTime, session.startTime) 
} 
def timeHandler = {end, start-> 
    return end - start 
} 
+0

這是否需要我在我的調用域對象中有一個store startTime? –

+0

不,這隻會在http會話中保留startTime。 – ataylor

1

所以你沒有Call域對象存儲每個呼叫的開始和結束時間?

控制器是無狀態的,所以你將需要類似的東西來存儲通話的狀態。

或者如果你不想存儲狀態,爲什麼不在Javascript中完成所有操作?

+0

我有一個Call域對象,是的,但它與其他的東西混雜在一起,只是想知道如果有一種方式,我可以做到這一點,而不必將其存儲在對象本身。僅存儲經過的時間將是優選的。:) –

1

問題是,控制器意味着無狀態 - 所以,雖然我不確定它實際上是否這樣做,但Grails可以自由地爲每個請求構造一個新的控制器,或者在重新初始化控制器之前處理新的請求。

如果你可以保證只有這個控制器的一個客戶端,你可以讓startTime成爲一個靜態變量。

否則,你必須找到一些方法來保持連接()和callEnded()的調用之間的狀態。在一個「正常」的面向用戶的應用程序中,這可以通過將startTime存儲在用戶的會話中來完成。

+0

所以這聽起來像我只需要爲Call對象創建一個startTime變量......我對軟件開發相當陌生,但我想在對象中有很多變量並不奇怪。我可以做到這一點。謝謝! –