Таймаут логов в Ривр Диалоги

У меня есть записи журнала тайм-аута для каждого запроса диалога в моем приложении 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и т. д., в зависимости от типа хода, который вы обрабатываете, и делайте что-то соответственно.

Другие вопросы по тегам