ThreadPoolTask.java 12.4 KB
package com.espeed.yxy.timer;

import java.io.PrintWriter;
import java.io.Serializable;
import java.io.StringWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import com.espeed.yxy.mail.YxysendMethod;
import com.espeed.yxy.pojo.YxySendMailMaster;
import com.espeed.yxy.pojo.YxySendSmtpInfo;
import com.espeed.yxy.service.YxySendMailService;
import com.espeed.yxy.tool.DateFormat;
import com.espeed.yxy.tool.LogsTool;
/**
 * 程序名称:    	EspeedMail_时速邮箱
 * 程序版本:    	V1.0
 * 作    者:    	深圳市科飞时速网络技术有限公司(0755-88843776)
 * 版权所有:    	深圳市科飞时速网络技术有限公司
 * 技术支持:    	Tech@21gmail.com
 * 单元名称:    	手动收邮件后台线程池
 * 开始时间:    	2013.09.02
 * 程 序 员:    	谢勇
 * 最后修改:    
 * 备    注:		如需修改请通知程序员    
 */
public class ThreadPoolTask implements Runnable,Serializable{

	private static final long serialVersionUID = 0;	
	private static ThreadPoolExecutor threadPool=null;
	private static ThreadPoolTask threadpooltask=null;
	
	private YxySendMailService service;
	private YxySendSmtpInfo smtpinfo;
	private YxySendMailMaster mailinfo;
	//private List<YxySmtpSuffixSet> suffixtList;
	
	//无参构造方法
	ThreadPoolTask(){
	}
	//传递参数
	//ThreadPoolTask(YxySendMailService service,YxySendSmtpInfo smtpinfo,YxySendMailMaster mailinfo,List<YxySmtpSuffixSet> suffixtList){
	ThreadPoolTask(YxySendMailService service,YxySendSmtpInfo smtpinfo,YxySendMailMaster mailinfo){
		this.service=service;
		this.smtpinfo=smtpinfo;
		this.mailinfo=mailinfo;
		//this.suffixtList=suffixtList;
	}
	
	//单例方法
	public static ThreadPoolTask getMethodInstance(){
		if(threadpooltask==null){
			//System.out.println("创建新对像了");
			threadpooltask=new ThreadPoolTask();
		}
		return threadpooltask;
	}
	
