系统目前在做群发类的内容, 在处理群发发送和接收回执异步的时候, 遇到了点问题, 如下.
 下面的这段代码是回执接收线程的方法, 问题是, 这段程序在运行1段时间后, 会报内存溢出的问题.
麻烦各位帮忙看一下.谢谢

public void run() {
int stat = SMPP_SUCCESS, statRep = 2;
String objectId = "";
Sqlca m_Sqlca = null;
try {
m_Sqlca = new Sqlca(new ConnectionEx(SMDConstants.strDBMSType, SMDConstants.strUserId, SMDConstants.strPassWd, SMDConstants.strDBUrl, true));
long startTime = System.currentTimeMillis(), endTime = 0l;
SMPPHead back = null;
while(!isEmptyQueue()){
try {
back = Deliver();
            if(back.stat==DELIVER_MSG_TIME_OUT){
                    stat=SUBMIT_MSG_TIME_OUT;
                    break;
            }
            if(back.stat==DELIVER_MEG_ERROR){
             break;
            }
            if(back.nCommandID==COMMAND_SMPP_SUB_SM_RESP){
             stat = back.stat;
             //收到回执后处理
     objectId = getSendQueue(new Integer(back.nSequenceID));
     if(stat == SMPP_SUCCESS || objectId == null){
          //判断队列为空时退出
         if(isEmptyQueue())break;
     continue;  //发送成功或队列无对应不更新
     }
     SystemUtilService.updateMSGLog(m_Sqlca, back.nSequenceID, objectId, statRep);
     loseNum++;
            }
            else
             stat = SMPP_UNKNOWN_PACKAGE_ERROR;             }
} catch (Exception e) {
//logger.info("{"+Thread.currentThread().getName()+"}异常"+e.getMessage());
if(isEmptyQueue())break;
//e.printStackTrace();
}
}
logger.info("{"+Thread.currentThread().getName()+"}, 接收线程退出");
recTr = null; } catch (Exception e1) {
logger.info("回执接收出现异常:"+ e1.getMessage());
} finally {
if(m_Sqlca!=null)m_Sqlca.closeAll();
smpp.SmppConnectionBroker.getInstance().freeConnection(this);
}
}

解决方案 »

  1.   

    内存溢出啊  child[6]_recTr[Tue Dec 08 09:41:34 CST 2009]:[false]java.lang.OutOfMemoryError
      

  2.   

    child[6]_recTr[Tue Dec 08 09:41:34 CST 2009]:[false]java.lang.OutOfMemoryError
    异常信息只有这样. 关键是在uncaughtException里捕获的....
      

  3.   

    问题很可能出在这里:
    while里面的
    } catch (Exception e) {
    //logger.info("{"+Thread.currentThread().getName()+"}异常"+e.getMessage());
    if(isEmptyQueue())break;
    //e.printStackTrace();

    然后isEmptyQueue()返回false,就是说,你处理Queue里面的时候,出了个异常,你没抛出来,只检查了是否是空队列,结果不是空队列,然后继续while,又得到了那个出错的数据,又继续catch exception,又继续找到出错的那个数据,完了,死循环了,死循环你又不报错,那不内存溢出就有鬼了噢。你的异常处理不够精彩,谢谢。
      

  4.   

    感谢LS....
    我这里再改了试下看看..我刚刚仔细看了下其他方面的代码. 很多地方原来都只是抛出IOEXCEPTION. 对于其他类型的异常却没有处理.刚刚特地加了OUTOFMEMEORY异常的处理以及信息打印...
      

  5.   


    异常必须得处理 啊,否则你的业务层会出很多问题的。比如你上面的异常出来了,你完全可以把那个出异常的数据从你的队列里面拿出来写到日志表里面去,或者针对异常信息,对它的回执进行处理,写表也好,写日志也好,弄完后把出异常的数据从queue里面拿出来,要不然一次又一次的去弄那个出错的数据,哎,麻烦。