Проверка прошедшего времени в 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 в сеансе пользователя.

Другие вопросы по тегам