Проверка прошедшего времени в 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. Но теперь у меня проблемы с обновлением дат. Я думаю, что Граилсу не нравится обновлять даты? Он говорит, что у него проблемы с передачей новой даты в переменную даты. Это точная ошибка:
java.lang.ClassCastException: [Ljava.util.Date; cannot be cast to java.util.Date
и Stacktrace указывает на линию, где я пытаюсь обновить вызов. Есть ли обходной путь для этого?
Еще раз спасибо!
Изменить 3:
Исправлено с правильным кодом.
Спасибо всем за вашу помощь!
3 ответа
Вы можете поместить значение в сеанс, и оно будет сохраняться между запросами. Например:
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
}
Так что у вас нет Call
доменный объект для хранения времени начала и окончания каждого вызова?
Контроллеры не имеют состояния, поэтому вам понадобится что-то подобное для хранения состояния вызова.
Или, если вы не хотите хранить состояние, почему бы просто не сделать все это в Javascript?
Проблема в том, что контроллеры предназначены для сохранения состояния - поэтому, хотя я не уверен, что это действительно так, Grails может либо создать новый контроллер для каждого запроса, либо повторно инициализировать контроллер перед обработкой нового запроса.,
Если вы можете гарантировать, что когда-либо будет только один клиент этого контроллера, вы можете сделать startTime статической переменной.
В противном случае вам нужно будет найти способ удержания состояния между вызовами к connected() и callEnded(). В "нормальном" приложении, ориентированном на пользователя, это можно сделать, сохранив startTime в сеансе пользователя.