Проверка прошедшего времени в Groovy / Grails - PullRequest
1 голос
/ 06 октября 2011

Я пытаюсь определить продолжительность телефонного звонка через Интернет, передавая новое значение даты в приложение во время соединения и время выхода каждого звонка.

Код выглядит примерно так:

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 ]

2 голосов
/ 06 октября 2011

Вы можете поместить значение в сеанс, и оно будет сохраняться между запросами. Например:

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
}
1 голос
/ 06 октября 2011

Проблема в том, что контроллеры предназначены для сохранения состояния - поэтому, хотя я не уверен, что это действительно так, Grails может либо создать новый контроллер для каждого запроса, либо повторно инициализировать контроллер перед обработкой.новый запрос.

Если вы можете гарантировать, что когда-либо будет только один клиент этого контроллера, вы можете сделать startTime статической переменной.

В противном случае вам придется найти какой-то способудерживать состояние между вызовами к connected () и callEnded ().В «нормальном» пользовательском приложении это можно сделать, сохранив startTime в сеансе пользователя.

1 голос
/ 06 октября 2011

То есть у вас нет Call объекта домена для хранения времени начала и окончания каждого вызова?

Контроллеры не имеют состояния, поэтому вам понадобится что-то подобное для хранения состояния вызова.

Или, если вы не хотите сохранять состояние, почему бы просто не сделать все это в Javascript?

...