本帖最后由 郝永亮 于 2019-1-10 20:06 编辑
Pushlet之消息推送(一)
Pushlet(一种comet 架构的实现)是基于Servlet 机制,数据从server端的Java 对象直接推送(push)到客户端浏览器的(动态)HTML 页面,而无需任何Java applet 或者插件的帮助。是使用比较多的后台向前台推送消息的工具。前台订阅某个感兴趣的事件joinListen,触发后台的Pushlet的servlet,为该请求会话建立session,默认这个sessionID是随机的java.rmi.server.UID。
资源下载
下载push-2.0.4,找到如下的资源放在项目的对应位置即可。
1)、pushlet.jar
2)、ajax-pushlet-client.js
系统配置• 1、web.xml配置servlet [XML] 纯文本查看 复制代码 <servlet>
<servlet-name>pushlet</servlet-name>
<servlet-class>nl.justobjects.pushlet.servlet.Pushlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>pushlet</servlet-name>
<url-pattern>/pushlet.srv</url-pattern>
</servlet-mapping> 当前这里也可以自定义Pushlet类,继承自nl.justobjects.pushlet.servlet.Pushlet.java,然后初始化pushlet,并注入applicationContext
• 2、创建推送消息工具类 [Java] 纯文本查看 复制代码 /**
* 消息推送工具类
* 实现点对点推送和广播推送
**/
public class PushletUtil {
private static String PLATFORM_MESSAGE = "UNI_CAST_MESSAGE";
/**
* 发送消息至客户端
* @param sessionId
* @param msg
*/
public static void sendMessage(String sessionId, String msg){
if(StringUtils.isNotBlank(sessionId) && SessionManager.getInstance().hasSession(sessionId)){
Event event = Event.createDataEvent("message");
event.setField(PLATFORM_MESSAGE, msg);
Dispatcher.getInstance().unicast(event, sessionId);
}
}
/**
* 广播至所有在线客户端
* @param msg
*/
public static void sendBroadcast(String msg){
Event event = Event.createDataEvent("message");
event.setField(PLATFORM_MESSAGE, msg);
Dispatcher.getInstance().broadcast(event);
}
}
使用示例
实现一个账号同时只能一个人登录。
•1、实现登录是用户的校验 [Java] 纯文本查看 复制代码 synchronized public String validateUserLoginDate() throws Exception{
Map session = ActionContext.getContext().getSession();
Map<String,Object> userMap =(Map)session.get(ConstSystem.UINFO);
String userId = ((User)userMap.get("user")).getId();
String myselfUserIdDate = (String) userMap.get("currentUserId");
List<String> userAll = new ArrayList<String> (ConstData.loginUserMap.values());
for(String userIdDate : userAll){
if(userIdDate.indexOf(userId)>=0){//表示当前用户的
if(!myselfUserIdDate.equals(userIdDate)){
System.out.println("开始执行推送并删除session方法-------------");
PushletUtil.sendMessage(userIdDate,new String("当前用户已从其他地方登录".getBytes("UTF-8"),"ISO-8859-1"));
}
}
}
return null;
}
•2、jsp设置pushlet接受推送消息 [JavaScript] 纯文本查看 复制代码 PL.userId='${session.uinfo.currentUserId}'; //当前登录用户的userId
p_join_listen("message");
function onData(event) {
if(event.get('UNI_CAST_MESSAGE') != undefined ) {
alert(event.get('UNI_CAST_MESSAGE'));
//执行退出操作
window.location = '${appPath}/login/login_quit.st';
}
}
•3、登录时剔除另一个登录用户 [Java] 纯文本查看 复制代码 //以下方法为剔除另一个登录账户[/align]setTimeout('myfun()',3000);
function myfun(){
alert("剔除另一个登录用户")
$.ajax({
url:"${appPath}/login/login_validateUserLoginDate.st",
dataType:"json",
async:true,
success:function(data){
}
});
}
|