?? smgpsendthread.java
字號:
package com.zhanghao.smgp;/** * <p>Title: SMGPSendThread</p> * <p>Description: 湖南電信短信網關通訊程序(實現對短信網關的連接,短信的收發)</p> * <p>Description: SMGPSendThread類用于建立與ISMG的連接</p> * <p>Copyright: Copyright (c) 2004</p> * <p>Company: sunun Ltd.</p> * @author zhanghao * @version 1.0 */import java.io.*;import java.net.*;import com.zhanghao.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+")->發送線程啟動 ..."); /** 最后一次鏈路測試時間 **/ 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) { //如果緩沖中無發送數據 //如果在10秒內無數據交換,則發送鏈路測試包 if((System.currentTimeMillis() - LastActiveTime) > (SMGParameter.ActiveTestTime - 5000)) //毫秒發一次測試包 { SMGP activeMsg = new SMGP(SMGP.SMGP_ACTIVE_TEST); PublicFunction.send(outputStream,activeMsg.pack()); LastActiveTime = System.currentTimeMillis(); } PublicFunction.sleep(500); //適當延時。以減輕SMGP通訊服務器端的壓力,可以去掉 } else { //當成功發送數據成功后,更新上次鏈路測試時間 LastActiveTime = System.currentTimeMillis(); } } //end while } catch(Exception ex){ ex.printStackTrace(); this.destory(ex); } } /** * 從發送緩沖隊列中取數據發送 * @return * 0 成功發送 * 1無數據, * 2有數據,但發送過程中出現異常 */ private int sendDataFromBuffer() throws Exception{ boolean haveData = false; //是否有數據 long start = 0; try { SMGP submitMsg ; //要發送給SP的submit message if (SMGPDBAccess.getInstance().vctMTData.size() > 0) { start = System.currentTimeMillis(); haveData = true; } else { return 1; } //當發送緩沖隊列中有數據時,發送MT信息 while (SMGPDBAccess.getInstance().vctMTData.size() > 0) { //取緩沖中的第一條信息 synchronized (SMGPDBAccess.getInstance().vctMTData) { submitMsg = (SMGP) SMGPDBAccess.getInstance().vctMTData.elementAt(0); } //判斷是否發送成功,成功返回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連接(發)線程異常停止,異常原因:" + ex.getMessage()); } else{ Debug.outInfo("[SMGP]MO連接(發)線程異常停止"); } SMGPSocketProcess.getInstance().disclose(); this.isAvail = false; }}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -