1

我的 Rivr VoiceXML 应用程序中的每个对话请求都有超时日志条目。我已经在 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 平台停止发送转向您的对话,它必须终止并释放资源。

注意:也许它与您要完成的任务无关,但如果您正在录制,您可能希望设置maximumTimeyour 的属性,Recording而不是在doTurn(). 如果您想将超时设置doTurn()为安全网,请使用大于maximumTime属性 + 记录前所有提示的持续时间的值。这样,VoiceXML 平台将引发错误并将其发送回您的对话。您现在可以控制呼叫流程中接下来发生的事情。在这种情况下,您将maxTime=true在您的记录结果中。

我建议您签入您VoiceXmlInputTurnconnection.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() {}
    }

}

同样,最好根据您正在处理的转弯类型检查其他事件,如noinputnomatch、等,并相应地做一些事情。error

于 2015-09-23T02:12:53.523 回答