OF 同步异步问题的改进
2012-01-05 17:18
141 查看
之前的一篇文章中提到过OF中的同步异步问题,这里针对文章最后描述的两个缺点做些改进。
这里提供一个公共的专门用于处理S2S通信问题的IQ类S2SDataManager。
可以提供多种接口:1.阻塞等待固定时长;2.阻塞等待,并在接收到结果或超时后继续;3.发送后直接返回;4.发送后直接返回,提供回调接口。
这里提供一个公共的专门用于处理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(); } } } }
相关文章推荐
- OF 同步异步问题的改进
- Android中同步与异步的问题
- 文件系统不同步问题resource is out of sync with the file sys
- 关于JQUERY里的AJAX缓存和同步异步问题
- 同步异步-线程并发安全问题
- Android 中aidl调用执行线程和同步异步问题
- QT 异步函数和同步函数交换问题
- JQuery async同步异步问题
- 利用async和await异步操作解决node.js里面fs模块异步读写,同步结果的问题
- JS —— 笔记,$("document").ready() 中ajax 与 $.ajax() 及同步异步优先级问题
- dispatch_get_main_queue的异步同步问题
- vue同步父子组件和异步父子组件的生命周期顺序问题
- nodejs(五)同步异步--USING SETTIMEOUT INSTEAD OF SETINTERVAL TO FORCE SERIALIZATION
- Android完美解决GridView异步加载图片和加载大量图片时出现Out Of Memory问题
- ajax异步模式下实现等待loading(jQuery同步Ajax带来的UI线程阻塞问题及解决办法)
- 同步异步调用的一些小问题
- JS单线程,同步异步问题
- FPGA之异步时钟、同步时钟并存同步问题
- Ext treeLoader 同步、异步加载树 问题
- 文件系统不同步问题-resource is out of sync with the file system