📄 mmstranslator.java
字号:
package com.rainbow.mas.plugin.dbplugin.translator;
import java.io.ByteArrayOutputStream;
import java.sql.Blob;
import java.util.Calendar;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import javax.mail.internet.MimeMessage;
import javax.sql.rowset.serial.SerialBlob;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.rainbow.mas.SessionFactory;
import com.rainbow.mas.plugin.dbplugin.util.MIMEUtil;
import com.rainbow.mas.plugin.dbplugin.util.SendHeadInfo;
import com.rainbow.mas.plugin.dbplugin.util.SeqNumber;
import com.rainbow.mas.plugin.dbplugin.util.Utility;
import com.rainbow.mas.web.dto.MmsContent;
import com.rainbow.mas.web.dto.MmsDeliver;
import com.rainbow.mas.web.dto.MmsIdMapping;
import com.rainbow.mas.web.dto.MmsInbox;
import com.rainbow.mas.web.dto.MmsOutbox;
import com.rainbow.mas.web.dto.MmsSent;
import com.rainbow.mas.web.dto.MmsSubmit;
import com.rainbow.mas.web.dto.MsgRoute;
import com.rainbow.mas.web.dto.SmsOutbox;
import com.rainbow.mas.web.dto.SmsSent;
public class MmsTranslator implements Translator
{
static Logger logger = LogManager.getLogger(MmsTranslator.class);
private static SeqNumber seqNumber = SeqNumber.getInstance();
/**
* 一次行从MmsOubox中取出最多max条数据,将其转译成Mm7模块可读的数据 注意:
* 1.MsgRoute为消息路由表,通过mmsoutbox中的applicationid、extcode和激活标志 可以找出唯一的发送号码。
* MsgRoute中包含了serviceCode和bizId用于分类管理,允许同一业务的新旧发送号码
* 并存,但使用中只有一个发送号码被激活。如果发现同一业务有多条激活发送号码,则此条 信息不处理。
* 2.MmsIdMapping为MmsOutbox和MmsSubmit之间的关系映射表。MmsOutbox和MmsSubmit
* 之间是1对多的关系。MmsSubmit和MmsIdMapping为主键共享,保存过程中需要先保存MmsSubmit 再保存MmsIdMapping
*/
public void inbound(int max)
{
int mx = max;
if (mx <= 0)
{
mx = 1000;
}
Session s = SessionFactory.currentSession();
Transaction tx = s.beginTransaction();
try
{
tx = s.beginTransaction();
List list = s.createQuery("from MmsOutbox").setMaxResults(mx)
.list();
for (int i = 0; i < list.size(); i++)
{
MmsOutbox out = (MmsOutbox) list.get(i);
//IN 参数
String apID = out.getApplicationid();
String extendCode = out.getExtcode();
//是否返回状态报告
Integer registeredDelivery = out.getReqdeliveryreport();
///////////////////////////////////
List l = s.createQuery(
"from MsgRoute r " + "where r.applicationId='"
+ out.getApplicationid() + "'").list();
if (l.size() > 1)
{
logger.info("Duplicate activated Message Route!"
+ "(applicationID:" + out.getApplicationid()
+ " extcode:" + out.getExtcode() + ")");
continue;
}
else if (l.size() == 0)
{
logger.info("No suited Message Route!" + "(applicationID:"
+ out.getApplicationid() + " extcode:"
+ out.getExtcode() + ")");
continue;
}
/////////////////////////////////////////
//从DB中得到BizConfig/////////////////////
//这二项是由是我自己来的 封闭成一个函数 Utility.getSendHeadInfo();
//IN:ApID,extendCode
//OUT:服务代码,业务代码 ,BizConfig
SendHeadInfo sendHeadInfo = Utility.getSendHeadInfo(apID, extendCode);
//标识 代表一组 发送请求 可以相同的
String requestIdentifier = out.getSimmsid();
//录入内容有问题的 debug
Blob b = out.getMessagecontent();
Set<MmsContent> set = null;
if (b != null)
{
MimeMessage mimeMsg = MIMEUtil.compose(b.getBinaryStream());
if (mimeMsg != null)
{
set = MIMEUtil.parse(mimeMsg);
// 保存彩信内容
if (!set.isEmpty())
{
Iterator it = set.iterator();
while (it.hasNext())
{
MmsContent c = (MmsContent) it.next();
s.save(c);
}
s.flush();
}
}
}
/*
///////////////////////////
//先写入内容 用一条 OK
// /////////设置内容/////////////////
MmsContent mmsContent = new MmsContent();
// 设置文件类型
mmsContent.setFileType("txt");
mmsContent.setReserved("");
// 设置附件名字
// 设置附件名字 一定要有 要不会出错 取不到内容
mmsContent.setAttachmentName(Utility.formatFileDate() + ".txt");
mmsContent.setContent(out.getMessagecontent());
s.save(mmsContent);
s.flush();
//////////////////////////
*/
///////////多个发送者 要分多条发送 要不然对不到回送表 MMS_SENT(要求为单个手机号,而且有唯一主键)/////////////
//设置发送者
String[] addrs = out.getDestaddr().split(";");
// 最多不超过50给接受者
for (int j = 0; j < addrs.length && j < 50; j++)
{
////////////////////分条发送吧!!!!!!!!///////////////////////////////
String mobile = addrs[j];
MmsSubmit submit = new MmsSubmit();
/////////////////////////
//唯一序号
submit.setTransactionId(String.valueOf(seqNumber.genSeqNum())); //提交的参数
submit.setFilter(0); // ?????????????????????
submit.setSender(sendHeadInfo.getServerCode()); //
submit.setChargedId(sendHeadInfo.getServerCode());
submit.setServiceCode(sendHeadInfo.getBuinessCode());
submit.setSubject(out.getSubject());
submit.setTsSchedule(out.getRequesttime());
submit.setTsCreate(Calendar.getInstance().getTime());// 当前时间
submit.setBiz(sendHeadInfo.getBizConfig());
/*
// set类型如何使用******************
Set contentSet = new HashSet();
contentSet.add(mmsContent);
submit.setContents(contentSet);
*/
//////////////
submit.setContents(set); //debug
//////////////
// 不能为空 一定要设置!!!!!!!!!
submit.setSubmitStatus(0);
submit.setProcessStatus(0);
// 添加二个参数 优先级 和状态报告要求 07.08.30
submit.setPriority(1);
submit.setDeliveryReport(out.getReqdeliveryreport());
// end/////////////////////
// 设置发送号码 可能有多个
submit.setRecipients(mobile);
//////////////////
s.save(submit);
/////////////////////////////////////////
/* 有问题的
if (b != null)
{
MimeMessage mimeMsg = MIMEUtil.compose(b.getBinaryStream());
if (mimeMsg != null)
{
Set<MmsContent> set = MIMEUtil.parse(mimeMsg);
// 保存彩信内容
if (!set.isEmpty())
{
Iterator it = set.iterator();
while (it.hasNext())
{
MmsContent c = (MmsContent) it.next();
s.save(c);
}
submit.setContents(set);
s.saveOrUpdate(submit);
}
}
}
*/
MmsIdMapping mapping = new MmsIdMapping();
mapping.setMmsSubmit(submit);
mapping.setSimmsid(requestIdentifier);
mapping.setApplicationid(out.getApplicationid());
s.save(mapping);
s.flush();
////////////////////////////////////////////////////////// //
}
s.delete(out);
}
tx.commit();
}
catch (Exception e)
{
if (tx != null)
{
logger.error("Throw Exception!", e);
tx.rollback();
}
}
finally
{
s.close();
}
}
/**
* 将Mm7的上行彩信和已发彩信转译到MmsInbox和MmsSent中 检查时间大于checkTime的数据
*/
public void outbound(Date checkTime)
{
if (checkTime == null)
return;
Session s = SessionFactory.currentSession();
Transaction tx = s.beginTransaction();
List list = null;
try
{
tx = s.beginTransaction();
// 处理上行彩信
list = s.createQuery(
"from MmsDeliver d where (processStatus = 0 or processStatus is null) and d.tsDeliver>'"
+ datefmt.format(checkTime) + "'").list();
for (int i = 0; i < list.size(); i++)
{
MmsDeliver deliver = (MmsDeliver) list.get(i);
MmsInbox in = new MmsInbox();
String destAddr = deliver.getRecipients();
String Apid = getApIdByDestAddrr(destAddr);
in.setApplicationid(Apid);
// in.setExtcode(r.getExtcode());
in.setMasmmsid(deliver.getMmId().toString());
in.setSubject(deliver.getSubject());
in.setSourceaddr(deliver.getSender());
in.setRequesttime(deliver.getTsCreate());
in.setReceivetime(deliver.getTsDeliver());
/*
// set 内容 集合
Set contents = deliver.getContents();
if (contents != null)
{
Iterator itC = contents.iterator();
if (itC.hasNext())
{
MmsContent mc = (MmsContent) itC.next();
in.setMessagecontent(mc.getContent());
}
}
*/
// 将上行短信内容转译成MimeMessage
Set<MmsContent> set = deliver.getContents();
if (!set.isEmpty())
{
// 这里报错???????????????????//
MimeMessage msg = MIMEUtil.composeDummy(set);
ByteArrayOutputStream outstream = new ByteArrayOutputStream();
msg.writeTo(outstream);
Blob b = new SerialBlob(outstream.toByteArray());
in.setMessagecontent(b);
}
s.save(in);
//修改原表处理状态 不能反复处理会出错的
deliver.setProcessStatus(1);
s.saveOrUpdate(deliver);
}
// 处理已发送彩信
list = s.createQuery(
"from MmsSubmit s where (processStatus = 0 or processStatus is null)").list();
for (int i = 0; i < list.size(); i++)
{
MmsSubmit submit = (MmsSubmit) list.get(i);
MmsIdMapping mapping = submit.getMmsIdMapping();
if (mapping == null)
{
continue;
}
//cui 如果存在则更新,没有则写入新记录
MmsSent sent = null;
sent = (MmsSent)s.get(MmsSent.class, submit.getMmId().toString());
if(sent != null)
{
if(submit.getSubmitStatus() != null && submit.getTsSubmit() != null)
{
sent.setGwmmsid(submit.getMessageId());
//发送状态及时间
sent.setSentresult(submit.getSubmitStatus());
sent.setSenttime(submit.getTsSubmit());
//报告状态及时间,如果这次没有值,则要反向轮询
sent.setMmsstatus(submit.getReportStatus().toString());
sent.setStatustime(submit.getTsReport());
s.update(sent);
//下次不再处理
if(sent.getMmsstatus() != null)
{
//修改原表处理状态 不能反复处理会出错的
submit.setProcessStatus(1);
s.update(submit);
}
}
}
else
{
sent = new MmsSent();
//主键 不能相同 要唯一
sent.setMasmmsid(submit.getMmId().toString());
//提交时代的消息标识 代表一组消息请求 可以相同
sent.setSimmsid(mapping.getSimmsid());
sent.setDestaddr(submit.getRecipients());
sent.setGwmmsid(submit.getMessageId());
////////////////////
sent.setApplicationid(mapping.getApplicationid());
//发送状态及时间
sent.setSentresult(0); //Not NULL
sent.setSenttime(submit.getTsSchedule()); //Not NULL
//报告状态及时间,如果这次没有值,则要反向轮询
sent.setMmsstatus(submit.getReportStatusText());
sent.setStatustime(submit.getTsReport());
s.save(sent);
}
}
tx.commit();
}
catch (Exception e)
{
if (tx != null)
{
e.printStackTrace();
tx.rollback();
}
}
finally
{
if(list != null)
{
list.clear();
list = null;
}
s.close();
}
}
/**
* 清理时间小于cleanTime的mms_inbox和mms_sent表数据 注意: s.createSQLQuery("delete from
* mms_inbox ").executeUpdate(); 此方法需在hibernate3.1才支持,在3.0中需要使用jdbc实现。
*/
public void clean(Date cleanTime)
{
if (cleanTime == null)
return;
Session s = SessionFactory.currentSession();
Transaction tx = s.beginTransaction();
try
{
tx = s.beginTransaction();
int ret1 = s.createSQLQuery(
"delete from mms_inbox " + "where requesttime<'"
+ datefmt.format(cleanTime) + "'").executeUpdate();
int ret2 = s.createSQLQuery(
"delete from mms_sent " + "where senttime<'"
+ datefmt.format(cleanTime) + "'").executeUpdate();
logger.info("Clean " + ret1 + "mms_inbox data item!");
logger.info("Clean " + ret2 + "mms_sent data item!");
tx.commit();
}
catch (Exception e)
{
if (tx != null)
{
e.printStackTrace();
tx.rollback();
}
}
finally
{
s.close();
}
}
/**
* 根据 String destAddrr 得到APID
* 查表MsgRoute
*/
private String getApIdByDestAddrr(String destAddr)
{
String ApID = null;
Session session = null;
StringBuffer sbHql = new StringBuffer();
try
{
session = SessionFactory.currentSession();
sbHql.append("from MsgRoute where '");
sbHql.append(destAddr);
sbHql.append("' like concat(newServiceCode,'%') or '");
sbHql.append(destAddr);
sbHql.append("' like concat(oldServiceCode,'%')");
Iterator<MsgRoute> it = session.createQuery(sbHql.toString()).iterate();
if(it.hasNext())
{
ApID = it.next().getApplicationId();
}
}
catch (Exception e)
{
logger.error(e.getMessage(),e);
}
return ApID;
}
/**
* @param args
*/
public static void main(String[] args)
{
MmsTranslator t = new MmsTranslator();
t.inbound(1000);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -