服务端口监听--报文接收--报文解码--业务处理--报文编码--写回客户端
从服务端与客户端成功握手并产生一个socket后,为了提高吞吐能力,接下来的事情就可以交给多线程去处理。
为了对接入的请求做合理的限制、控制,引入消息队列缓冲技术。
队列,主动推送消息和被动拉取消息两种方式实现,并且可以在两种实现上增加自定义的策略,例如:流量控制等。
接下来将使用Java语言实现队列与多线程整合技术的实现。
这里直接使用LinkedBlockingQueue队列,自带队列阻塞功能,免去线程安全控制。
packagehope.queue.blockdemo;importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;importjava.util.concurrent.LinkedBlockingQueue;/*** 消息队列缓冲定义
*@authorhp
**/
public class PushBlockQueue extends LinkedBlockingQueue{private static final long serialVersionUID = -8224792866430647454L;private static ExecutorService es = Executors.newFixedThreadPool(10);//线程池
private static PushBlockQueue pbq = new PushBlockQueue();//单例
private boolean flag = false;privatePushBlockQueue(){}public staticPushBlockQueue getInstance(){returnpbq;
}/*** 队列监听启动*/
public voidstart(){if(!this.flag){this.flag = true;
}else{throw new IllegalArgumentException("队列已处于启动状态,不允许重复启动.");
}new Thread(newRunnable(){
@Overridepublic voidrun() {while(flag){try{
Object obj= take();//使用阻塞模式获取队列消息//将获取消息交由线程池处理
es.execute(newPushBlockQueueHandler(obj));
}catch(InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}/*** 停止队列监听*/
public voidstop(){this.flag = false;
}
}
定义队列处理器,这个处理器实现Runnable接口,是为了与线程池做衔接。
packagehope.queue.blockdemo;/*** 队列消息处理实现
*@authorhp
**/
public class PushBlockQueueHandler implementsRunnable {privateObject obj;publicPushBlockQueueHandler(Object obj){this.obj =obj;
}
@Overridepublic voidrun() {
doBusiness();
}/*** 业务处理时限*/
public voiddoBusiness(){
System.out.println(" 处理请求 "+obj );
}
}
测试实例
packagehope.queue.blockdemo;public classAppTest {/***@paramargs
*@throwsException*/
public static void main(String[] args) throwsException {
PushBlockQueue.getInstance().start();for(;;){
Thread.sleep(1000);
PushBlockQueue.getInstance().put("0123456");
}
}
}
输出结果
处理请求 0123456处理请求0123456处理请求0123456处理请求0123456处理请求0123456处理请求0123456处理请求0123456处理请求0123456处理请求0123456处理请求0123456处理请求0123456处理请求0123456处理请求0123456处理请求0123456处理请求0123456处理请求0123456处理请求0123456处理请求0123456处理请求0123456处理请求0123456处理请求0123456处理请求0123456处理请求0123456处理请求0123456处理请求0123456处理请求0123456处理请求0123456处理请求0123456
这种模式可以应用到很多场景,希望对大家工作上有所帮助。
原文:http://www.cnblogs.com/orionhp/p/6364149.html