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