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

📄 senderdatagetter.java

📁 彩信接入系统
💻 JAVA
字号:
package com.rainbow.mms.gateway;


import java.util.Date;

import java.util.LinkedList;
import java.util.List;
import java.util.TimerTask;

import org.apache.log4j.Logger;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

import com.rainbow.mms.common.CMCCMM7SubmitMsg;
import com.rainbow.util.tools.HibernateUtil;

/**
 * 定时从数据库中读取彩信Submit消息
 * @author Rainbow MMS Group Leader —— TrWorks
 */
class SenderDataGetter extends TimerTask {

	/**
	 * 网关号
	 */
	private int gatewayid = 0;

	/**
	 * 采用的Submit消息容器类的名称, 针对华为平台的彩信网关,该字段应该是:HuaweiMMSSubmitContainer
	 * 针对中信平台的彩信网关,该字段应该是:ZhongxinMMSSubmitContainer
	 */
	private String containerClass = null;

	/**
	 * 日志
	 */
	private Logger log = Logger.getLogger(SenderDataGetter.class);

	/**
	 * 当发送队列在一个Timer处理时间间隔内还没有发送完时,队列中应该剩余的大小。
	 * 该大小保证了下一个Timer事件中是否要从数据库中获得Submit消息,
	 * 如果队列剩下个数大于这个值,那么Timer事件将不再从数据库中获得Submit消息
	 */
	private int listProperSize = 0;

	private int onceGetSubmitNum = 0;

	private int onceGetFailedNum = 0;
	
	private boolean firstRun = false;

	/**
	 * 构造函数
	 * 
	 * @param gatewayid
	 *            网关的编号
	 * @param listProperSize
	 *            当发送队列在一个Timer处理时间间隔内还没有发送完时,队列中应该剩余的大小
	 * @param containerClass
	 *            本网关采用的Submit容器类, 针对华为平台的彩信网关,该字段应该是:HuaweiMMSSubmitContainer;
	 *            针对中信平台的彩信网关,该字段应该是:ZhongXinMMSSubmitContainer
	 * @param onceGetSubmitNum 每次应该读取的未发送过的SUBMIT数量
	 * @param onceGetFailedNum 每次应该读取的发送失败过一次或两次的SUBMIT数量
	 */
	public SenderDataGetter(final int gatewayid, final int listProperSize,
			final String containerClass, final int onceGetSubmitNum,
			final int onceGetFailedNum) {
		this.gatewayid = gatewayid;
		this.containerClass = containerClass;
		this.listProperSize = listProperSize;
		this.onceGetSubmitNum = onceGetSubmitNum;
		this.onceGetFailedNum = onceGetFailedNum;
		this.firstRun = true;
	}

	/**
	 * 定时访问数据库,获得要发送的彩信Submit消息
	 */
	public synchronized void run() {

		if (firstRun == true){
			firstRun = false;
			firstStartRun();
		}
		
		log.debug("定时从数据库获得Submit消息");

		// 如果队列里还有没有发送过的,
		// 那么Timer事件将不再从数据库中获得Submit消息
		if (SenderThread.getSendListSize() > 0) {
			log.debug("队列中还有没有发送出去的Submit消息");
			return;
		}

		List wantToSend = new LinkedList();

		try {
			Session sess = HibernateUtil.currentSession();
			Criteria cr = sess.createCriteria(CMCCMM7SubmitMsg.class);
			// 选出没有发送过的,按照优先级排序
			List psNormal = cr.
					add(Restrictions.eq("sendTimes", new Integer(0))).
					add(Restrictions.eq("gateWayID", new Integer(gatewayid))).
					addOrder(Order.desc("priority")).				
					setMaxResults(this.onceGetSubmitNum).list();
			if (psNormal == null || psNormal.size() == 0) {
				;
			} else {
				wantToSend.addAll(psNormal);
			}

			// 选出发送失败的,且发送过一次的.
			long lastTime = System.currentTimeMillis() - 1*60*1000;
			Date now = new Date(lastTime);
			
			List psFailed = sess.createCriteria(CMCCMM7SubmitMsg.class).add(
					Restrictions.eq("gateWayID", new Integer(gatewayid))).add(
					Restrictions.le("sendTimes", new Integer(2))).add(
					Restrictions.eq("msgID", "-1")).add(
					Restrictions.le("actualSendTime", now)).
					setMaxResults(this.onceGetFailedNum).list();
			if (psFailed == null || psFailed.size() == 0) {
				;
			} else {
				wantToSend.addAll(psFailed);
			}

/*			// 选出发送失败的,且发送过两次的.
			List psFailed2 = sess.createCriteria(CMCCMM7SubmitMsg.class).add(
					Restrictions.eq("gateWayID", new Integer(gatewayid))).add(
					Restrictions.eq("sendTimes", new Integer(2))).add(
					Restrictions.eq("msgID", "-1")).add(
					Restrictions.le("actualSendTime", now)).
					setMaxResults(this.onceGetFailedNum).list();
			if (psFailed == null || psFailed.size() == 0) {
				;
			} else {
				wantToSend.addAll(psFailed);
			}*/
			
			// 更新数据库中的Submit消息取出的次数
			Transaction tx = sess.beginTransaction();
			for (int i = 0; i < wantToSend.size(); i++) {
				CMCCMM7SubmitMsg msg = (CMCCMM7SubmitMsg) wantToSend.get(i);
				msg.setSendTimes(msg.getSendTimes() + 1);
				sess.save(msg);
			}
			tx.commit();

			// 将要发送的消息添加到发送队列中
			SenderThread.addSubmitMsgToList(wantToSend);

			log.debug("从数据库中获得未发送和发送失败过一次的Submit消息的数量是:"
					+ SenderThread.getSendListSize());
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		finally{
			HibernateUtil.closeSession();
		}
	}
	
	/**
	 * 将上次网关发送队列中未发送的消息重新装入队列
	 */
	private void firstStartRun(){
		
		List wantToSend = new LinkedList();

		try {
			Session sess = HibernateUtil.currentSession();
			Criteria cr = sess.createCriteria(CMCCMM7SubmitMsg.class);
			// 选出没有发送过的,按照优先级排序
			List psNormal = cr
					.add(Restrictions.eq("sendTimes", new Integer(1))).add(
							Restrictions
									.eq("gateWayID", new Integer(gatewayid)))
					.add(Restrictions.or(Restrictions.isNull("msgID"), Restrictions.eq("msgID", "")))
					.addOrder(Order.desc("priority")).setMaxResults(
							this.onceGetSubmitNum).list();
			
			if (psNormal == null || psNormal.size() == 0) {
				;
			} else {
				wantToSend.addAll(psNormal);
			}

			// 将要发送的消息添加到发送队列中
			SenderThread.addSubmitMsgToList(wantToSend);
			
			log.debug("将上次网关发送队列中未发送的消息重新装入队列,Submit数量:"
					+ SenderThread.getSendListSize());
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		finally{
			HibernateUtil.closeSession();
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -