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

📄 mmstranslator.java

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