Pull to refresh

Comments 35

> Разработчик получает очень высокоуровневые методы, что упрощают разработку

это круто, сервисное программирование в подобном виде радует скоростью и простотой разработки, даже при наличии некоторых ограничений в большинстве случаев базовых функций хватает с головой
Это получается что автор приложения может «по команде» заставить приложение делать что-нибудь? Или только принимать/отправлять сообщения?
Да, может. Вот этот адрес ("/_ah/xmpp/message/chat/") — это т.н. web hook, на который и придет сообщение. Т.е это просто урл, по которому запустится копия приложения, а ему передастся в req объект сообщения. А что оно там будет выполнять — проблема разработчика. По тому же принципу построены Mail, TaskQueue.
Немного дополню mrskam. Входящее сообщение не порождает обрабатываемое событие. В Java веб-приложениях нет евентов, как в обычных десктопных приложениях, основное событие — HTTP запрос. В GAE ещё есть служба cron — выполнение заданий по расписанию. И даже она работает по такому же принципу: в запланированное время просто выполняется запрос на заданный URL.
Судя по разделам в документации, Гугле стараются никого не обделять.
там же весь код- обертки вокруг rpc-вызовов, конечно он есть для обоих языков одновременно
UFO just landed and posted this here
Я тоже использую эту возможность)
Есть некая форма, после заполнения которой я отправляю инфу из нее на почту и в джаббер.

Делается в 2 строчки всего:

from google.appengine.api import xmpp

xmpp.send_message(["nick@jabber.ru"], "Текст")

Да-да ) Именно так просто )
Проверил со своим jid на google apps, отправил инвайт, добавил в ростер, и ничего…
> «Пока служба не позволяет использовать в JID свое доменное имя, используемое для приложения.»
Виноват, не приметил!
Добавлю, что благодаря XMPP-inbound сервису на платформе App Engine легко и удобно поднимать jabber-ботов.
> Нет никакой защиты от злоумышленного расхода квот.
Хоть квоты и стоять копейки, но тем не менее, злоумышленнику ничего не стоит их исчерпывать.
UFO just landed and posted this here
Спасибо, за очень полезный пост!
Я сам только начал работать с GAE (да и с явой) и сразу с задачи написать бота. Т.к., по-моему, очень удобный способ.

Но у меня задачка не только написать бота который что-то отвечает, но чтобы каждый день в определенное время он совершал некое действие (буду использовать Cron).
То-есть понадобиться два сервлета, насколько я понимаю. Один будет обрабатывать простые запросы-сообщения. Второй будет включаться Кроном.

Поэтому у меня вопрос: правильно ли я понимаю, что xmppService который нам выдает XMPPServiceFactory.getXMPPService(); — его эксземляр доступен из любого сервлета, так? В своем роде синглтон.
Потому что проблема для меня как-то связать два сервлета. Но если я могу из любого из них дергать единый экземgляр xmppService'а — это очень облегчает задачу.

Поправьте меня, пожалуйста, если я ошибаюсь.
Благодарю.
«Class XMPPServiceFactory — Constructs an instance of the XMPP service.»

XMPPServiceFactory.getXMPPService() — создает отдельный инстанс сервиса.

Думаю на деле, все равно объект XMPPService служба возвращает один и тот же.

Не вижу смысла как-то разделять сам инстанс между разными сервлётами, если у Вас их всего пара — один на «прием», другой — на «передачу». Т.к. в самом объекте XMPPService нельзя сохранять какие-либо данные.

Крон может «дергать» тот-же самый сервлёт, что обрабатывает >простые запросы-сообщения.
Спасибо!

Только у гугла как-то совсем документация рваная какая-то.
Например не смог найти каким образом «дергается» сервлет кроном. Какая функция будет им запущена? doGet?
Как раз на английском. Просто Task Queue и Cron ( code.google.com/intl/uk-UA/appengine/docs/java/config/cron.html ) вещи разные.
Про Крон написано лишь как структурировать.хмл с инструкциями, и что там же указывается /url который будет дергаться. И всё. Каким именно образом не сказано.
Я буквально пару дней работаю с GAE и очень много вопросов, на которые не ответило прохождение Getting Started и остальные доки.
Извиняюсь, хотел ввести в заблуждение :)

В кроне всё просто — как приходит время, служба выполняет обычный GET-запрос к указанному url.

По указанному урл должен быть сервлет, который реализует метод:

public void doGet(HttpServletRequest req, HttpServletResponse res){
// do cron jobs
}
О, то что нужно. Спасибо.

Хотел спросить у вас, как у человека явно в теме, не порекомендуете ли вы какого-нибудь коммьюнити по GAE более-менее живого?
Нашел русскоязычную гугл-группу, но похоже она мертва. Англоязычная, — там премодерация и, по-моему, пробиться невозможно.
Просто по ходу возникает море граблей (например, даже полностью скопированный из getting started пример по типу hello world так и не захотел заработать на локальном сервере, получаю HTTP ERROR 405), и гуглиться ответов крайне мало.
В групах по GAE не состою, поэтому тут вообще ничего не могу посоветовать.

Можно зарегаться тут: http://www.appenginepeople.net/

Там много народу в теме.
И ещё вопрос — можно ли как-то дебажить яббер-бота на локальном сервере?
Не могу найти как.
Приходится деплоить после каждого изменения и дебажить в реальных услових, а это геммор.
На локальном сервере разработки исходящие сообщения отправляются на консоль. Входящие сообщения среда разработки эмулировать не может.

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

Вот еще одна интересная штука.
Когда я вызываю при приёме сообщения:

Message message.getFromJid().getId()

то получаю вот такие айдишники условно
r***@*****.com/Talk.v105FBAF40B9

Причем вот этот вот хлам после слэша периодически меняется, даже если используешь один и тот же Гугл-Ток клиент. Это сильно мешает.

Не знаете ли вы как получить строго адрес почты? me@mydomain.com

Или только вырезать вручную?
В API нет отдельной функции получения JID без ресурса. (во всяком случае я нигде не встречал)

Так, что руками придтся
Sign up to leave a comment.

Articles