📄 cmpp_shell.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 + -