📄 mmsdataworker.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 + -