解決并發大數據量阻塞之道的重要思想是:
利用多線程將數據接收和數據處理兩塊業務分開。1、數據接收
public class MessageReceiver{
//建立數據緩存區
private List messageList = new ArrayList();
//添加消息至數據緩沖區
public? void addMessage(ESBInput inputMessage) {
??synchronized(messageList) {
??? messageList.add(inputMessage);
??? messageList.notifyAll();
??}
?}
//并發數據接收入口,調用添加數據方法,而不是直接操作inputMessage,對其解析或者別的操作,不然極可能造成阻塞
public void handleMessage(Input inputMessage) {
?????addMessage(inputMessage);
?}
//從數據緩沖區取數據,它應該被另外一個線程調用
public List getMessageList() {
??List _processList = new ArrayList();
??try {
??? synchronized (messageList) {
????? while (messageList.size() == 0) {
???? messageList.wait();
????? }
????? _processList.addAll(messageList);
//清空緩存區
????? messageList.clear();
??? }
??}
??catch (Exception ex) {
???ex.printStackTrace();
??}
??return _processList;
?}
}
2、數據處理
//線程
public class MessageProcessThread extends Thread {
MessageReceiver receiver;
public MessageProcessThread (MessageReceiver receiver){
this.receiver=receiver;
}
public void run() {
?? while (true) {
?? List list = receiver.getMessageList();
?? while (iter.hasNext()) {
??? //do what you want....
? handleMessage((Input)list .next());
????? try {
???sleep (100);
?? }
?? catch (Exception ex) {
??? ?}
?? }
?}
}
public handleMessage(Input messsage){
?? //處理消息
}
posted on 2009-01-06 10:28
蔣家狂潮 閱讀(963)
評論(0) 編輯 收藏 所屬分類:
Basic