1

Rivr VoiceXML アプリケーションで、Dialogue リクエストごとにタイムアウト ログ エントリがあります。doTurn メソッドで com.nuecho.rivr.core.channel.Timeout を確認しましたが、問題ありませんが、これらのログを取得し続けています。これは私のコードから外れているため、ログ ファイルの取得をキャッチして防止する方法がわかりません。それらの完全な:

2015-09-21T19:03:02.29+0200 [App/0]      ERR [err] [Dialogue adef5e0c-4b6d-4f9a-9246-db8c3afadda9] INFO com.nuecho.rivr.dialogue - Dialogue ended.
2015-09-21T19:03:02.29+0200 [App/0]      ERR [err] Exception in thread "Dialogue adef5e0c-4b6d-4f9a-9246-db8c3afadda9" 
2015-09-21T19:03:02.29+0200 [App/0]      ERR [err] java.lang.RuntimeException: Timeout while sending final result.
2015-09-21T19:03:02.29+0200 [App/0]      ERR [err]  at com.nuecho.rivr.core.channel.synchronous.SynchronousDialogueChannel$1.run(SynchronousDialogueChannel.java:242)
2015-09-21T19:03:02.29+0200 [App/0]      ERR [err]  at java.lang.Thread.run(Unknown Source)
2015-09-21T19:03:02.29+0200 [App/0]      ERR [err] Caused by: 
2015-09-21T19:03:02.29+0200 [App/0]      ERR [err] com.nuecho.rivr.core.channel.Timeout: Timed-out in send() after 5 seconds (5000 ms) in [dialogue to controller]
2015-09-21T19:03:02.29+0200 [App/0]      ERR [err]  at com.nuecho.rivr.core.channel.synchronous.SynchronousDialogueChannel.send(SynchronousDialogueChannel.java:405)
2015-09-21T19:03:02.29+0200 [App/0]      ERR [err]  at com.nuecho.rivr.core.channel.synchronous.SynchronousDialogueChannel.access$600(SynchronousDialogueChannel.java:97)
2015-09-21T19:03:02.29+0200 [App/0]      ERR [err]  at com.nuecho.rivr.core.channel.synchronous.SynchronousDialogueChannel$1.run(SynchronousDialogueChannel.java:239)
2015-09-21T19:03:02.30+0200 [App/0]      ERR [err]  ... 1 more

おそらく、それらを防ぐために、ダイアログコードでキャッチした com.nuecho.rivr.core.channel.Timeout で何らかのアクションを実行する必要があります(現在、私は

return new Exit("exit");

助けてくれてありがとう

4

1 に答える 1

0

おそらく、`DialogueUtils.doTurn() メソッドでタイムアウトを渡しています。だからあなたは使用します:

doTurn(O outputTurn, DialogueContext<I,O> context, Duration timeout)

タイムアウトのないバージョンの代わりに。

doTurn(O outputTurn, DialogueContext<I,O> context)

場合によっては、VoiceXML プラットフォームが、指定されたタイムアウト内にダイアログへの応答を提供しないことがあります。Timeoutこれにより、例外がトリガーされます。DialogServletダイアログは終了し、ダイアログの最後のステップ (この場合は例外) は、この場合はアクティブでないため、消費できませんHttpServletRequest(VoiceXML プラットフォームがドキュメントを実行している間にタイムアウトが発生します)。

したがって、最終的には、ダイアログを制御できなくなるため、タイムアウトが発生することは望ましくありません。タイムアウトはセーフティネットとして存在します。何らかの理由で VoiceXML プラットフォームがダイアログへのターンの送信を停止した場合は、終了してリソースを解放する必要があります。

注: 達成しようとしていることとは関係ないかもしれませんが、記録を行っている場合は、でタイムアウト値を設定する代わりに、 のmaximumTimeプロパティを設定することをお勧めします。セーフティ ネットとしてタイムアウトを設定する場合は、プロパティ + 記録前のすべてのプロンプトの期間よりも大きな値を使用します。このように、VoiceXML プラットフォームはエラーを発生させ、それをダイアログに送り返します。コールフローで次に何が起こるかを制御できるようになりました。この場合、記録結果に含まれます。RecordingdoTurn()doTurn()maximumTimemaxTime=true

VoiceXmlInputTurnイベントをチェックインし、connection.disconnect.hangup存在する場合はダイアログをよりきれいに終了することをお勧めします。

何かのようなもの:

package com.nuecho.rivr.cookbook.dialogue;

import static com.nuecho.rivr.core.dialogue.DialogueUtils.*;

import com.nuecho.rivr.core.channel.*;
import com.nuecho.rivr.core.util.*;
import com.nuecho.rivr.voicexml.dialogue.*;
import com.nuecho.rivr.voicexml.turn.first.*;
import com.nuecho.rivr.voicexml.turn.input.*;
import com.nuecho.rivr.voicexml.turn.last.*;
import com.nuecho.rivr.voicexml.turn.output.*;
import com.nuecho.rivr.voicexml.turn.output.audio.*;

public class Dialogue implements VoiceXmlDialogue {

    @Override
    public VoiceXmlLastTurn run(VoiceXmlFirstTurn firstTurn, VoiceXmlDialogueContext context)
            throws Timeout, InterruptedException {

        try {
            Message message = new Message("message", new SpeechSynthesis("Hello World!"));
            VoiceXmlInputTurn inputTurn = doTurn(message, context, Duration.milliseconds(1200));
            if (VoiceXmlEvent.hasEvent(VoiceXmlEvent.CONNECTION_DISCONNECT_HANGUP, inputTurn.getEvents())) { 
                throw new CallerDisconnect(); 
            }
        } catch (CallerDisconnect callerDisconnect) {
            return new Exit("exit-error");
        }

        return new Exit("exit-normal");
    }

    public static class CallerDisconnect extends Exception {
        public CallerDisconnect() {}
    }

}

同様に、処理しているターンの種類に応じて 、 、 などの他のイベントをチェックし、それにnoinput応じnomatcherror何かを行うとよいでしょう。

于 2015-09-23T02:12:53.523 に答える