本帖最后由 郝永亮 于 2019-1-15 16:58 编辑
在前面一篇文章中我们介绍了使用使用pushlet进行简单的消息推送。在实际的业务中,我们往往需要向特定的一个或者一类用户进行消息推送。关键便是修改了Pushlet创建的sessionId以便可以自由控制向某一个特点前台推送信息,下面看一下具体的实现过程。 具体实现修改源码[Java] 纯文本查看 复制代码 public Session createSession(Event anEvent) throws PushletException {
// Trivial
//return Session.create(createSessionId());
//当userId为空时,默认为“visitor”
return Session.create(anEvent.getField("userId", "visitor"));
} 修改ajax-pushlet-client.js[JavaScript] 纯文本查看 复制代码 if (anEvent == 'join' || anEvent == 'join-listen') {
url = url + '&userId=' + PL.userId;
} 页面添加监听事件
[JavaScript] 纯文本查看 复制代码 var userIdDate = '${session.uinfo.currentUserId}';
PL.userId = userIdDate;
//PL._init(); // 如果不注释掉这句话有时消息无法推送成功
PL.joinListen("/msg/notify");
function onData(event) {
alert(event.get("msg"));
}
给特定用户发送推送
[AppleScript] 纯文本查看 复制代码 /**
* 推送
* @param oid
* @throws UnsupportedEncodingException
*/
private String void myMulticast() throws UnsupportedEncodingException {
//获取符合条件的userId,此处省略具体逻辑
String userId = ...;
Event event = Event.createDataEvent("/msg/notify");
event.setField("msg", new String("您收到一条代办任务".getBytes("UTF-8"),"ISO-8859-1"));
Dispatcher.getInstance().unicast(event, userId); // 向event名称匹配的事件,并且sessionid为指定的userIdDate推送
return null;
}
常见问题pushlet源码打包失败【错误】在运行build.xml -> ant build的时候,提示jre 版本在1.7一下是不支持的。
【解决】 在buid.xml 上右键,点击run as -> External Tools Configuations... ,选择JRE选项卡,更改jre版本在1.7或以上即可。 中文乱发消息推送失败【解决】 将中文字符进行编码处理即可。 new String("您收到一条代办任务".getBytes("UTF-8"),"ISO-8859-1")
处理离开状态消息推送失败【错误】 [Subscriber] not alive for at least: 45000ms, leaving... 【解决】去掉页面中PL._init();即可。
|