?? cmppmosendthread.java
字號:
package com.zhanghao.cmpp;
/**
* <p>Title: CMPP Interface</p>
* <p>Description: 湖南移動短信網關通訊程序</p>
* <p>Copyright: Copyright (c) 2004</p>
* <p>Company: sunun tech ltd.</p>
* @author zhanghao
* @version 1.0
*/
import java.io.*;
import java.net.*;
import com.zhanghao.common.util.*;
public class CMPPMOSendThread extends Thread{
/** 該線程運行標志 true 在運行,false停止 **/
public static boolean isAvail = false;
private static DataInputStream inputStream;
private static DataOutputStream outputStream;
/** 初始化構造器
* 使用CMPPMOSocketProcess唯一的實例的輸入流和輸出流**/
public CMPPMOSendThread() {
inputStream = CMPPMOSocketProcess.getInstance().inputStream;
outputStream = CMPPMOSocketProcess.getInstance().outputStream;
isAvail = true;
}
public void run(){
Debug.outInfo("[CMPPMaster]"+PublicFunction.getFormatTime()+" MO連接("+CMPParameter.MOServerPort+")->發送線程啟動 ...");
/** 最后一次鏈路測試時間 **/
long LastActiveTime = System.currentTimeMillis();
try{
while (isAvail && CMPPMOSocketProcess.getInstance().isAvail) {
int sendFlag = 1;
//當網關類型為單連接時
if (CMPParameter.ISMGType == 2) {
CMPPDBAccess.getInstance().fectchMTDataToBuffer();
sendFlag = sendDataFromBuffer();
}
//System.out.println("sendDataFromBuffer sendFlag = "+sendFlag);
if (sendFlag == 1) { //如果緩沖中無發送數據
//System.out.println("System.currentTimeMillis() = "+System.currentTimeMillis());
//如果在10秒內無數據交換,則發送鏈路測試包
if((System.currentTimeMillis() - LastActiveTime) > (CMPParameter.ActiveTestTime - 3000)) //毫秒發一次測試包
{
PublicFunction.send(outputStream,new CMPP(CMPP.CMPP_ACTIVE_TEST).pack());
LastActiveTime = System.currentTimeMillis();
}
PublicFunction.sleep(500); //適當延時。以減輕CMPP通訊服務器端的壓力,可以去掉
}
else {
//當成功發送數據成功后,更新上次鏈路測試時間
LastActiveTime = System.currentTimeMillis();
}
} //end while
}
catch(Exception ex){
this.destory(ex);
}
}
/**
* 從發送緩沖隊列中取數據發送
* @return
* 0 成功發送
* 1無數據,
* 2有數據,但發送過程中出現異常
*/
private int sendDataFromBuffer() throws Exception{
boolean haveData = false; //是否有數據
long start = 0;
try {
CMPP submitMsg ; //要發送給SP的submit message
if (CMPPDBAccess.getInstance().vctMTData.size() > 0) {
start = System.currentTimeMillis();
haveData = true;
}
else {
return 1;
}
//當發送緩沖隊列中有數據時,發送MT信息
while (CMPPDBAccess.getInstance().vctMTData.size() > 0) {
//取緩沖中的第一條信息
synchronized (CMPPDBAccess.getInstance().vctMTData) {
submitMsg = (CMPP) CMPPDBAccess.getInstance().vctMTData.elementAt(0);
}
//判斷是否發送成功,成功返回0,失敗返回2
PublicFunction.send(outputStream,submitMsg.pack());
synchronized (CMPPDBAccess.getInstance().vctMTData) {
CMPPDBAccess.getInstance().vctMTData.removeElementAt(0);
}
int iSleep = (1000 / CMPParameter.MTSpeed);
PublicFunction.sleep(iSleep);
} // end-while
}
catch (Exception ex) {
throw ex;
}
return 0;
}
/** 銷毀線程 **/
public void destory(Exception ex){
if(ex !=null){
ex.printStackTrace();
Debug.outInfo("[CMPP]MO連接(發)線程異常停止,異常原因:" + ex.getMessage());
}
else{
Debug.outInfo("[CMPP]MO連接(發)線程異常停止");
}
CMPPMTSocketProcess.getInstance().disclose();
this.isAvail = false;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -