XMPP离线管理

转载 2013年12月02日 10:26:41

转载http://blog.sina.com.cn/s/blog_8cb05a6b0101a904.html

一、前提:

在Openfire 中,客户端登出的状态分为正常离线和断线,正常离线会发送presence消息通知。非正常离线的时候,openfire自带的心跳包会检测客户端的响 应,如果客户端长时间无响应,Openfire无法接收到客户端的presence消息的时候,mina框架会在OF的 ConnectionHandler的sessionClosed()方法中进行后续的处理。
二、离线检测:
MINA框架本身提供了idle检测功能,这项功能可检测客户端建立的TCP/IP连接,却不发送任何消息的状况。
在 ClientConnectionHandler的sessionidle方法中判断当前的idle次数大于1时将关闭客户端的连接。如果设置了idle time之后在这个idle的检测发生在达到一半时间和达到指定的时间,每次检测都会将idle的次数加1,也就是我们一旦设定了这个时间长,mina框 架就会在这个时长的一半时间内,客户端仍未发送消息时触发一次sessionidle事件,然后在到达指定的时长,客户端仍未发送消息时再触发一次。
触发做法:第一次触发sessionidle时发送一次ping,强迫客户端进行响应。
三、业务需求:
既然明白了OF的离线做法,我们何不使用包的过滤机制,来过滤presnece的消息通知包。那么就让我们来实践下这种机制:
1、创建包过滤器,使用包过滤器。可以将presence的状态拦下,之后对其做处理,代码如下:
public class PresenceInterceptorimplements PacketInterceptor  {
    @Override
    publicvoid interceptPacket(Packet packet, Session session, boolean incoming,
            booleanprocessed) throws PacketRejectedException {
        
        if(!processed && packet instanceofPresence && incoming){
            PresencemyPresence =(Presence)packet;
            System.out.println("presenceunavlilate"+packet.toXML());
        }
    }
}
我们使用了Spark测试,当用户下线的时候,发送了一次presence,当用户上线的时候,发送一次presence,结果呈现如图1-1所示:
图1-1 所示 Presence状态处理
按照以上方式,我们可以为其匹配些业务触发器。现在让我来介绍下各个触发器的实现:
1、创建触发器:
package org.jivesoftware.openfire.tigger;
import java.util.ArrayList;
import java.util.List;
public abstract class Tigger{
    private static ClassLoader loader=null;
    public static TiggerManager tiggerMangerGlobal=null;
    //创建触发器
    List<TiggerManager> tiggerList = newArrayList<TiggerManager>();
    boolean changed = false;
    public Tigger(){
        super();
    }
   
    public void addTigger(String tiggerManagerModule){
        Class<?> isTiggerManageClass=null;;
        ObjecttiggerManager=null;
        loader =Thread.currentThread().getContextClassLoader();
        try {
            isTiggerManageClass = loader.loadClass(tiggerManagerModule);
            tiggerManager=(TiggerManager)isTiggerManageClass.newInstance();         
            System.out.println("实例化对象="+tiggerManager);
            tiggerMangerGlobal=(TiggerManager) tiggerManager;
            if(tiggerManager == null){
                System.out.println("触发器为空");
            }synchronized(this){
                //如果触发器和容器中的触发器不相等,则
                if(!tiggerList.contains(tiggerManager)){
                    tiggerList.add((TiggerManager) tiggerManager);
                }
            }
        } catch(ClassNotFoundException e) {
            e.printStackTrace();
        } catch(InstantiationException e) {
            e.printStackTrace();
        } catch(IllegalAccessException e) {
            e.printStackTrace();
        }
    }
   
    protected void clearChanged(){
        changed=false;
    }
   
    protected int countTigger(){
        returntiggerList.size();
    }
   
    protected synchronized void deleteTigger(){
        tiggerList.clear();
    }
   
    protected boolean hasChanged(){
        return changed;
    }
   
    protected void setChanged(){
        changed=true;
    }
   
    public void notifyTigger(Object data) {
        int size = 0;
        TiggerManager[] arrays =null;
        synchronized (this) {
            if (hasChanged()) {
                clearChanged();
                size =tiggerList.size();
                arrays = newTiggerManager[size];
                tiggerList.toArray(arrays);
            }
        }
        if (arrays != null) {
            for (TiggerManager tigger : arrays) {
                tigger.update(this,data);
            }
        }
    }
   
