Вот, кстати, насчет xmpp. Ловлю я забавный баг.
Тестирую xmpp-бота через Nimbuzz iphone app (в котором включен GTalk аккаунт). Шлю боту сообщения.
Смотрю логи, а там критическая ошибка:
/_ah/xmpp/message/chat/
java.lang.IllegalArgumentException: Must set a body
Далее цепочка стека, и там нахожу что узкое место в моем doPost запросе, на строке где я извлекаю сообщение:
То-есть боту сообщения идут. (пустое сообщение я не могу отправить).
Но почему-то body отсутствует.
Еще раз стек:
/_ah/xmpp/message/chat/
java.lang.IllegalArgumentException: Must set a body
at com.google.appengine.api.xmpp.MessageBuilder.build(MessageBuilder.java:54)
at com.google.appengine.api.xmpp.InboundMessageParser.parseMessage(InboundMessageParser.java:43)
at com.google.appengine.api.xmpp.XMPPServiceImpl.parseMessage(XMPPServiceImpl.java:190)
at com.oskolkov.java.texas.TexasBot.doPost(TexasBot.java:209)
и т.д.
причем на функциональность бота это никак не влияет. Он отвечает на определнные сообщения нужным образом (то-есть body пришедшего сообщения парсится получается).
Но критические ошибки в логах всё равно глаз режут.
Похоже, что это чисто nimbuzz так странно воспринимается.
Спасибо.
Я вот буквально минуту назад разобрался.
Не разобрался с тем, что гугл хранит несколько версий. И нужно самую свежую версию делать дефолтной вручную.
Заработал и Крон и вызов им GET'а /_ah/xmpp/message/chat/
Пардон, туплю-с.
Там в Дэшбоарде можно переключать версии приложения в выпадающем списке. Выбрал последнюю, и сервис появился.
А вот Cron похоже задания по адресу /_ah/xmpp/message/chat/ выполнять не хочет :(
В Cron Jobs постоянно вижу такую строку:
every 5 minutes (UTC)
2011/02/10 11:49:19 on time Failed
Смущает ещё то, что я пишу боту сообщения, но он на них не реагирует, хотя должен. Такое ощущение что POST запросы не ловятся. И логи в веб-интерфейсе молчат по поводу запросов. Логов вообще никаких нет.
Бардак какой-то в этом GAE происходит.
А не приходилось ли вам сталкиваться с такой бедой, когда в appengine-web.xml вы просите добавить xmppService
<inbound-services>
xmpp_message
</inbound-services>
а гугл его не активирует почему-то.
Через веб-интерфейс смотрю в Application Settings → Configured Services, а там пусто.
Хотя буквально пару дней назад писал другого бота и всё работало, и xmpp был в том списке.
То приложение я убил, создал вот новое, уже чистовое, задеплоил и не работает.
Хотел спросить у вас, как у человека явно в теме, не порекомендуете ли вы какого-нибудь коммьюнити по GAE более-менее живого?
Нашел русскоязычную гугл-группу, но похоже она мертва. Англоязычная, — там премодерация и, по-моему, пробиться невозможно.
Просто по ходу возникает море граблей (например, даже полностью скопированный из getting started пример по типу hello world так и не захотел заработать на локальном сервере, получаю HTTP ERROR 405), и гуглиться ответов крайне мало.
Как раз на английском. Просто Task Queue и Cron ( code.google.com/intl/uk-UA/appengine/docs/java/config/cron.html ) вещи разные.
Про Крон написано лишь как структурировать.хмл с инструкциями, и что там же указывается /url который будет дергаться. И всё. Каким именно образом не сказано.
Я буквально пару дней работаю с GAE и очень много вопросов, на которые не ответило прохождение Getting Started и остальные доки.
Только у гугла как-то совсем документация рваная какая-то.
Например не смог найти каким образом «дергается» сервлет кроном. Какая функция будет им запущена? doGet?
И ещё вопрос — можно ли как-то дебажить яббер-бота на локальном сервере?
Не могу найти как.
Приходится деплоить после каждого изменения и дебажить в реальных услових, а это геммор.
Спасибо, за очень полезный пост!
Я сам только начал работать с GAE (да и с явой) и сразу с задачи написать бота. Т.к., по-моему, очень удобный способ.
Но у меня задачка не только написать бота который что-то отвечает, но чтобы каждый день в определенное время он совершал некое действие (буду использовать Cron).
То-есть понадобиться два сервлета, насколько я понимаю. Один будет обрабатывать простые запросы-сообщения. Второй будет включаться Кроном.
Поэтому у меня вопрос: правильно ли я понимаю, что xmppService который нам выдает XMPPServiceFactory.getXMPPService(); — его эксземляр доступен из любого сервлета, так? В своем роде синглтон.
Потому что проблема для меня как-то связать два сервлета. Но если я могу из любого из них дергать единый экземgляр xmppService'а — это очень облегчает задачу.
Поправьте меня, пожалуйста, если я ошибаюсь.
Благодарю.
А потом бы уже лезли в революции в UI.
Тестирую xmpp-бота через Nimbuzz iphone app (в котором включен GTalk аккаунт). Шлю боту сообщения.
Смотрю логи, а там критическая ошибка:
/_ah/xmpp/message/chat/
java.lang.IllegalArgumentException: Must set a body
Далее цепочка стека, и там нахожу что узкое место в моем doPost запросе, на строке где я извлекаю сообщение:
Message message = xmppService.parseMessage(request);
String messageBody = message.getBody().toLowerCase();
То-есть боту сообщения идут. (пустое сообщение я не могу отправить).
Но почему-то body отсутствует.
Еще раз стек:
/_ah/xmpp/message/chat/
java.lang.IllegalArgumentException: Must set a body
at com.google.appengine.api.xmpp.MessageBuilder.build(MessageBuilder.java:54)
at com.google.appengine.api.xmpp.InboundMessageParser.parseMessage(InboundMessageParser.java:43)
at com.google.appengine.api.xmpp.XMPPServiceImpl.parseMessage(XMPPServiceImpl.java:190)
at com.oskolkov.java.texas.TexasBot.doPost(TexasBot.java:209)
и т.д.
причем на функциональность бота это никак не влияет. Он отвечает на определнные сообщения нужным образом (то-есть body пришедшего сообщения парсится получается).
Но критические ошибки в логах всё равно глаз режут.
Похоже, что это чисто nimbuzz так странно воспринимается.
Когда я вызываю при приёме сообщения:
Message message.getFromJid().getId()
то получаю вот такие айдишники условно
r***@*****.com/Talk.v105FBAF40B9
Причем вот этот вот хлам после слэша периодически меняется, даже если используешь один и тот же Гугл-Ток клиент. Это сильно мешает.
Не знаете ли вы как получить строго адрес почты? me@mydomain.com
Или только вырезать вручную?
Я вот буквально минуту назад разобрался.
Не разобрался с тем, что гугл хранит несколько версий. И нужно самую свежую версию делать дефолтной вручную.
Заработал и Крон и вызов им GET'а /_ah/xmpp/message/chat/
Там в Дэшбоарде можно переключать версии приложения в выпадающем списке. Выбрал последнюю, и сервис появился.
А вот Cron похоже задания по адресу /_ah/xmpp/message/chat/ выполнять не хочет :(
В Cron Jobs постоянно вижу такую строку:
every 5 minutes (UTC)
2011/02/10 11:49:19 on time Failed
Смущает ещё то, что я пишу боту сообщения, но он на них не реагирует, хотя должен. Такое ощущение что POST запросы не ловятся. И логи в веб-интерфейсе молчат по поводу запросов. Логов вообще никаких нет.
Бардак какой-то в этом GAE происходит.
<inbound-services>
xmpp_message
</inbound-services>
а гугл его не активирует почему-то.
Через веб-интерфейс смотрю в Application Settings → Configured Services, а там пусто.
Хотя буквально пару дней назад писал другого бота и всё работало, и xmpp был в том списке.
То приложение я убил, создал вот новое, уже чистовое, задеплоил и не работает.
Странно.
Хотел спросить у вас, как у человека явно в теме, не порекомендуете ли вы какого-нибудь коммьюнити по GAE более-менее живого?
Нашел русскоязычную гугл-группу, но похоже она мертва. Англоязычная, — там премодерация и, по-моему, пробиться невозможно.
Просто по ходу возникает море граблей (например, даже полностью скопированный из getting started пример по типу hello world так и не захотел заработать на локальном сервере, получаю HTTP ERROR 405), и гуглиться ответов крайне мало.
Про Крон написано лишь как структурировать.хмл с инструкциями, и что там же указывается /url который будет дергаться. И всё. Каким именно образом не сказано.
Я буквально пару дней работаю с GAE и очень много вопросов, на которые не ответило прохождение Getting Started и остальные доки.
Только у гугла как-то совсем документация рваная какая-то.
Например не смог найти каким образом «дергается» сервлет кроном. Какая функция будет им запущена? doGet?
Не могу найти как.
Приходится деплоить после каждого изменения и дебажить в реальных услових, а это геммор.
Я сам только начал работать с GAE (да и с явой) и сразу с задачи написать бота. Т.к., по-моему, очень удобный способ.
Но у меня задачка не только написать бота который что-то отвечает, но чтобы каждый день в определенное время он совершал некое действие (буду использовать Cron).
То-есть понадобиться два сервлета, насколько я понимаю. Один будет обрабатывать простые запросы-сообщения. Второй будет включаться Кроном.
Поэтому у меня вопрос: правильно ли я понимаю, что xmppService который нам выдает XMPPServiceFactory.getXMPPService(); — его эксземляр доступен из любого сервлета, так? В своем роде синглтон.
Потому что проблема для меня как-то связать два сервлета. Но если я могу из любого из них дергать единый экземgляр xmppService'а — это очень облегчает задачу.
Поправьте меня, пожалуйста, если я ошибаюсь.
Благодарю.
Или пользователи получат его как бесплатное обновление?