Таймаут логов в Ривр Диалоги
У меня есть записи журнала тайм-аута для каждого запроса диалога в моем приложении 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");
Спасибо за любую помощь
1 ответ
Возможно, вы передаете тайм-аут в методе `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
собственность вашего Recording
вместо установки значения времени ожидания в doTurn()
, Если вы хотите поставить тайм-аут в doTurn()
в качестве защитной сетки используйте значение, которое больше, чем maximumTime
свойство + продолжительность всех запросов до записи. Таким образом, платформа VoiceXML выдаст ошибку и отправит ее обратно в ваш диалог. Теперь вы можете контролировать, что будет дальше в вашем потоке вызовов. В этом случае у вас будет maxTime=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
, nomatch
, error
и т. д., в зависимости от типа хода, который вы обрабатываете, и делайте что-то соответственно.