> Разработчик получает очень высокоуровневые методы, что упрощают разработку
это круто, сервисное программирование в подобном виде радует скоростью и простотой разработки, даже при наличии некоторых ограничений в большинстве случаев базовых функций хватает с головой
Да, может. Вот этот адрес ("/_ah/xmpp/message/chat/") — это т.н. web hook, на который и придет сообщение. Т.е это просто урл, по которому запустится копия приложения, а ему передастся в req объект сообщения. А что оно там будет выполнять — проблема разработчика. По тому же принципу построены Mail, TaskQueue.
Немного дополню mrskam. Входящее сообщение не порождает обрабатываемое событие. В Java веб-приложениях нет евентов, как в обычных десктопных приложениях, основное событие — HTTP запрос. В GAE ещё есть служба cron — выполнение заданий по расписанию. И даже она работает по такому же принципу: в запланированное время просто выполняется запрос на заданный URL.
Спасибо, за очень полезный пост!
Я сам только начал работать с GAE (да и с явой) и сразу с задачи написать бота. Т.к., по-моему, очень удобный способ.
Но у меня задачка не только написать бота который что-то отвечает, но чтобы каждый день в определенное время он совершал некое действие (буду использовать Cron).
То-есть понадобиться два сервлета, насколько я понимаю. Один будет обрабатывать простые запросы-сообщения. Второй будет включаться Кроном.
Поэтому у меня вопрос: правильно ли я понимаю, что xmppService который нам выдает XMPPServiceFactory.getXMPPService(); — его эксземляр доступен из любого сервлета, так? В своем роде синглтон.
Потому что проблема для меня как-то связать два сервлета. Но если я могу из любого из них дергать единый экземgляр xmppService'а — это очень облегчает задачу.
Поправьте меня, пожалуйста, если я ошибаюсь.
Благодарю.
XMPPServiceFactory.getXMPPService() — создает отдельный инстанс сервиса.
Думаю на деле, все равно объект XMPPService служба возвращает один и тот же.
Не вижу смысла как-то разделять сам инстанс между разными сервлётами, если у Вас их всего пара — один на «прием», другой — на «передачу». Т.к. в самом объекте XMPPService нельзя сохранять какие-либо данные.
Крон может «дергать» тот-же самый сервлёт, что обрабатывает >простые запросы-сообщения.
Только у гугла как-то совсем документация рваная какая-то.
Например не смог найти каким образом «дергается» сервлет кроном. Какая функция будет им запущена? doGet?
Как раз на английском. Просто Task Queue и Cron ( code.google.com/intl/uk-UA/appengine/docs/java/config/cron.html ) вещи разные.
Про Крон написано лишь как структурировать.хмл с инструкциями, и что там же указывается /url который будет дергаться. И всё. Каким именно образом не сказано.
Я буквально пару дней работаю с GAE и очень много вопросов, на которые не ответило прохождение Getting Started и остальные доки.
Хотел спросить у вас, как у человека явно в теме, не порекомендуете ли вы какого-нибудь коммьюнити по GAE более-менее живого?
Нашел русскоязычную гугл-группу, но похоже она мертва. Англоязычная, — там премодерация и, по-моему, пробиться невозможно.
Просто по ходу возникает море граблей (например, даже полностью скопированный из getting started пример по типу hello world так и не захотел заработать на локальном сервере, получаю HTTP ERROR 405), и гуглиться ответов крайне мало.
И ещё вопрос — можно ли как-то дебажить яббер-бота на локальном сервере?
Не могу найти как.
Приходится деплоить после каждого изменения и дебажить в реальных услових, а это геммор.
На локальном сервере разработки исходящие сообщения отправляются на консоль. Входящие сообщения среда разработки эмулировать не может.
Как выход, вручную выполнять POST-запрос, как это делает сервис. Временно замапить сервлет обрабатывающий входящие сообщения на любой другой URL, т.к. /_ah/xmpp/message/chat/ не доступен снаружи.
А не приходилось ли вам сталкиваться с такой бедой, когда в appengine-web.xml вы просите добавить xmppService
<inbound-services>
xmpp_message
</inbound-services>
а гугл его не активирует почему-то.
Через веб-интерфейс смотрю в Application Settings → Configured Services, а там пусто.
Хотя буквально пару дней назад писал другого бота и всё работало, и xmpp был в том списке.
То приложение я убил, создал вот новое, уже чистовое, задеплоил и не работает.
Пардон, туплю-с.
Там в Дэшбоарде можно переключать версии приложения в выпадающем списке. Выбрал последнюю, и сервис появился.
А вот Cron похоже задания по адресу /_ah/xmpp/message/chat/ выполнять не хочет :(
В Cron Jobs постоянно вижу такую строку:
every 5 minutes (UTC)
2011/02/10 11:49:19 on time Failed
Смущает ещё то, что я пишу боту сообщения, но он на них не реагирует, хотя должен. Такое ощущение что POST запросы не ловятся. И логи в веб-интерфейсе молчат по поводу запросов. Логов вообще никаких нет.
Бардак какой-то в этом GAE происходит.
This URL (/_ah/xmpp/message/chat/) path is restricted to app administrators automatically. The XMPP service connects to the app with «administrator» status for the purposes of accessing this URL path. You can configure the path to have this restriction explicitly if you like, but this is not necessary. Only the XMPP service and clients authenticated as administrators using Google Accounts can access this URL path.
Видимо службы крон работает с приложением не от имени администратора.
Как вариант для отладки, я же предлагал замапить сервлет на любой другой адрес, /_ah/xmpp/message/chat/
Спасибо.
Я вот буквально минуту назад разобрался.
Не разобрался с тем, что гугл хранит несколько версий. И нужно самую свежую версию делать дефолтной вручную.
Заработал и Крон и вызов им GET'а /_ah/xmpp/message/chat/
Что-бы каждый раз не лазить в консоль администрирования и не менять вручную версии, просто не меняйте версию в appengine-web.xml при загрузке, она тогда заменит существующую.
GAE XMPP (Java API) — Жаббер в своем приложении