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

📄 mmsdataworker.java

📁 MM7彩信对接网关示例
💻 JAVA
字号:
/*
 * Created on 2005-8-20
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
package com.rainbow.mms.appframe;

import java.util.Collection;
import java.util.LinkedList;
import java.util.List;

import org.apache.log4j.Logger;
import org.hibernate.Session;
import org.hibernate.Transaction;

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


/**
 * 应用中,处理Deliver消息的工作者线程。它负责将Deliver消息传递给它的继承类来处理。
 * 处理完后,由继承类返回根据Deliver消息生成的Submit消息。
 * 
 * @author Rainbow mms group leader —— TrWorks
 *
 */
public abstract class MMSDataWorker implements Runnable {

	/**
	 * 运行标志,当线程运行后,将该标志置为false后,线程函数将退出
	 */
	private static volatile boolean bRun = true;

	/**
	 * 发送队列,该队列存放要发送的Submit消息。 将listSend作为静态成员以供所有的发送者线程共同使用
	 */
	private static List listDo = new LinkedList();
	
	/**
	 * 日志
	 */
	private Logger log = Logger.getLogger(MMSDataWorker.class);

	/**
	 * 构造函数
	 */
	public MMSDataWorker(){

	}
	
	/**
	 * 将要发送的Submit队列加入到listSend中,并唤醒发送者线程,让他发送
	 * 
	 * @param Collection
	 *            o 将要发送的Submit队列加入到listSend中
	 */
	public static void addDeliverMsgToList(Collection o) {
		synchronized (listDo) {
			listDo.addAll(o);
			listDo.notifyAll();
		}
	}

	/**
	 * 将要发送的Submit加入到listSend中,并唤醒发送者线程,让他发送
	 * 
	 * @param CMCCMM7DeliverMsg
	 *            o 将要发送的Submit队列加入到listSend中
	 */
	public static void addDeliverMsgToListEx(CMCCMM7DeliverMsg o) {
		synchronized (listDo) {
			listDo.add(o);
			listDo.notifyAll();
		}
	}
	
	/**
	 * 线程函数,负责从发送队列里获得Submit消息,然后发送它
	 */
	public void run() {

		log.info("线程开始运行.......");
		
		while (bRun || listDo.isEmpty() == false) {

			try {
				CMCCMM7DeliverMsg m = null;

				synchronized (listDo) {
					// 如果发送队列为空,则让线程等待,直到被唤醒
					if (listDo.isEmpty() == true) {
						listDo.wait();						
					}
					
					if (listDo.isEmpty() == false){ 
						// 从队列中获得一个要发的SUBMIT消息
						m = (CMCCMM7DeliverMsg)listDo.remove(0);
					}
				}
				
				// 处理Deliver消息,并将SUBMIT消息发送出去
				if (m != null) {
					CMCCMM7SubmitMsg submit = doMessage(m);
					if (false == sendSubmitMessage(submit)){
						log.error("将生成的Submit消息插入到数据库中失败");
					}
					removeDeliverMessageAfterDone(m);
				}
		
			} catch (Throwable e) {
				e.printStackTrace();
				log.error("线程函数里发生异常");
			}
		}
		
		log.info("线程终止运行.");
	}

	/**
	 * 将要发送的Submit消息发送出去
	 * @param submit 要发送的Submit消息
	 * @return 是否成功地插入到了发送表中
	 */
	private boolean sendSubmitMessage(CMCCMM7SubmitMsg submit){
		if (submit == null){
			return false;
		}
		
		boolean success = false;
		try {
			Session sess = HibernateUtil.currentSession();
			Transaction tx = sess.beginTransaction();
			for (int i = 0 ; i < submit.getContent().getMmsContentElments().size(); i++){
				MimeContent mime = (MimeContent)submit.getContent().getMmsContentElments().get(i);
				sess.save(mime);
			}
			sess.save(submit.getContent());
			sess.save(submit);
			tx.commit();
			
			success = true;
		}
		catch(Exception e){
			e.printStackTrace();
		}
		finally{
			HibernateUtil.closeSession();
		}
		
		return success;
	}

	/**
	 * 删除已经处理完的Deliver消息
	 * @param deliver 已经处理完的Deliver消息
	 */
	private void removeDeliverMessageAfterDone(CMCCMM7DeliverMsg deliver){
		if (deliver == null){
			return;
		}
		
		try {
			Session sess = HibernateUtil.currentSession();
			//Transaction tx = sess.beginTransaction();
			sess.delete(deliver);
			//tx.commit();
		}
		catch(Exception e){
			e.printStackTrace();
		}
		finally{
			HibernateUtil.closeSession();
		}
	}
	/**
	 * 处理收到的Deliver消息
	 * @param m Deliver消息
	 * @return CMCCMM7SubmitMsg
	 */
	abstract protected CMCCMM7SubmitMsg doMessage(CMCCMM7DeliverMsg m);
	
	/**
	 * @param run The bRun to set.
	 */
	public static final void setBRun(boolean run) {
		bRun = run;
	}
	
	/**
	 * 获得发送队列的当前大小(队列中要发送Submit消息的个数)
	 * @return 队列中要发送Submit消息的个数
	 */
	public static int getDeliverListSize(){
		synchronized(listDo){
			return listDo.size();
		}
	}
	

	abstract public void initWorkers();
}

⌨️ 快捷键说明

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