📄 smstranslator.java
字号:
package com.rainbow.mas.plugin.dbplugin.translator;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.rainbow.mas.SessionFactory;
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.MsgRoute;
import com.rainbow.mas.web.dto.SmsDeliver;
import com.rainbow.mas.web.dto.SmsDeliverHistory;
import com.rainbow.mas.web.dto.SmsIdMapping;
import com.rainbow.mas.web.dto.SmsInbox;
import com.rainbow.mas.web.dto.SmsOutbox;
import com.rainbow.mas.web.dto.SmsSent;
import com.rainbow.mas.web.dto.SmsSubmit;
import com.rainbow.mas.web.dto.SmsSubmitHistory;
public class SmsTranslator implements Translator
{
static Logger logger = LogManager.getLogger(SmsTranslator.class);
private static SeqNumber seqNumber = SeqNumber.getInstance();
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 sms_inbox " + "where requesttime<'"
+ datefmt.format(cleanTime) + "'").executeUpdate();
int ret2 = s.createSQLQuery(
"delete from sms_sent " + "where senttime<'"
+ datefmt.format(cleanTime) + "'").executeUpdate();
logger.info("Clean " + ret1 + "sms_inbox data item!");
logger.info("Clean " + ret2 + "sms_sent data item!");
tx.commit();
}
catch (Exception e)
{
if (tx != null)
{
e.printStackTrace();
tx.rollback();
}
}
finally
{
s.close();
}
}
/**
* 从等待发送表取数据添加到 内部发送表
*/
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 SmsOutbox").setMaxResults(mx)
.list();
for (int i = 0; i < list.size(); i++)
{
SmsOutbox out = (SmsOutbox) 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='"
+ apID + "'").list();
if (l.size() > 1)
{
logger.info("Duplicate activated Message Route!"
+ "(applicationID:" + apID
+ " extcode:" + out.getExtcode() + ")");
continue;
}
else if (l.size() == 0)
{
logger.info("No suited Message Route!" + "(applicationID:"
+ apID + ")");
continue;
}
//从DB中得到BizConfig/////////////////////
//这二项是由是我自己来的 封闭成一个函数 Utility.getSendHeadInfo();
//IN:ApID,extendCode
//OUT:服务代码,业务代码 ,BizConfig
SendHeadInfo sendHeadInfo = Utility.getSendHeadInfo(apID, extendCode);
//输出标号 代表一组消息 可以相同的!!!!!!!!!!!!! 得改数据库参数
String requestIdentifier = out.getSismsid();
/////////////////////////
String destAddr = out.getDestaddr();
if (destAddr == null)
continue;
String[] addrs = destAddr.split(";");
// 最多不超过50给接受者
for (int j = 0; j < addrs.length && j < 50; j++)
{
//不用分条的短信
SmsSubmit ss = new SmsSubmit();
//系统保证唯一序号 累加的
ss.setSmsid(seqNumber.genSeqNum());//*********
ss.setBiz(sendHeadInfo.getBizConfig());
/////////////
ss.setLoadtime(new Date());
ss.setServicecode(sendHeadInfo.getBuinessCode()); //业务代码 从应用表msgconfig查出
ss.setCaller(sendHeadInfo.getServerCode()); //与扩展码一起组成的服务代码 从应用表msgconfig查出
ss.setCalled(addrs[j]);
ss.setCharge(addrs[j]);
ss.setFeevalue(0); //填0 免费
ss.setSendtime(new Date());
ss.setStatus(0);//状态 填0
ss.setFailsendtimes(0);//失败已重发次数 填0
//一定要设置 此值不能为空
ss.setSentresult(0); //状态 填0
ss.setServercode(sendHeadInfo.getServerCode()); //服务代码 同发送号码
//新加的状态报告
ss.setRegisteredDelivery(registeredDelivery);
ss.setMsgformat(out.getMsgfmt());
ss.setMsgcontent(out.getMessagecontent());
////////////////////
s.save(ss);
s.flush();
///////////////////////////////////////////////
//查出ID值 添加到 sms_mapping 表
s.refresh(ss);
int smsTaskID = ss.getSmsTaskId();
SmsIdMapping sim = new SmsIdMapping();
sim.setSmsTaskId(smsTaskID);
sim.setSismsid(requestIdentifier); //一组消息标识
sim.setApplicationid(apID);
sim.setExtcode(extendCode);
sim.setProcessStatus(0);//状态 没处理
s.save(sim);
s.flush();
/////////////END/////////////////////
}
s.delete(out);
}
tx.commit();
}
catch (Exception e)
{
if (tx != null)
{
logger.error("Throw Exception!", e);
tx.rollback();
}
}
finally
{
if(s != null)
s.close();
}
}
public void outbound(Date checkTime)
{
if (checkTime == null)
return;
Session s = SessionFactory.currentSession();
Transaction tx = null;
List list = null;
try
{
tx = s.beginTransaction();
// 处理上行短信 处理方式同WebService
list = s.createQuery(
"from SmsDeliver where msgformat != 4 and recieveTime>'"
+ datefmt.format(checkTime) + "'").list();
for (int i = 0; i < list.size(); i++)
{
SmsDeliver deliver = (SmsDeliver) list.get(i);
SmsInbox in = new SmsInbox();
String destAddr = deliver.getCalled();
String Apid = getApIdByDestAddrr(destAddr);
if(Apid != null)
{
//只要找到APID就行了 其它的不管了先 clf
in.setApplicationid(Apid);
// in.setExtcode(r.getExtcode());
in.setMassmsid(deliver.getMoId().toString());
in.setMessagecontent(deliver.getMsgcontent());
in.setMsgfmt(deliver.getMsgformat());
in.setReceivetime(deliver.getRecieveTime());
in.setRequesttime(deliver.getLoadtime());
in.setSourceaddr(deliver.getCaller());
s.save(in);
//删除到历史表
SmsDeliverHistory sdh = new SmsDeliverHistory();
sdh.setBizId(deliver.getBiz().getBizId());
sdh.setCalled(deliver.getCalled());
sdh.setCaller(deliver.getCaller());
sdh.setLoadtime(deliver.getLoadtime());
sdh.setMoId(deliver.getMoId()); //key应该是assigned
sdh.setMsgcontent(deliver.getMsgcontent());
sdh.setMsgformat(deliver.getMsgformat());
sdh.setRecieveTime(deliver.getRecieveTime());
sdh.setSeq1(deliver.getSeq1());
sdh.setSeq2(deliver.getSeq2());
sdh.setSeq3(deliver.getSeq3());
sdh.setTppid(deliver.getTppid());
sdh.setTpuid(deliver.getTpuid());
//设置处理时间
sdh.setProcesstime(new Date());
s.save(sdh);
//删除原表
s.delete(deliver);
//////////////////
}
}
// 处理已发送短信 , 修改:同时反向轮询,为了更新状态报告
if(list != null)
{
list.clear();
}
list = s.createQuery("from SmsSubmitHistory s where msgformat != 4").list();
for (int i = 0; i < list.size(); i++)
{
SmsSubmitHistory submit = (SmsSubmitHistory) list.get(i);
List l = s.createQuery(
"from SmsIdMapping m where m.smsTaskId="
+ submit.getSmsTaskId()).list();
if (l.size() != 1)
{
logger.info("No matchedMessage Mapping!");
continue;
}
SmsIdMapping mapping = (SmsIdMapping) l.get(0);
if (mapping == null)
{
continue;
}
//cui 如果存在则更新,没有则写入新记录
SmsSent sent = null;
sent = (SmsSent)s.get(SmsSent.class, submit.getSmsTaskId().toString());
if(sent != null)
{
if(submit.getStatus() != null && submit.getSendtime() != null)
{
//已存在的记录,着重更新关键值就行了
sent.setGwsmsid(submit.getMsgId()); //网关返回的
/////////////////处理状态//////////////////////
//CMPP_SUBMIT的返回值 发送结果
sent.setSentresult(submit.getStatus());
sent.setSenttime(submit.getSendtime());
//状态报告 报告的时间
sent.setSmsstatus(submit.getReportstatus());
sent.setStatustime(submit.getResultTime());
s.update(sent);
//删除掉已处理过的
if(sent.getSmsstatus() != null)
{
s.delete(submit);//用历史表处理,直接删除
}
}
}
else
{
sent = new SmsSent();
//主键 不能相同 要唯一
sent.setMassmsid(submit.getSmsTaskId().toString()); //****MAS生成的
sent.setApplicationid(mapping.getApplicationid());
sent.setDestaddr(submit.getCalled());
sent.setExtcode(mapping.getExtcode());
sent.setGwsmsid(submit.getMsgId()); //网关返回的
//提交时代的消息标识 代表一组消息请求 可以相同
sent.setSismsid(mapping.getSismsid()); //******从SMS_OUTBOX 表带来
sent.setRequesttime(submit.getLoadtime());
/////////////////处理状态//////////////////////
//CMPP_SUBMIT的返回值 发送结果
sent.setSentresult(0); //Not NULL
sent.setSenttime(submit.getLoadtime()); //Not NULL
//状态报告
sent.setSmsstatus(submit.getReportstatus());
//收到状态报告的时间
sent.setStatustime(submit.getResultTime());
//////////////////END//////////////////////////
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();
}
}
/**
* 根据 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;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -