使用Google App Engine的XMPP服务

XMPP作为IM通讯标准协议已经得到了广泛的应用。Sametime, Gtalk 以及Cisco Webex Connect都是基于XMPP协议的IM产品。GAE前一段时间推出了XMPP服务.也许是希望能有更多支持gtalk的服务出现,从而推进gtalk的发展吧.
最近终于有空试用了一下,感觉还不错.想想普通的Web hosting由于缺少独立IP,没有办法实现端口映射,所以基本没有办法用来部署IM机器人。如今有了GAE的XMPP服务,做一个相关的机器人就不只是梦了。如果有同学想在Gtalk,Webex Connect以及其他基于XMPP的IM平台上开发机器人的话,GAE绝对是一个不错的选择.

XMPP消息发送
GAE提供了完整的XMPP类库。你可以在你的web应用中对用户发送XMPP应用或者邀请.示例代码如下.

import com.google.appengine.api.xmpp.JID;
import com.google.appengine.api.xmpp.Message;
import com.google.appengine.api.xmpp.MessageBuilder;
import com.google.appengine.api.xmpp.SendResponse;
import com.google.appengine.api.xmpp.XMPPService;
import com.google.appengine.api.xmpp.XMPPServiceFactory;
...
String Content = "Hello World";
JID jid = new JID("abc@gmail.com");
Message msg = new MessageBuilder()
.withRecipientJids(jid).withBody(content).build();
XMPPService xmpp = XMPPServiceFactory.getXMPPService();
String result = null;
if (xmpp.getPresence(jid).isAvailable()) {
SendResponse status = xmpp.sendMessage(msg);
if ( status.getStatusMap().get(jid) == SendResponse.Status.SUCCESS){
result = "Success";
}
else{
result = "Failed";
log.info(status.getStatusMap().get(jid).toString());
}
}
else{
xmpp.sendInvitation(jid);
}

XMPP消息接收
XMPP服务支持app-id@appspot.com,anything@app-id.appspotchat.com以及anything@version.latest.app-id.appspotchat.com三种ID,发送到这三种ID的XMPP消息都会自动mapping到下面的URL.该URL默认只能admin才能访问,无须再在web.xml中进行安全配置.

/_ah/xmpp/message/chat/

在web.xml中将此URL映射到你的servlet之后,就可以对发送的XMPP消息进行处理了.

@SuppressWarnings("serial")
public class XMPPReceiverServlet extends HttpServlet {
private static final Logger log = Logger
.getLogger(XMPPReceiverServlet.class.getName());
public void doPost(HttpServletRequest req, HttpServletResponse res)
throws IOException {
XMPPService xmpp = XMPPServiceFactory.getXMPPService();
Message message = xmpp.parseMessage(req);
JID fromJid = message.getFromJid();
String body = message.getBody();
log.info("Receive Message: " + body + " from " + fromJid);
String response = "Echo:"+fromJid.getId();
message = new MessageBuilder().withRecipientJids(fromJid).withBody(
response).build();
xmpp.sendMessage(message);
}
}
}

如上所示,GAE的XMPP提供方便的辅助工具帮你从HTTP参数中获得Message信息.

Message message = xmpp.parseMessage(req);

注意:对GAE XMPP服务ID的添加邀请都会被自动接收,但是邀请无法通知到应用中.

目前XMPP的不足
目前GAE XMPP服务的不足主要包括下面四个方面.

  • 开发与调试不便
  • 无法使用自定义域名
  • 无法判断用户状态
  • 性能限制

开发与调试不便
目前Google App Engine SDK不支持XMPP 服务.只能提供最基本的编译功能.所以如果你想要开发发送或者接收XMPP消息的功能.唯一的办法只有实现编译无误以后上传到Google App Engine上进行测试调试.麻烦可见一斑.

无法使用自定义域名
目前Google App Engine支持的XMPP地址只有@appspot.com和@app-id.appspotchat.com两种.不过考虑到App Engine的Web 服务已经支持了自定义域名.XMPP服务对自定义域名帐号的支持,也是可以期待的一件事情.

无法判断用户状态
目前GAE XMPP服务只能识别对方用户”在线”和”离线”两种状态.作为XMPP特色之一,自定义状态已经被各大IM工具广泛的推广了.尤其是Cisco Webex Connect集成了UC之后添加的”In a Meeting”,”In a Webex Meeting”,”On phone”等状态,让人用的非常舒服.希望GAE XMPP服务的未来版本能对它有所支持,阿门.

性能限制
和普通Web服务一样,GAE的XMPP服务也要受到网络带宽,CPU,内存等各方面的限制.除此之外,对发送的XMPP消息长度也有一定的限制.具体的数据可以参考资料来源中的介绍.皑皑,免费的,还能说啥呢.

OK了,还等什么,做一个属于你自己的XMPP bot吧.
资料来源
Google App Engine, The XMPP Java API



Tags: App Engine, GAE, Google App Engine, gtalk, xmpp
  • http://icyomik.tk/ iCyOMiK

    无法使用自定义域名
    这点真让人无法接受。。。

    [Reply]

无觅相关文章插件,快速提升流量