OF 同步异步问题的改进

 

之前的一篇文章中提到过OF中的同步异步问题,这里针对文章最后描述的两个缺点做些改进。

这里提供一个公共的专门用于处理S2S通信问题的IQ类S2SDataManager。

可以提供多种接口:1.阻塞等待固定时长;2.阻塞等待,并在接收到结果或超时后继续;3.发送后直接返回;4.发送后直接返回,提供回调接口。

 

public class S2SDataManager implements IQResultListener{ private XMPPServer server; private RoutingTable routing; private long timeout=3000; //3 秒超时 //用来存储接收到的S2S结果包 private Map<String,Packet> results = new ConcurrentHashMap<String,Packet>(); //用来存储同步锁 private Map<String,Notifyer> noties = new ConcurrentHashMap<String,Notifyer>(); //用来存储回调接口实现类对象 private Map<String,S2SIQResultListener> liteners = new ConcurrentHashMap<String,S2SIQResultListener>(); //用来存储超时处理对象 private Map<String,Long> gards = new ConcurrentHashMap<String,Long>(); private static class S2SDataManagerContainer{ private static S2SDataManager instance = new S2SDataManager(); } public static S2SDataManager getInstance(){ return S2SDataManagerContainer.instance; } private S2SDataManager(){ //一些初始化 } //方法1 public Packet send(Packet packet,int time){ //类似于OF中原有的方法 } //方法2 public Packet send(Packet packet){ String id = packet.getID(); Notifyer noty = new Notifyer(id); noties.put(id,noty); addIQRouterListener(id); synchronized(noty){ routing.routePacket(packet.getTo(),packet.true); try{ noty.wait(timeout); } catch(InterruptedException ex){ //log it } } Packet reply =results.remove(packet.getID()); return reply; } @override public void receivedAnswer(IQ iq){ this.results.put(iq.getID(),iq); Notifyer noty = noties.remove(iq.getID()); if(noty!=null){ synchronized(noty){ try{ noty.notify(); } catch(Exception ex){ //log it } } } } //方法3 public void send(Packet packet){ routing.routePacket(Packet.getTo(),packet,true); } //方法4 public void send(Packet packet,S2SIQResultListener listener){ String id = packet.getID(); addIQRouterListener(id); listeners.put(id,listener); gards.put(id,System.currentTimeMillis()+timeout); routing.routePacket(packet.getTo(),packet,true); } @Override public void answerTimeout(String id){ //外部超时通知处理 } private class TimeOutTask extends TimerTask{ @Override public void run(){ final Iterator<Map.Entry<String,Long> it = gards.entitySet().iterator(); while(it.hasNext){ final Map.Entry<String,Long> point= it.next(); if(System.currentTimeMillis()<point.getValue()){ continue; } listeners.remove(point.getKey()); it.remove(); } } } }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值