    public void notifyTiggerKey(String key,String value) {
        for(int i=0;i<tiggerList.size(); i++){
            TiggerManager tigger = tiggerList.get(i);
            tigger.update(key,value);
        }
    }
   
    public void notifyTigger() {
        for(int i=0;i<tiggerList.size(); i++){
            TiggerManager tigger = tiggerList.get(i);
            tigger.update();
        }
    }
   
    public void notifyTiggerKey(Object obj) {
        for(int i=0;i<tiggerList.size(); i++){
            TiggerManager tigger = tiggerList.get(i);
            tigger.update(obj);
        }
    }
}
2、


2、触发器管理类:
package org.jivesoftware.openfire.tigger;
public interface TiggerManager {
   
     boolean update(Tigger tigger, Object data);
     
     boolean update(String key,String value);
     
     boolean update();
     
     boolean update(Object obj);
}
3、基础触发器:
package org.jivesoftware.openfire.tigger;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public abstract class TiggerSolutionManager implementsTiggerManager {
    private staticClassLoader loader=null;
   
    private staticTiggerManager initlize(String classResouceTigger,String tiggerMethodModule){
        TiggerManager isTiggerManage=null;
        loader = Thread.currentThread().getContextClassLoader();
        Object tigger = null;
        try {                                   
            Class<?> tiggerCls= loader.loadClass(classResouceTigger);
            tigger=(Tigger)tiggerCls.newInstance();
            Method method =tiggerCls.getDeclaredMethod("addTigger",new Class[]{String.class});
            method.setAccessible(true);
            String[] argments = newString[1];
            argments[0]=tiggerMethodModule ;
            method.invoke(tigger,argments);
            isTiggerManage=Tigger.tiggerMangerGlobal;
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {  
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        return isTiggerManage;
    }
   
    public static voidcreateTiggerMethodKey(String classResouceTigger,StringtiggerMethodModule,String key,String value){
        TiggerManager isTiggerSolution=null;
        try{
            if(isTiggerSolution ==null){
                isTiggerSolution= initlize(classResouceTigger,tiggerMethodModule);
                //即时响应
                isTiggerSolution.update(key,value);
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
   
    public static voidcreateTiggerMethod(String classResouceTigger,String tiggerMethodModule){
        TiggerManager isTiggerSolution=null;
        try{
            if(isTiggerSolution ==null){
                isTiggerSolution=initlize(classResouceTigger,tiggerMethodModule);
                //即时响应
                isTiggerSolution.update();
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
   
    public static voidcreateTiggerMethod(String classResouceTigger,String tiggerMethodModule,Stringvalue){
        TiggerManager isTiggerSolution=null;
        try{
            if(isTiggerSolution ==null){
                isTiggerSolution=initlize(classResouceTigger,tiggerMethodModule);
                //即时响应
                isTiggerSolution.update(value);
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    public abstract booleanupdate(Tigger tigger, Object data);
    public abstract booleanupdate(String key, String value);
    public abstract booleanupdate();
}
4、触发器响应:
package org.jivesoftware.openfire.tigger;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public abstract class TiggerSolutionManager implementsTiggerManager {
    private staticClassLoader loader=null;
   
    private staticTiggerManager initlize(String classResouceTigger,String tiggerMethodModule){
        TiggerManager isTiggerManage=null;
        loader = Thread.currentThread().getContextClassLoader();
        Object tigger = null;
        try {                                   
            Class<?> tiggerCls= loader.loadClass(classResouceTigger);
            tigger=(Tigger)tiggerCls.newInstance();
            Method method =tiggerCls.getDeclaredMethod("addTigger",new Class[]{String.class});
            method.setAccessible(true);
            String[] argments = newString[1];
            argments[0]=tiggerMethodModule ;
            method.invoke(tigger,argments);
            isTiggerManage=Tigger.tiggerMangerGlobal;
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {  
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        return isTiggerManage;
    }
   
    public static voidcreateTiggerMethodKey(String classResouceTigger,StringtiggerMethodModule,String key,String value){
        TiggerManager isTiggerSolution=null;
        try{
            if(isTiggerSolution ==null){
                isTiggerSolution=initlize(classResouceTigger,tiggerMethodModule);
                //即时响应
                isTiggerSolution.update(key,value);
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
   
    public static voidcreateTiggerMethod(String classResouceTigger,String tiggerMethodModule){
        TiggerManager isTiggerSolution=null;
        try{
            if(isTiggerSolution ==null){
                isTiggerSolution=initlize(classResouceTigger,tiggerMethodModule);
                //即时响应
                isTiggerSolution.update();
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
   
    public static voidcreateTiggerMethod(String classResouceTigger,String tiggerMethodModule,Stringvalue){
        TiggerManager isTiggerSolution=null;
        try{
            if(isTiggerSolution ==null){
                isTiggerSolution= initlize(classResouceTigger,tiggerMethodModule);
                //即时响应
                isTiggerSolution.update(value);
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    public abstract booleanupdate(Tigger tigger, Object data);
    public abstract booleanupdate(String key, String value);
    public abstract booleanupdate();
}
好了,以上是触发器的功能,现在我们可以将这些触发器匹配各自的业务:
1、RosterTigger:用于匹配当好友下线或在线时的触发事件
2、TranslateTigger:用于匹配发送文件时,对方下线时的触发事件
注意:
Openfire中判断当前用户是否在线,则使用以下方式:
User user =     XMPPServer.getInstance().getUserManager().getUser(route.bar seID());
XMPPServer.getInstance().getPresenceManager().isAvailable(user)

相关文章推荐

Android xmpp开发 asmack获取离线在线添加好友讯息 及 好友上线下线通知

Android xmpp开发 asmack获取离线在线添加好友消息 及 好友上线下线通知 直接上代码,看注释应该很好理解,只是提供一种思路,不对的请大神指正: public class P...

android xmpp好友相关功能 添加好友 删除 移动 在线 离线 隐身 忙碌

最近在写一个即时通信的项目,这个

xmpp协议如何支持发送/接受离线文件思路之一

最近项目中需要使用openfire来做即时消息的传输,但是工程要求用户传递的各种数据都要在服务器备份,且需要支持离线文件的发送和接受。翻阅网上一些资料得知openfire是不支持离线文件的传递,它是s...

XMPP离线处理

XMPP离线管理 发布者:JECON 一、前提: 在Openfire 中,客户端登出的状态分为正常离线和断线,正常离线会发送presence消息通知。非正常离线的时候,openfire自带的...
  • jecons
  • jecons
  • 2013-04-17 11:14
  • 1159

XMPP 实现推送,完善用户离线发送消息

关于服务器端向Android客户端的推送,主要有三种方式: 1.客户端定时去服务端取或者保持一个长Socket,从本质讲这个不叫推送,这是去服务端拽数据。但是实现简单,主要缺点:耗电等 2.Googl...

XMPP——Smack[6]离线消息和离线文件的实现

终篇,三天所学所用,也就这些,如果需要大家要自己去查资料研究研究,功能其实可以很强大的 可惜界面做得不好,一大短处,从大一迄今没整好,主要是个人审美不行,哎 毕业季呀毕业季,明天摆摊卖书,再半...

XMPP——Smack[6]离线消息和离线文件的实现

1.离线消息  openfire本身是支持离线消息的,不需要进行额外处理,可以用spark测试下  使用smack,其实他提供了相应的方法  Class OfflineMessageManager  ...

XMPP——Smack[6]离线消息和离线文件的实现

终篇,三天所学所用,也就这些,如果需要大家要自己去查资料研究研究,功能其实可以很强大的 可惜界面做得不好,一大短处,从大一迄今没整好,主要是个人审美不行,哎 毕业季呀毕业季,明天摆...
  • wklken
  • wklken
  • 2011-06-01 21:37
  • 25084

Android xmpp开发 asmack获取离线在线添加好友消息 及 好友上线下线通知

直接上代码,看注释应该很好理解,只是提供一种思路,不对的请大神指正: public class PresenceService extends Service { private _Conn...

XMPP——Smack[6]离线消息和离线文件的实现

1.离线消息 openfire本身是支持离线消息的,不需要进行额外处理,可以用spark测试下 使用smack,其实他提供了相应的方法 Class OfflineMessageManager ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)