Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Чтение событий в aggregate и использование их в своём модуле. (как прочитать) #62

Open
UUSR opened this issue Mar 29, 2016 · 22 comments

Comments

@UUSR
Copy link

UUSR commented Mar 29, 2016

На пример я в методе start регистрирую слушателя на события asr.result и tts.say:

vertx.eventBus().consumer("asr.result", msg -> {
msg.reply(getQuestion(Request.fromMessage(msg)));
});
vertx.eventBus().consumer("tts.say", msg -> {
msg.reply(getAnswer(Request.fromMessage(msg)));
});
f.complete();

После этого модуль должен слушать события и при появлении одного из событий начинает выполняться код модуля расположенный после метода start.
Вот не понятно когда начинает выполняться код в модуле?
Обязательно ли использовать файл грамматики для работы с этими двумя событиями в модуле?

И не понятно как получить из посланного события само сообщение в виде текста ?

@morfeusys
Copy link
Contributor

Само сообщение - это тот самый msg.body(), который может быть и пустым.
Во-вторых, сам код выполняется только при наступлении события естественно.
Файл грамматик конечно же не нужен тут.
"tts.say" - это прямое сообщение, а не широковещательное, так что ваш модуль может его вообще никогда не получить.
"asr.result" слушать вообще не рекомендуется для выполнения чего-либо, так как это событие слушает сам агрегат, который после этого формирует событие для одного из функциональных модулей.

@UUSR
Copy link
Author

UUSR commented Mar 30, 2016

@morfeusys в интернете мало информации, прошу объяснить подробнее.

