2015-09-21 1 views
1

У меня есть записи журнала таймаута для каждого запроса на диалог в приложении 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"); 

Спасибо за любую помощь

+0

Это немного странно. Это означает, что результат вашего диалога не потребляется DialogueServlet в течение 5 секунд. На этом сервере много нагрузки? – gawi

+0

Нет, совсем нет. Это единственное приложение на сервере. Диалог выполняет несколько действий и, возможно, занимает более 5 секунд, так как запрашивает, записывает сообщение, транскрибирует его с помощью голоса, чтобы воспользоваться услугами внешнего API, выполнять другую задачу API при транскрипции и отправлять результаты. Все эти задачи занимают, вероятно, более 5 секунд, но я думаю, это не означает, что метод run() в диалоговом режиме не потребляется за 5 секунд.включать ли временные метки и регистрировать их через метод run()? Большое спасибо за вашу помощь. – icordoba

+0

Этот тайм-аут не зависит от кода приложения. Окончательный send() - это шаг, на котором результаты диалога (т.е. то, что вы возвращаете из метода Dialogue.run()) отправляются сервлету через синхронную очередь. Я не понимаю, почему DialogueServlet займет больше 5 секунд, чтобы сделать take(). Вы действительно что-то вернули? Бросает ли ваш диалог? – gawi

ответ

0

Возможно, вы передаете тайм-аут в `DialogueU tils.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 и т.д. в зависимости от вида поворота вы обработки и сделать что-то соответствующим образом.

+0

Привет, спасибо за ваш ответ. Я не использую таймаут в любом из методов doTurn. Кроме того, я внесла некоторые изменения в код, чтобы рассмотреть ваш последний совет о Hangup подключения Disconnect. BTW, я всегда возвращал новый Exit («exit»), не делал exit-error или exit-normal. ... mmm ... в subdialogs, должен ли я возвращать Return ("return-error") в случае ошибки? Спасибо – icordoba

+0

Существует тайм-аут по умолчанию 60 секунд. Поэтому, если ваше взаимодействие (запись) занимает более 60 секунд, у вас будет тайм-аут. – gawi

+0

«exit-error» vs «exit-normal» ... это просто название поворота. Это не имеет никакого другого влияния. – gawi

Смежные вопросы