`
这些年
  • 浏览: 400348 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spring mvc + pushlet实现向特写用户实时推送信息

 
阅读更多

环境:pushlet-2.0.4 
所遇问题: 
1.如何向特定用户推送 
参考网上资料:http://tonl.iteye.com/blog/1398995 
首先:修改ajax-pushlet-client.js,在PL对象后加入userId: 

复制代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var PL = {
    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,
    state: 1,
    userId: '',//添加的userId变量

其次:修改pushlet源码,nl.justobjects.pushlet.core.SessionManager,将createSession方法修改如下: 

复制代码

1
2
3
4
5
6
7
8
/**
     * Create new Session (but add later).
     */
    public Session createSession(Event anEvent) throws PushletException {
        // Trivial
        //return Session.create(createSessionId()); //原写法
        return Session.create(anEvent.getField("userId""visitor"));//修改后的写法
    }

这是我们就获得的session的id就是我们传送过来的登陆用户userId,getField的第二个参数是当得不到请求参数userId的值的时候设定的默认值。 


最后:对修改过的源码进行编译打包 
编择:直接到下载的pushlet包下build 
打包:通过jar命令 
 



2.如何在配置的推送源中获取service对象 
参考:http://blog.csdn.net/zollty/article/details/8710911 
因为pushlet是在服务端做的轮询,并不经web容器,所以不能自动注入,要手动获取,方法如下: 

复制代码

1
2
3
4
5
6
applicationContext = sessions.length > 0 && applicationContext == null ?
                    ContextLoaderListener.getCurrentWebApplicationContext()
                    : applicationContext;
renwuService = sessions.length > 0 && renwuService == null ?
                    (IRenwuService) applicationContext.getBean("renwuServiceImpl")
                    : renwuService;

注:IRenwuService 为消息接口,RenwuServiceImpl为接口实现类 

3.Spring 初始化的bean名称是什么 
看到2中getBean("renwuServiceImpl"), Spring容器初始化bean时,所有bean名称都以小写字母开头(这里从控制台也可以看出所有初始化bean的名称),所以bean名为renwuServiceImpl 


4.如果推信息为中文如何处理 
如查推送的信息为中文,前端JS不会返回信息,但从控制台可以看出,推送源已执行,但会自动将sessionId移除,如下图:
 

解决方法: 
new String("中文问题".getBytes("UTF-8"),"ISO-8859-1"); 


5.用Jquery实现无刷新框架要注的JS代码位置 
这里我是用 Jquery post方法在页面初始化时进行动态加载main页面,所以 

复制代码

1
2
3
4
5
6
7
8
9
10
11
12
13
<script type="text/javascript">
<!--
  //pushlet
  if(PL.sessionId == null){
      PL.userId = '${userId}';
      PL._init();
      PL.joinListen('/pms/bxService');//事件标识 在数据源中引用
      function onData(event){
            console.log("sessionID==" + PL.sessionId + "====" + event.get('msg_' '${userId}'));
      }
  }
//-->
</script>


要放入最后回载的main页,不能放入在他之前加载的页面 


6.关于key的取值问题
复制代码

1
event.setField(key, value)


这里的key不能是数字(包括数字字符串),否则同样会出现4的问题 


=============================华丽的分隔线========================= 

完整配置代码: 


步骤一 创建一个类(事件推送源类)

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package com.tony.demo.pushlet;
       
import java.io.Serializable;
       
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Controller;
import org.springframework.web.context.ContextLoaderListener;
import com.tony.jrpms.service.IRenwuService;
import nl.justobjects.pushlet.core.Event;
import nl.justobjects.pushlet.core.EventPullSource;
import nl.justobjects.pushlet.core.Session;
import nl.justobjects.pushlet.core.SessionManager;
       
/**
 * @author Tony
 * @createDatime 2013-11-28 下午1:42:21
 */
@Controller
public class PmsEventPullSources implements Serializable {
       
    /**
     *
     */
    private static final long serialVersionUID = 8397335113632699297L;
           
    private static ApplicationContext applicationContext;
    private static IRenwuService renwuService;
       
    public static class BaoxiuEvent extends EventPullSource{
       
          @Override
          protected long getSleepTime() {
       
              return 1000//刷新时间
       
          }
       
          @Override
          protected Event pullEvent() {
       
            Event event = Event.createDataEvent("/pms/bxService");// 事件标识 // 注意:此处”/pms/bxService”将对应页面js代码中的PjoinListen中的参数
       
            // 获取当前登陆用户Id(加入事件订阅的用户)
            Session[] sessions = SessionManager.getInstance().getSessions();
                   
            applicationContext = sessions.length > 0 && applicationContext == null ?
                    ContextLoaderListener.getCurrentWebApplicationContext()
                    : applicationContext;
            renwuService = sessions.length > 0 && renwuService == null ?
                    (IRenwuService) applicationContext.getBean("renwuServiceImpl")
                    : renwuService;
                   
            //查询当前用户的任务
            for(int i=0; i<sessions.length; i++){
                       
                //查询当前登录用户的报修任务
                int bxCount = renwuService.totalRenwu(Integer.parseInt(sessions<i>.getId()));
                event.setField("msg_" + sessions<i>.getId(), bxCount);// 封装参数
                       
            }
            return event;
       
          }
       
      }
}</i></i>
步骤二 配置文件( sources.properties 

复制代码
1
source1=com.tony.demo.pushlet.PmsEventPullSources$BaoxiuEvent
将原有的source*全部注释或删除掉


步骤三 配置文件( web.xml  


复制代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!-- pushlet servlet 配置-->
    <servlet>
        <servlet-name>pushlet</servlet-name>
        <servlet-class>nl.justobjects.pushlet.servlet.Pushlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
           
    <!-- Define the Servlet Mappings. -->
       
    <!-- The pushlet -->
    <servlet-mapping>
        <servlet-name>pushlet</servlet-name>
        <url-pattern>/pushlet.srv</url-pattern>
    </servlet-mapping>


步骤四 jsp文件中js写法 

复制代码

1
2
3
4
5
6
7
8
9
10
11
12
13
<script type="text/javascript">
<!--
  //pushlet
  if(PL.sessionId == null){
      PL.userId = '${userId}';
      PL._init();
      PL.joinListen('/pms/bxService');//事件标识 在数据源中引用
      function onData(event){
            console.log("sessionID==" + PL.sessionId + "====" + event.get('msg_' '${userId}'));
      }
  }
//-->
</script>

注:${userId}为当前登录用户的ID

分享到:
评论

相关推荐

    pushlet定时向前台推送消息

    总之,“pushlet定时向前台推送消息”是一个利用Pushlet技术实现的服务器主动推送系统,它通过定时任务产生或更新数据,并通过长连接或WebSocket将这些数据实时推送到前端客户端,从而提供更高效、实时的用户体验。...

    pushlet实现服务器端向客户端推送消息总结

    Pushlet 是一种基于 Java 的实时通信框架,用于实现在服务器端向客户端主动推送消息的功能,而无需客户端不断轮询。这种技术在构建实时应用程序,如聊天室、实时股票更新或在线游戏等场景中非常有用。以下是关于 ...

    基于pushlet实现的jsp网站消息推送

    Pushlet是基于Servlet和JSP技术的,它实现了服务器端向客户端主动推送数据的功能,无需客户端不断轮询服务器来获取新信息。Pushlet的核心概念是“连接会话”,通过保持一个持久的HTTP连接,服务器可以在有新数据时...

    使用Pushlet来实现服务器端向客户端推送信息

    使用Pushlet来实现服务器端向客户端推送信息

    pushlet java 消息实时推送

    Pushlet Java 消息实时推送是一个典型的技术实现,它允许服务端主动向客户端发送数据,无需客户端持续轮询,极大地提高了效率和用户体验。在这个简单的消息推送实例中,特别强调了解决中文错误问题,这意味着它已经...

    pushlet实例(java服务端推送消息)

    实现多个客户端连接到web服务器,由服务端推送消息至客户端(或指定id的客户端),代码中没有用官网的jar文件,而是用的源码,做了一定的修改,实现了每个客户端都可以自定义id,然后服务端可以向指定id客户端推送消息...

    pushlet实现简单的用户聊天

    在IT行业中,Pushlet是一种基于Java的推送技术,主要用于实现实时的数据传输,尤其是在Web应用中创建实时聊天、通知服务等功能。Pushlet是基于HTTP连接持久化的概念,它允许服务器主动向客户端推送数据,而无需...

    服务器推送pushlet讲解

    服务器推送技术在现代Web...总之,Pushlet作为Comet的一种实现,提供了高效且灵活的服务器推送功能,尤其适合需要实时数据交互的Web应用。通过对Pushlet框架的深入理解和实践,开发者可以构建出更具互动性的Web服务。

    一个基于pushlet推送的小例子

    总结来说,"一个基于pushlet推送的小例子"是一个展示如何在Tomcat服务器上利用Pushlet框架实现Comet技术的实例。通过这个例子,开发者可以学习到如何构建和部署一个能够进行服务器端数据推送的Web应用,这对于需要...

    通过推送机制(Tomcat comet,pushlet)实现进度条

    标题中的“通过推送机制(Tomcat comet,pushlet)实现进度条”涉及到的是Web应用中的一种实时通信技术,主要用于提供动态更新和用户交互。这里主要介绍Tomcat的Comet和Pushlet技术,以及如何利用它们来创建一个...

    PushLet实例,服务器消息推送

    【描述】"PushLet实例,实现服务器消息推送,完整实例,导入myeclipse 即可"意味着这个压缩包提供了一个完整的PushLet项目实例,用户只需将其导入到MyEclipse集成开发环境中,即可进行编译、运行和学习。MyEclipse是...

    pushlet消息推送

    Pushlet是一种基于HTTP长连接的消息推送技术,最初由Jakarta项目开发,主要用于实现实时的、双向的Web通信。在传统的HTTP请求-响应模型中,客户端必须主动发起请求才能获取服务器端的数据,而Pushlet则打破了这种...

    pushlet2.0.4-demo-增加指定人推送

    总结来说,Pushlet 2.0.4 的指定用户推送功能是其在实时消息领域的一大进步,它不仅提高了消息传递的效率,还增强了系统的灵活性和可扩展性。对于开发人员来说,掌握这一特性,能够更好地满足用户对实时交互的需求,...

    Pushlet消息推送

    2. **按需广角推送**:当服务器端有新的信息需要广播给所有在线用户时,就会使用这种推送方式。例如,在社交媒体平台中,如果有一个热门话题,服务器可以立即把这个信息推送给所有关注该话题的用户。 3. **点对点推...

    Pushlet后台往jsp前台推送消息实例

    总的来说,Pushlet提供了一种简单的方式来实现在Web应用中从后台向前端推送消息,这对于实时聊天、股票更新、在线游戏等场景非常有用。通过理解Pushlet的工作原理和实践操作,开发者可以有效地提升Web应用的交互体验...

    pushlet+extjs实现聊天组

    在IT行业中,构建实时通信系统是一项常见的挑战,而"pushlet+extjs实现聊天组"这一主题正是针对这个问题提供的一种解决方案。Pushlet和ExtJS分别是两个关键的技术组件,它们共同作用于创建一个简易的聊天组应用。 ...

    pushlet+extjs实现的聊天组

    【描述】:“pushlet+extjs实现的简易聊天组”项目的核心在于结合了Pushlet的推送功能与ExtJS的UI设计能力。Pushlet通过 comet 技术实现了服务器到客户端的数据推送,即服务器在有新消息时主动推送给客户端,而不是...

    网页推送pushlet的demo

    网页推送技术在现代互联网应用中扮演着重要角色,它能够实时地将服务器端的数据更新推送到客户端,无需用户频繁刷新页面。Pushlet是基于Java的一种早期的推送技术框架,它利用了 comet 技术,实现了服务器到客户端的...

    服务器推送 pushlet

    Pushlet是一个服务器推送框架的实例,它提供了一种实现服务器到客户端数据推送的方法。 Pushlet的核心概念是基于HTTP长连接的 Comet 模式。Comet模式通过长时间保持一个HTTP连接开放,使得服务器可以在适当的时候向...

    Pushlet服务向

    Pushlet服务是一种基于JavaWeb的实时数据推送技术,它允许服务器主动地将信息推送给客户端,而不仅仅是响应客户端的请求。在Web应用中,Pushlet服务通常用于实现数据的即时更新,比如股票报价、聊天室消息、在线游戏...

Global site tag (gtag.js) - Google Analytics