⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 smstranslator.java

📁 DbService数据库接口,测试规范?菘饨涌?测试规范数据库接口,测试规范
💻 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 + -