----это тот самый msg.body(), который может быть и пустым.
На пример я создаю объект:
private Object Question(Request fromMessage) {
потом в методе Start пишу:
vertx.eventBus().consumer("asr.result", msg -> {
msg.reply(Question(Request.fromMessage(msg)));
как теперь из этого msg.body() получить текст ,например String text = ?

----сам код выполняется только при наступлении события естественно.
Я так понял что события asr.result описанного в методе start не достаточно для запуска кода на выполнение в модуле. (я скомпилил и выполняет только метод start).
Наверное Aggregate должен послать событие непосредственно для модуля ?

----"tts.say" - это прямое сообщение, а не широковещательное, так что ваш модуль может его вообще никогда не получить.
Как же мне прочитать в модуле ответ от агрегата ? (ведь он в виде текста даже виден в терминале).

----"asr.result" слушать вообще не рекомендуется для выполнения чего-либо,
Как же мне тогда получить вопрос ,который пользователь задаёт? (как я уже говорил ранее это всё нужно для базы данных)
можно мне скинуть вам весь код модуля чтобы вы меня поправили?

@morfeusys
Copy link
Contributor

@UUSR вы можете безусловно слушать событие asr.result. Но только не генерировать какой-то ответ пользователю на это событие. Так как оно не имеет к вашему модулю непосредственного отношения.
Событие tts.say еще не означает, что какой-то модуль обработал или не обработал запрос. Ровно как и отсутствие события tts.say, которое не означает, что ответа от модуля нет.

@UUSR
Copy link
Author

UUSR commented Apr 1, 2016

@morfeusys я и ничего пока не генерирую для пользователя ,я не могу понять как запустить код в модуле на выполнение при получении события asr.result ?
Мне нужно чтобы сообщение из события записалось в базу данных.

@morfeusys
Copy link
Contributor

@UUSR у события asr.result msg.body() будет содержать строку распознанного текста

@UUSR
Copy link
Author

UUSR commented Apr 1, 2016

@morfeusys Я абсолютно ни чего не понимаю в JAVA ,прямо руки опускаются.

Ругается на неправильно составленный код:
INFO: Processing...
апр 01, 2016 11:21:05 PM io.vertx.core.eventbus.impl.HandlerRegistration
SEVERE: Failed to handleMessage
java.lang.NullPointerException
at com.aggregate.brain.my.MyBrain.question(MyBrain.java:46)
at com.aggregate.brain.my.MyBrain.lambda$0(MyBrain.java:38)
at io.vertx.core.eventbus.impl.HandlerRegistration.handleMessage(Unknown Source)
at io.vertx.core.eventbus.impl.HandlerRegistration.handle(Unknown Source)
at io.vertx.core.eventbus.impl.EventBusImpl.lambda$deliverToHandler$127(Unknown Source)
at io.vertx.core.impl.ContextImpl.lambda$wrapTask$18(Unknown Source)
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(Unknown Source)
at io.netty.channel.nio.NioEventLoop.run(Unknown Source)
at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

апр 01, 2016 11:21:05 PM io.vertx.core.impl.ContextImpl
SEVERE: Unhandled exception
java.lang.NullPointerException
at com.aggregate.brain.my.MyBrain.question(MyBrain.java:46)
at com.aggregate.brain.my.MyBrain.lambda$0(MyBrain.java:38)
at io.vertx.core.eventbus.impl.HandlerRegistration.handleMessage(Unknown Source)
at io.vertx.core.eventbus.impl.HandlerRegistration.handle(Unknown Source)
at io.vertx.core.eventbus.impl.EventBusImpl.lambda$deliverToHandler$127(Unknown Source)
at io.vertx.core.impl.ContextImpl.lambda$wrapTask$18(Unknown Source)
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(Unknown Source)
at io.netty.channel.nio.NioEventLoop.run(Unknown Source)
at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

строка 38 question(Request.fromMessage(msg));
строка 46 String text = request.markup.source;

@morfeusys
Copy link
Contributor

@UUSR не опускайте )) уже совсем скоро будет версия 0.0.2, где кроме всего прочего будет поддержка сразу нескольких языков программирования

@UUSR
Copy link
Author

UUSR commented Apr 2, 2016

@morfeusys разобрался с message.body() выводит запрос пользователя в консоль.
vertx.eventBus().consumer("asr.result", message -> {
System.out.println("1 отправленое сообщение message.body() = " + message.body());
});

@morfeusys
Copy link
Contributor

@UUSR В обновлении агрегата вы сможете подслушать любой ответ от любого модуля, просто слушая стандартное событие "response".

@UUSR
Copy link
Author

UUSR commented Apr 2, 2016

@morfeusys это очень хорошо но я хочу JAVA понять ,уж очень интересный язык ,всё на своих местах надо просто привыкнуть к нему.

почему то в консоль выводит два раза подряд:
INFO: ASR state: start
апр 02, 2016 8:38:25 PM Dispatcher
INFO: ASR state: rec
апр 02, 2016 8:38:27 PM Dispatcher
INFO: ASR state: done
апр 02, 2016 8:38:27 PM Dispatcher
INFO: ASR state: end
1 received message.body() = что ты говорила
1 received message.body() = что ты говорила
апр 02, 2016 8:38:29 PM Dispatcher
INFO: Processing...
апр 02, 2016 8:38:29 PM Dispatcher
INFO: Processing что ты говорила

Странно почему два раза выводит ?
Ничего не помнит о чём речь шла ,без базы вопросов никуда...

@UUSR
Copy link
Author

UUSR commented Apr 3, 2016

С tts.say у меня проблемы пишет в базу прошлое сообщение или Агрегат отвечает сначала "Вас не слышно" а потом Дуся отвечает ещё раз. Получается что вопрос в таблице не соответствует ответу.
И ещё заметил если сообщение "tts.say" перехватывает мой модуль то модуль синтеза речи не может ничего получить и озвучка просто не работает. (в документации написано что tts.say не широковещательное ,т. е. предназначено только для модуля синтеза речи).

Жду обновления Aggregate ,возможно с сообщением "response" будет проще записать ответ.

Вот не могу понять эти ошибки ,возникают при обработке исключений в коде:

INFO: ASR state: end
апр 03, 2016 4:32:27 AM io.vertx.core.eventbus.impl.HandlerRegistration
SEVERE: Failed to handleMessage
java.lang.IllegalStateException: Result is already complete: failed
at io.vertx.core.impl.FutureImpl.checkComplete(Unknown Source)
at io.vertx.core.impl.FutureImpl.fail(Unknown Source)
at io.vertx.core.impl.FutureImpl.fail(Unknown Source)
at com.aggregate.brain.my.MyBrain.lambda$1(MyBrain.java:49)
at io.vertx.core.eventbus.impl.HandlerRegistration.handleMessage(Unknown Source)
at io.vertx.core.eventbus.impl.HandlerRegistration.handle(Unknown Source)
at io.vertx.core.eventbus.impl.EventBusImpl.lambda$deliverToHandler$127(Unknown Source)
at io.vertx.core.impl.ContextImpl.lambda$wrapTask$18(Unknown Source)
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(Unknown Source)
at io.netty.channel.nio.NioEventLoop.run(Unknown Source)
at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

апр 03, 2016 4:32:27 AM io.vertx.core.impl.ContextImpl
SEVERE: Unhandled exception
java.lang.IllegalStateException: Result is already complete: failed
at io.vertx.core.impl.FutureImpl.checkComplete(Unknown Source)
at io.vertx.core.impl.FutureImpl.fail(Unknown Source)
at io.vertx.core.impl.FutureImpl.fail(Unknown Source)
at com.aggregate.brain.my.MyBrain.lambda$1(MyBrain.java:49)
at io.vertx.core.eventbus.impl.HandlerRegistration.handleMessage(Unknown Source)
at io.vertx.core.eventbus.impl.HandlerRegistration.handle(Unknown Source)
at io.vertx.core.eventbus.impl.EventBusImpl.lambda$deliverToHandler$127(Unknown Source)
at io.vertx.core.impl.ContextImpl.lambda$wrapTask$18(Unknown Source)
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(Unknown Source)
at io.netty.channel.nio.NioEventLoop.run(Unknown Source)
at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

Не удалось обработать сообщение
Необработанное исключение
Сейчас допишу правильно обработку исключений...

@morfeusys
Copy link
Contributor

@UUSR В обновлении 0.0.2 вы можете слушать событие "response", чтобы получать все ответы от всех модулей

@UUSR
Copy link
Author

UUSR commented Apr 4, 2016

@morfeusys подскажите событие "response" имеет сообщение "формат ответа". Это уже не msg.body () ,у меня на этой строке модуль сейчас ошибку выдаёт?

лог:

SEVERE: Failed to handleMessage
java.lang.ClassCastException: io.vertx.core.json.JsonObject cannot be cast to java.lang.String
at com.aggregate.brain.my.MyBrain.lambda$1(MyBrain.java:41)

JSONObject не может быть приведен к java.lang

@morfeusys
Copy link
Contributor

Ну так естественно это msg.body(). Но он может быть или строкой, или json объектом.

@UUSR
Copy link
Author

UUSR commented Apr 5, 2016

@morfeusys как объект получаю строку вида:
{"context":null,"speeches":["Зачем ты так со мной?"],"modal":false}
вот ума не приложу как из неё текст ответа вынуть?

@morfeusys
Copy link
Contributor

@UUSR Это не строка, это JsonObject - его методами и нужно вытаскивать speeches

@UUSR
Copy link
Author

UUSR commented Apr 5, 2016

@morfeusys вот так?
JsonObject json = (JsonObject) message.body();

@morfeusys
Copy link
Contributor

Просто так кастить не надо - нужно проверить на instanceof строка это или объект

@UUSR
Copy link
Author

UUSR commented Apr 7, 2016

@morfeusys на пример у нас есть:
vertx.eventBus().consumer("response", msg -> {

if (msg instanceof Object) {

}
else {

}
});

@morfeusys
Copy link
Contributor

@UUSR вам все же нужно сперва разобраться с Java. Или уж писать модуль на другом языке - поддерживаются Javascript, Typescript, Groovy и Ruby

@UUSR
Copy link
Author

UUSR commented Apr 7, 2016

@morfeusys Java пытаюсь изучать по возможности.

@UUSR
Copy link
Author

UUSR commented Apr 22, 2016

Событие response ,не смог найти полного описания в WIKI

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants