📄 cmccmm7senderthread.java
字号:
/*
* Created on 2005-3-17
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
package com.rainbow.mms.gateway;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import log.DailyMessageLog;
import org.apache.log4j.Logger;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.cmcc.mm7.vasp.common.MMConstants;
import com.cmcc.mm7.vasp.common.MMContent;
import com.cmcc.mm7.vasp.conf.MM7Config;
import com.cmcc.mm7.vasp.message.MM7RSErrorRes;
import com.cmcc.mm7.vasp.message.MM7RSRes;
import com.cmcc.mm7.vasp.message.MM7SubmitReq;
import com.cmcc.mm7.vasp.message.MM7SubmitRes;
import com.cmcc.mm7.vasp.service.MM7Sender;
import com.rainbow.mms.common.CMCCMM7SubmitMsg;
import com.rainbow.mms.common.MimeContent;
import com.rainbow.mms.common.MmsContent;
import com.rainbow.util.tools.HibernateUtil;
/**
* 中国移动MM7平台的发送者线程
* @author Rainbow MMS Group Leader —— TrWorks
*
*/
class CMCCMM7SenderThread extends SenderThread {
/**
* 中国移动MM7平台的发送API
*/
private MM7Sender sender = null;
/**
* 配置文件
*/
private MM7Config mm7Config = null;
/**
* 帐单,记录发送的Submit日志
*/
private DailyMessageLog bill = new DailyMessageLog();
/**
* 日志
*/
private Logger log = Logger.getLogger(CMCCMM7SenderThread.class);
/**
* 统计发送次数的信息
*/
private SenderStaticInfo staticInfo = SenderStaticInfo.getInstance();
/**
* 构造函数
*/
public CMCCMM7SenderThread(){
bill.setLogFile("bill/mmssendbill");
bill.init();
mm7Config = new MM7Config("./conf/mm7Config.xml");
mm7Config.setConnConfigName("./conf/ConnConfig.xml");
try {
sender = new MM7Sender(mm7Config);
} catch (Exception e) {
e.printStackTrace();
log.error("构造API的MM7Sener时出现错误!");
}
}
/**
* 将彩信Submit消息发送出去
*/
protected void sendSubmitMessage(Object o) {
// 参数检查
if ((o == null) || (o instanceof CMCCMM7SubmitMsg == false)) {
log.error("sendSumitMessage遇到的输入参数非法:为null或者类型不是CMCCMM7SubmitMsg");
return;
}
// 将o转换为指定平台的彩信Submit消息类型
MM7SubmitReq req = new MM7SubmitReq();
CMCCMM7SubmitMsg mmsSubmit = (CMCCMM7SubmitMsg) o;
MmsContent mmsContent = mmsSubmit.getContent();
MMContent content = new MMContent();
try {
Session sess = HibernateUtil.currentSession();
if (mmsContent != null) {
// 将内部协议的彩信内容体转换为移动API协议
for (int i = 0; i < mmsContent.getMmsContentElments().size(); i++) {
MMContent element = null;
MimeContent mimeElement = (MimeContent) mmsContent
.getMmsContentElments().get(i);
// // 解决编码问题
// if (mimeElement.getMimeType().length() >= "text/plain".length()
// && 0 == mimeElement.getMimeType().trim().compareToIgnoreCase("text/plain")){
// String textContent = mimeElement.getCharacterContent();
// textContent = new String(textContent.getBytes("UTF-8"));
// element.createFromString(textContent);
// }
// else{
// 如果多媒体元素是图片类型,那么需要针对手机进行适配
if (mimeElement.getMimeType().length() > 3
&& 0 == mimeElement.getMimeType().substring(0, 3)
.compareToIgnoreCase("ima")) {
ByteArrayInputStream in = new ByteArrayInputStream(
mimeElement.getBinaryContent());
ByteArrayOutputStream out = new ByteArrayOutputStream();
StringBuffer newPicType = new StringBuffer();
// 如果图片发生了转换,那么需要重新设定这个mime元素的内容和类型
if (true == SenderUserAgent.doUserAgent(in, mimeElement
.getMimeType(), mmsSubmit.getDstNum(),
newPicType, out)) {
mimeElement.setBinaryContent(out.toByteArray());
//System.out.println("newType:" +
// newPicType.toString());
mimeElement.setMimeType(newPicType.toString());
}
try {
in.close();
out.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
InputStream in = null;
if (mimeElement.getBinaryContent() == null
&& mimeElement.getCharacterContent() != null) {
element = MMContent.createFromString(mimeElement
.getCharacterContent());
} else if (mimeElement.getBinaryContent() != null
&& mimeElement.getCharacterContent() == null) {
element = MMContent.createFromBytes(mimeElement
.getBinaryContent());
} else {
element = MMContent.createFromBytes(mimeElement
.getBinaryContent());
}
// }
if (element != null) {
element.setContentID(mimeElement.getMimeContentName());
element.setContentLocation(mimeElement
.getMimeContentName());
element.setContentType(mimeElement.getMimeType());
// 将子元素添加到彩信内容体中
content.addSubContent(element);
content
.setContentType(MMConstants.ContentType.MULTIPART_MIXED);
// 如果设置了SMIL,那么需要做特殊的处理,设置内容为有序且设置SMIL为第一个彩信子内容
if (mimeElement.getMimeType().equalsIgnoreCase(
"application/smil")) {
//content.setPresentionContent(element);
content
.setContentType(MMConstants.ContentType.MULTIPART_RELATED);
}
}
}
}
} catch (Exception e) {
log.error(e);
} finally {
HibernateUtil.closeSession();
}
req.setTransactionID(String.valueOf(mmsSubmit.getSubmitID()));
req.setChargedParty((byte)4);
req.setChargedPartyID(mmsSubmit.getFeeNum());
req.setContent(content);
req.setDeliveryReport(mmsSubmit.getWantReport()==0 ? false : true);
req.setReadReply(mmsSubmit.getWantRead() == 0 ? false : true);
Date expectSendTime = mmsSubmit.getExpectSendTime();
if (expectSendTime != null){
req.setEarliestDeliveryTime(expectSendTime);
}
Date expectExpiryTime = mmsSubmit.getExpectExpiryTime();
if (expectExpiryTime != null){
req.setExpiryDate(expectExpiryTime);
}
req.setPriority(MMConstants.Priority.NORMAL);
/* int nMsgClass = mmsSubmit.getMsgClass();
if (nMsgClass == 0) {
req.setMessageClass(MMConstants.MessageClass.AUTO);
} else if (nMsgClass == 1) {
req.setMessageClass(MMConstants.MessageClass.PERSONAL);
} else if (nMsgClass == 2) {
req.setMessageClass(MMConstants.MessageClass.ADVERTISEMENT);
} else if (nMsgClass == 3) {
req.setMessageClass(MMConstants.MessageClass.INFORMATIONAL);
} else {
req.setMessageClass(MMConstants.MessageClass.AUTO);
}*/
req.setSenderAddress(mmsSubmit.getSrcNum());
req.setServiceCode(mmsSubmit.getMtServiceCode());
req.setSubject(mmsContent.getSubject());
List toList = new ArrayList();
toList.add(mmsSubmit.getDstNum());
req.setTo(toList);
req.setVASID(super.getServiceID());
req.setVASPID(super.getSpID());
if (mmsSubmit.getLinkID() != null &&
mmsSubmit.getLinkID().equalsIgnoreCase("") == false){
req.setLinkedID(mmsSubmit.getLinkID());
}
MM7SubmitRes submitRes = null;
MM7RSRes rsRes = null;
log.debug("调用API发送彩信");
// 如果强制要状态报告,则设置
if (wantReport == 1){
req.setDeliveryReport(true);
}
// 将Submit消息按照API的要求发送出去
try {
// 调用API将SUBMIT消息发送出去
//System.out.println(req.toString());
rsRes = (MM7RSRes)sender.send(req);
log.debug("API发送了");
if (rsRes instanceof MM7SubmitRes){
submitRes = (MM7SubmitRes)rsRes;
}
else{
if (rsRes instanceof MM7RSErrorRes){
log.error("rsRes的类型:" + rsRes.getClass().getName());
log.error("Submit发送失败!rsRes.statuscode = " + rsRes.getStatusCode() + "; rsRes.statusText = " + rsRes.getStatusText() +
"reRes.statusDetail" + rsRes.getStatusDetail());
/********************************************
* 如果错误代码是2001,说明是缓冲区溢出,需要重新启动网关
********************************************/
if (rsRes.getStatusCode() == 2001 ||
rsRes.getStatusCode() == -101 ||
rsRes.getStatusCode() == -104){
log.error("同彩信中心的TCP连接 或 移动彩信中心出现错误,错误编号是:" + rsRes.getStatusCode() + ",发送网关将通过网关的BAT批处理文件自动重新启动!");
System.exit(0);
}
}
}
} catch (Exception e) {
log.error("发送Submit消息失败:" + "\n" + req.toString());
e.printStackTrace();
}
mmsSubmit.setActualSendTime(new Date());
mmsSubmit.setSendResult(rsRes.getStatusCode());
mmsSubmit.setSendResultMemo(rsRes.getStatusText());
if (submitRes != null){
mmsSubmit.setMsgID(submitRes.getMessageID());
}
else{
mmsSubmit.setMsgID("-1");
}
if (mmsSubmit.getMsgID() == null || mmsSubmit.getMsgID().equalsIgnoreCase("")){
mmsSubmit.setMsgID("-1");
}
// 保存发送的结果
try {
Session sess = HibernateUtil.currentSession();
Transaction tx = sess.beginTransaction();
mmsSubmit.setBsending(0);
sess.update(mmsSubmit);
tx.commit();
} catch (Exception e) {
log.error(e);
} finally {
HibernateUtil.closeSession();
}
// 记录到帐单里
SimpleDateFormat logDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
StringBuffer sTmp = new StringBuffer();
sTmp.append("=================================\n");
sTmp.append(logDateFormat.format(new Date()) + "\n");
sTmp.append(mmsSubmit.toString());
bill.log(sTmp.toString());
// 如果返回的状态字不是1000,就表明发送失败
if (rsRes.getStatusCode() != 1000) {
log.error("发送Submit消息失败:" + "\n" + mmsSubmit.toString());
// 将失败的统计次数累加
staticInfo.addSendFailedNum();
}
else{
System.out.println(sTmp.toString());
// 将成功的统计次数累加
staticInfo.addSendSuccessNum();
}
}
/*
public static void main(String[] args){
CMCCMM7SenderThread t = new CMCCMM7SenderThread();
t.getName();
}*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -