我的Rivr VoiceXML应用程序中的每个对话请求都有超时日志项。我看过com.nuecho.rivr.core.channel.Timeout在doTurn方法中,这没问题,但我一直在获取这些日志,这些日志不在我的代码中,所以不知道如何捕获并防止日志文件中充满它们:
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");谢谢你的帮助
发布于 2015-09-23 10:12:54
您可能在`DialogueUtils.doTurn()方法中传递了一个超时。因此您可以使用:
doTurn(O outputTurn, DialogueContext<I,O> context, Duration timeout)而不是无超时版本。
doTurn(O outputTurn, DialogueContext<I,O> context)在某些情况下,您的VoiceXML平台不会在指定的超时时间内为您的对话提供答案。这将触发Timeout异常。对话将终止,对话的最后一步(在本例中是一个例外)不能被DialogServlet使用,因为在这种情况下没有活动的HttpServletRequest (超时发生在VoiceXML平台执行文档时)。
因此,最终,您不希望发生超时,因为它会阻止您控制对话。超时就像安全网一样存在。如果由于某种原因,VoiceXML平台停止向您的对话框发送轮流,它必须终止并释放资源。
如果您想在doTurn()中设置一个超时作为安全网,请使用一个大于maximumTime属性+录制前所有提示的持续时间的值。这样,VoiceXML平台将抛出一个错误,并将其发送回您的对话框。现在,您可以控制调用流中的下一步操作。在这种情况下,您的录制结果中将包含maxTime=true。
我建议您签入connection.disconnect.hangup事件的VoiceXmlInputTurn,并更干净地退出对话框(如果存在)。
类似于:
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、nomatch、error等,并执行相应的操作。
https://stackoverflow.com/questions/32700913
复制相似问题