1

我试图通过在每次通话的连接时间和退出时间将新的 Date 值传递给应用程序来获取基于 Web 的电话通话的持续时间。

代码看起来有点像这样:

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:

用正确的代码修复。

感谢大家的帮助!

4

3 回答 3

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
}
于 2011-10-06T14:31:25.970 回答
1

所以你没有一个Call域对象来存储每次调用的开始和结束时间?

控制器是无状态的,因此您将需要类似的东西来存储调用的状态。

或者,如果您不想存储状态,为什么不直接用 Javascript 来完成呢?

于 2011-10-06T14:32:31.713 回答
1

问题是控制器应该是无状态的——所以,虽然我不确定它是否真的做到了这一点,但 Grails 可以自由地为每个请求构建一个新的控制器,或者在处理一个新的请求之前重新初始化一个控制器.

如果你能保证这个控制器永远只有一个客户端,你可以让 startTime 成为一个静态变量。

否则,您必须找到某种方法来保持对 connected() 和 callEnded() 的调用之间的状态。在“正常”的、面向用户的应用程序中,这可以通过将 startTime 存储在用户会话中来完成。

于 2011-10-06T14:39:41.217 回答