A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 郝永亮 于 2019-1-15 16:58 编辑

在前面一篇文章中我们介绍了使用使用pushlet进行简单的消息推送。在实际的业务中,我们往往需要向特定的一个或者一类用户进行消息推送。关键便是修改了Pushlet创建的sessionId以便可以自由控制向某一个特点前台推送信息,下面看一下具体的实现过程。
具体实现修改源码
  • 下载源码,这里使用的是pushlet-2.0.4 ,源码下载地址
  • 找到nl.justobjects.pushlet.core包下的SessionManager类,将它的createSession方法改成:

[Java] 纯文本查看 复制代码
public Session createSession(Event anEvent) throws PushletException {  
    // Trivial  
    //return Session.create(createSessionId());  
    //当userId为空时,默认为“visitor”
    return Session.create(anEvent.getField("userId", "visitor"));  
} 
  • 重新打包,这里直接运行项目中的build文件即可中的server即可。

修改ajax-pushlet-client.js
  • 在ajax-pushlet-client.js的PL对象后面加入userId:

  • [JavaScript] 纯文本查看 复制代码
    var PL = {
        userId:'', //添加userId变量
        NV_P_FORMAT: 'p_format=xml-strict',
        NV_P_MODE: 'p_mode=pull',
        pushletURL: null,
        webRoot: null,
        sessionId: null,
        STATE_ERROR: -2,
        STATE_ABORT: -1,
        STATE_NULL: 1,
        STATE_READY: 2,
        STATE_JOINED: 3,
        STATE_LISTENING: 3,
    [align=left]state: 1,
  • 在ajax-pushlet-client.js所有的请求都是get方式。我们需要在join请求的时候增加一个userId参数。找到_doRequest(所有的请求都是通过调用它发出的),然后再var url = PL.pushletURL + '?p_event=' + anEvent;,在其后加入下面的代码:

[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();即可。






3 个回复

倒序浏览
一个人一座城0.0 来自手机 中级黑马 2019-1-16 09:15:19
沙发
看一看。
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马