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

📄 cmpp_shell.java

📁 使用华为cmpp2.0网关
💻 JAVA
字号:
package com.hoten.cmpp;
import com.hoten.cmpp.message.*;
import java.util.*;
/**
 * <p>Title: CMPP外壳,用来调度各类(亚信,东软,华为,审讯,以及标准)CMPP</p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2002</p>
 * <p>Company: </p>
 * @author unascribed
 * @version 1.0
 */

public class CMPP_Shell {
    CMPP_Pool pool = CMPP_Pool.getInstance();//CMPP池实例
    private String name;//运营商名称
    private int timeout = 1000*60*3;//等待延迟时间
    private Vector error = null;//出错队列,由此队列来控制是否要重新生成CMPP连接

    /**
     * 构造函数
     * @param YD_Name 接入运营商名称
     */
    public CMPP_Shell(String YD_Name){
        if(YD_Name!=null)
            name=YD_Name.toUpperCase();
    }
    /**
     * 初始化cmpp
     * @param initPath 网关配置文件在config文件夹中
     * @return true-表示初始化成功;false-初始化失败
     */
    public boolean initCMPP(String initPath){
        return pool.add(name,initPath);//在此时进行CMPP实例化
    }

    /**
     * 退出CMPP,关闭Socket连接
     */

    public void quit(){
        CMPPInfo info=pool.get(name);
        info.quit();
    }

    /**
     * 用来查询接收队列中MO信息量,这主要是用于外部系统退出时使用。
     * @return 当前MO消息缓存数
     */
    public int DeliverListNum(){
        CMPPInfo info=pool.get(name);
        return info.getMsgList().size();
    }
    /**
     * 下发MT消息,如果发送失败会连续发送3次,如果连接断开能自动重连
     * @param msg 下发消息消息体已经封装在SubmitMsg中
     * @return 0表示下发成功,其他表示错误
     */
    public CMPPHead submit(SubmitMsg msg){
        CMPPHead head = new CMPPHead();
        CMPPInfo info=pool.get(name);
        if(info==null) {
              head.stat=-1; //初始化失败
              return head;
          }
        String flag = info.getFlag("SUBMIT");
        if(flag==null){
              head.stat=-1; //没有下发类型
              return head;
        }
        if(error==null)
            error = info.getErrorList();
        CMPP_Service cmpp=null;
        try {
            while(true){
                cmpp = info.getCMPP(flag,timeout);//取得一个CMPP实例
                //如果为空则检测是否存在error如果有则创建新的CMPP;
                if(cmpp==null){
                    String sError=null;
                    int i=0;
                    synchronized (error) {//由于error队列唯一对其操作需进行同步
                      if ( ( i = error.indexOf(flag)) != -1) {
                        sError=(String)error.remove(i);
                      }
                    }
                    try {
                      if (!info.CMPPInit(flag)) {//创建新的CMPP实例
                        error.addElement(sError);
                      }
                    }
                    catch (Exception ex) {
                      error.addElement(sError);
                    }
                    continue;
                }
                //下发MT消息
                try {
                    head= cmpp.submit(msg);
                }
                catch (Exception ex) {
                    head.stat=-1;
                    cmpp.quit();
                    cmpp=null;//失败cmpp置为空,重新启动CMPP;
                    error.addElement(flag);
                }
                break;
            }
        }
        catch (Exception ex) {
            head.stat=-1;
        }finally{
            info.freeCMPP(flag,cmpp);
            flag=null;
        }
        return head;
    }
    /**
     * MO消息接收,接收到的消息以 DeliverMsg进行封装后提供出来
     * @return 如果没有消息返回null,如果有返回DeliverMsg
     */
    public DeliverMsg deliver(){
        CMPPInfo info=pool.get(name);
        if(info==null) return null;
        if(info.getMsgList().size()!=0){
             return (DeliverMsg)info.getMsgList().remove(0);
        }
        String flag = info.getFlag("DELIVER");
        if(flag==null) return null;
        if(error==null)
            error = info.getErrorList();
        CMPP_Service cmpp=null;
        try {
            while(true){
                cmpp = info.getCMPP(flag,timeout);
                if(cmpp==null){
                    int i=-1;
                    String sError=null;
                    synchronized (error) {
                      if ( (i = error.indexOf(flag)) != -1) {
                        sError=(String)error.remove(i);
                      }
                    }
                    try {
                      if (!info.CMPPInit(flag)) {
                        error.addElement(sError);
                      }
                    }
                    catch (Exception ex) {
                      error.addElement(sError);
                    }
                    continue;
                }
                try {
                    cmpp.deliver();
                }
                catch (Exception ex) {
                    cmpp.quit();
                    cmpp=null;
                    error.addElement(flag);
                }
                break;
            }
        }
        catch (Exception ex) {
        }finally{
            info.freeCMPP(flag,cmpp);
            flag=null;
        }
        if(info.getMsgList().size()!=0){
          return (DeliverMsg) info.getMsgList().remove(0);
        }
        else
          return null;
      }
      /**
       * 设置重发次数(指系统下发MT失败但不是由于通讯故障引起的错误)
       * @param num 指定重发次数默认次数为3次(num=3)
       */
      public void setReSendNum(int num) {
        CMPP_InitMessage.getInstance().N = num;
      }
      /**
       * 设置接收应答(或MO接收)的延迟时间
       * @param timeout 指定延迟时间默认为60秒(timeout=60)
       */

      public void setWaitingTime(int timeout) {
        CMPP_InitMessage.getInstance().T = timeout;
      }
      /**
       * 设置重发等待时间(主要是在等待应答没有反馈是进行重发所等待的时间)
       * @param time 指定延迟等待默认为3分钟(time=3)
       */

      public void setReSendTime(int time) {
        CMPP_InitMessage.getInstance().C = time;
      }

}

⌨️ 快捷键说明

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