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:

startTime と endTime の Call オブジェクトに変数を作成しました。しかし、今は日付を更新するのに問題があります.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

問題は、コントローラーがステートレスであることを意図していることです。したがって、実際にこれを行うかどうかはわかりませんが、Grailsは、リクエストごとに新しいコントローラーを作成するか、新しいリクエストを処理する前にコントローラーを再初期化することができます。 。

このコントローラーのクライアントが1つだけになることを保証できる場合は、startTimeを静的変数にすることができます。

それ以外の場合は、connected()とcallEnded()の呼び出しの間に状態を保持する方法を見つける必要があります。「通常の」ユーザー向けアプリケーションでは、これはユーザーのセッションにstartTimeを格納することによって行われます。

于 2011-10-06T14:39:41.217 に答える
1

Call各呼び出しの開始時刻と終了時刻を格納するドメイン オブジェクトがありませんか?

コントローラーはステートレスなので、呼び出しの状態を保存するにはそのようなものが必要になります。

または、状態を保存したくない場合は、すべてを Javascript で実行してみませんか?

于 2011-10-06T14:32:31.713 に答える