	//线程池
	public static ThreadPoolExecutor getInstance(int bigThread){
		if(threadPool==null){
			threadPool=new ThreadPoolExecutor(20,23,50,
    				TimeUnit.SECONDS,new LinkedBlockingDeque<Runnable>(23),
    				new ThreadPoolExecutor.DiscardOldestPolicy());
		}
    	return threadPool;
    }
	//线程池运行方法
	//public synchronized void getResult(YxySendMailService service,List<YxySendSmtpInfo> smtplist,List<YxySendMailMaster> mailList) {
	public synchronized void getResult(YxySendMailService service,List<YxySendSmtpInfo> smtplist) {
		threadPool=getInstance(20);
		int queue=threadPool.getQueue().size();
		System.out.println("队列:"+queue);
		List<YxySendSmtpInfo> new_smtplist = smtplist;
		try{
			//根据smtp类型获取对应的类型的待发邮件
			String hql = "from YxySendMailMaster where isuse=0 and (status=0 or status=2) order by create_time";
			List<YxySendMailMaster> masters = service.getMailMasterByHql(hql);
			if(masters.size()>0){
				//当前时间
				SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
				String nowdate = df.format(new Date());
				//循环待发邮件
				for(YxySendMailMaster master : masters){
					//看看还有没有smtp
					if(new_smtplist.size() == 0){
						System.out.println("SMTP已经匹配完毕!");
						break;
					}
					if(master.getPlans_send()==1){//定时邮件
						//判断是否定时时间到了当前时间
						long minytelcha= DateFormat.minute1s(nowdate,master.getPlans_send_time());
						if(minytelcha>0){//定时时间还没到
							continue;
						}
					}
					//该封邮件去smtp集合里面匹配对应的smtp
					for(YxySendSmtpInfo smtp : new_smtplist){
						//0-0(新客户营销),1-1(本地库跟进)
						if((master.getIsold()==smtp.getSmtp_service_type()) 
								&& (smtp.getSmtp_service_type() == 0 || smtp.getSmtp_service_type() == 1))
						{
							//从smtp集合中去除该smtp
							new_smtplist.remove(smtp); 
							//修改SMTP状态为正在使用
							service.updateSmtpUseStatus(1, smtp.getSmtp_service_id(), "");
							Thread.sleep(1000);
							System.out.println("smtp服务器:"+smtp.getSmtp_service_id()+",类型:"+smtp.getSmtp_service_type()+"->负责发送邮件:"+master.getSend_mail_id()+",类型:"+master.getIsold());
							//调用线程进行发送
							threadPool.execute(new ThreadPoolTask(service,smtp,master));
							//退出smtp匹配循环
							break;
						}
						//2-2(CRM库代发模式)
						if((master.getIsold()==smtp.getSmtp_service_type()) 
								&& smtp.getSmtp_service_type() == 2)
						{
							//必须用自己企业的SMTP
							if(smtp.getSmtp_user_domain()!=null&&smtp.getSmtp_user_domain().equals(master.getUser_domain())){
								//从smtp集合中去除该smtp
								new_smtplist.remove(smtp); 
								//修改SMTP状态为正在使用
								service.updateSmtpUseStatus(1, smtp.getSmtp_service_id(), "");
								Thread.sleep(1000);
								System.out.println("smtp服务器:"+smtp.getSmtp_service_id()+",类型:"+smtp.getSmtp_service_type()+"->负责发送邮件:"+master.getSend_mail_id()+",类型:"+master.getIsold());
								//调用线程进行发送
								threadPool.execute(new ThreadPoolTask(service,smtp,master));
								//退出smtp匹配循环
								break;
							}
						}
						//3-3(CRM库自有域名),5-5(新客户营销-自有域名)
						if((master.getIsold()==smtp.getSmtp_service_type()) 
								&& (smtp.getSmtp_service_type() == 3 || smtp.getSmtp_service_type() == 5))
						{
							//必须用自己的smtp
							if(smtp.getSmtp_user_domain()!=null
									&& smtp.getSmtp_user_domain().equals(master.getUser_domain())
									&& smtp.getSmtp_user_loginid()!=null
									&& smtp.getSmtp_user_loginid().equals(master.getUser_loginid())){
								//从smtp集合中去除该smtp
								new_smtplist.remove(smtp); 
								//修改SMTP状态为正在使用
								service.updateSmtpUseStatus(1, smtp.getSmtp_service_id(), "");
								Thread.sleep(1000);
								System.out.println("smtp服务器:"+smtp.getSmtp_service_id()+",类型:"+smtp.getSmtp_service_type()+"->负责发送邮件:"+master.getSend_mail_id()+",类型:"+master.getIsold());
								//调用线程进行发送
								threadPool.execute(new ThreadPoolTask(service,smtp,master));
								//退出smtp匹配循环
								break;
							}
						}
						//盘活客户超标使用之前的老客户跟进发送
						if(master.getIsold()==4&&smtp.getSmtp_service_type()==1){
							//从smtp集合中去除该smtp
							new_smtplist.remove(smtp); 
							//修改SMTP状态为正在使用
							service.updateSmtpUseStatus(1, smtp.getSmtp_service_id(), "");
							Thread.sleep(1000);
							System.out.println("smtp服务器:"+smtp.getSmtp_service_id()+",类型:"+smtp.getSmtp_service_type()+"->负责发送邮件:"+master.getSend_mail_id()+",类型:"+master.getIsold());
							//调用线程进行发送
							threadPool.execute(new ThreadPoolTask(service,smtp,master));
							//退出smtp匹配循环
							break;
						}
						//开发客户超标使用之前的新客户营销发送
						if(master.getIsold()==6&&smtp.getSmtp_service_type()==0){
							//从smtp集合中去除该smtp
							new_smtplist.remove(smtp); 
							//修改SMTP状态为正在使用
							service.updateSmtpUseStatus(1, smtp.getSmtp_service_id(), "");
							Thread.sleep(1000);
							System.out.println("smtp服务器:"+smtp.getSmtp_service_id()+",类型:"+smtp.getSmtp_service_type()+"->负责发送邮件:"+master.getSend_mail_id()+",类型:"+master.getIsold());
							//调用线程进行发送
							threadPool.execute(new ThreadPoolTask(service,smtp,master));
							//退出smtp匹配循环
							break;
						}
						
//						//处理新客户营销或本地客户库的发送或超标的CRM库发送
//						if(master.getIsold()==smtp.getSmtp_service_type()&&(master.getIsold()==0||master.getIsold()==1)){
//							//从smtp集合中去除该smtp
//							new_smtplist.remove(smtp); 
//							//修改SMTP状态为正在使用
//							service.updateSmtpUseStatus(1, smtp.getSmtp_service_id(), "");
//							Thread.sleep(1000);
//							System.out.println("smtp服务器:"+smtp.getSmtp_service_id()+"负责发送邮件:"+master.getSend_mail_id());
//							//调用线程进行发送
//							threadPool.execute(new ThreadPoolTask(service,smtp,master));
//							//退出smtp匹配循环
//							break;
//						}
//						//处理代发模式,当前邮件的域名都使用该smtp发送
//						if(master.getIsold()==smtp.getSmtp_service_type()&&master.getIsold()==2){
//							//是同一个域名则可以发送
//							if(smtp.getSmtp_user_domain()!=null&&smtp.getSmtp_user_domain().equals(master.getUser_domain())){
//								//从smtp集合中去除该smtp
//								new_smtplist.remove(smtp);
//								//修改SMTP状态为正在使用
//								service.updateSmtpUseStatus(1, smtp.getSmtp_service_id(), "");
//								Thread.sleep(1000);
//								System.out.println("smtp服务器:"+smtp.getSmtp_service_id()+"负责发送邮件:"+master.getSend_mail_id());
//								//调用线程进行发送
//								threadPool.execute(new ThreadPoolTask(service,smtp,master));
//								//退出smtp匹配循环
//								break;
//							}
//						}
//						//处理自有域名,当前邮件的域名只能使用自己的smtp发送
//						if(master.getIsold()==smtp.getSmtp_service_type()&&master.getIsold()==3){
//							//是同一个域名则可以发送
//							if(smtp.getSmtp_user_domain()!=null&&
//									smtp.getSmtp_user_domain().equals(master.getUser_domain())&&
//									smtp.getSmtp_user_loginid()!=null&&smtp.getSmtp_user_loginid().equals(master.getUser_loginid())){
//								//从smtp集合中去除该smtp
//								new_smtplist.remove(smtp);
//								//修改SMTP状态为正在使用
//								service.updateSmtpUseStatus(1, smtp.getSmtp_service_id(), "");
//								Thread.sleep(1000);
//								System.out.println("smtp服务器:"+smtp.getSmtp_service_id()+"负责发送邮件:"+master.getSend_mail_id());
//								//调用线程进行发送
//								threadPool.execute(new ThreadPoolTask(service,smtp,master));
//								//退出smtp匹配循环
//								break;
//							}
//						}
					}
				}
			}else{
				System.out.println("没有待发邮件!");
			}
		}catch (Exception e) {
			e.printStackTrace();
		}
		
		
		
		
//		threadPool=getInstance(20);
//		int queue=threadPool.getQueue().size();
//		System.out.println("队列:"+queue);
//		List<YxySendSmtpInfo> new_smtplist = smtplist;
//		//邮件加入线程池
//		for(int j=0;j<mailList.size();j++){
//			try {
//				if(queue>=23){
//					System.out.println("队列已满!");
//					break;
//				}
//				
//				YxySendSmtpInfo smtpinfo = null;
//				
//				if(mailList.get(j).getIsold()==2)//自主域名投递
//				{
//					//选择合适的自主域名投递smtp
//					smtpinfo = service.findSmtpInfoByCusType2(new_smtplist, mailList.get(j));
//				}
//				else//不是自主域名投递则按之前的业务实现
//				{
//					//根据客户类型进行选择smtp服务器
//					smtpinfo = service.findSmtpInfoByCusType(new_smtplist,mailList.get(j).getIsold());
//				}
//				if(null==smtpinfo)//没对应的smtp则执行下一循环
//				{
//					continue;
//				}
//				//去除满足的smtp服务器
//				new_smtplist.remove(smtpinfo);
//				//修改SMTP状态
//				service.updateSmtpUseStatus(1, smtpinfo.getSmtp_service_id(), "");
//				Thread.sleep(1000);
//				System.out.println("smtp服务器:"+smtpinfo.getSmtp_service_id()+"负责发送邮件:"+mailList.get(j).getSend_mail_id());
//				threadPool.execute(new ThreadPoolTask(service,smtpinfo,mailList.get(j)));
////				//修改SMTP状态
////				service.updateSmtpUseStatus(1, smtplist.get(j).getSmtp_service_id(), "");
////				Thread.sleep(1000);
////				threadPool.execute(new ThreadPoolTask(service,smtplist.get(j),mailList.get(j)));
//			} catch (Exception e) {
//				e.printStackTrace();
//			}
//		}
	}
	//获取线程量
	public int getThreadNum(){
		if(threadPool==null){
			return -1;
		}else{
			return threadPool.getActiveCount();
		}
	}
	//start
	public void run(){
		try {
			//调用发邮件方法
			YxysendMethod.sendMethodImpl(service, smtpinfo,mailinfo);
		} catch (Exception e) {
			e.printStackTrace();
			//写入日志
			StringWriter sw = new StringWriter();
			e.printStackTrace(new PrintWriter(sw, true));
	        String str = sw.toString();
			LogsTool.erroLogs(str);
		} 
		//此线程任务完成后重新获取线程池的数量
//   	  	synchronized (this) {
//   	  	threadPool.shutdown();
//		}
	}

}