⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmppmtsendthread.java

📁 中国移动CMPP3.0短消息通信程序
💻 JAVA
字号:
package com.pansonlu.cmpp;
/**
 * <p>Title: CMPPMTReceiveThread 双端口连接方式-MT的发送线程</p>
 * <p>Description: 湖南移动短信网关通讯程序</p>
 * <p>发送CMPP_SUBMIT, CMPP_ACTIVE_TEST,CMPP_QUERY等包</p>
 * <p>Copyright: Copyright (c) 2008</p>
 * <p>Company: Sunrise tech ltd.</p>
 * @author pansonlu
 * @version 1.0
 */

import java.io.*;
import java.net.*;
import com.pansonlu.common.util.*;

public class CMPPMTSendThread extends Thread{

  /** 该线程运行标志 true 在运行,false停止 **/
  public static boolean isAvail = false;

  private static DataInputStream  inputStream;

  private static DataOutputStream outputStream;


  /**  初始化构造器
   *   使用CMPPMTSocketProcess唯一的实例的输入流和输出流**/
  public CMPPMTSendThread() {
    inputStream  = CMPPMTSocketProcess.getInstance().inputStream;
    outputStream = CMPPMTSocketProcess.getInstance().outputStream;
    isAvail = true;

  }


  public void run(){

    Debug.outInfo("[CMPPMaster]"+PublicFunction.getFormatTime()+" MT连接("+CMPParameter.MTServerPort+")->发送线程启动 ...");
    /** 最后一次链路测试时间 **/
    long LastActiveTime = System.currentTimeMillis();

    try{
      while (isAvail && CMPPMTSocketProcess.getInstance().isAvail) {

        CMPPDBAccess.getInstance().fectchMTDataToBuffer();

        int sendFlag = sendDataFromBuffer();

        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){
    Debug.outInfo("[CMPP]MT连接(发)线程异常停止,异常原因:" + ex.getMessage());
    CMPPMTSocketProcess.getInstance().disclose();
    this.isAvail = false;
  }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -