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

📄 mmspspsendsvcimpl.java

📁 短信
💻 JAVA
字号:
package com.asiainfo.batchsend.mms.psp;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;

import com.asiainfo.batchsend.CtrCenEntry;
import com.asiainfo.batchsend.model.MmsPush;
import com.asiainfo.batchsend.sms.boss.DBCon;
import com.asiainfo.batchsend.util.ChannelUtil;
import com.asiainfo.batchsend.util.DateUtil;
import com.asiainfo.batchsend.util.FileUtil;
import com.asiainfo.batchsend.util.FtpUtil;
import com.asiainfo.batchsend.util.TaskIdUtil;
import com.asiainfo.databusi.bo.NbCampChannels;
import com.asiainfo.databusi.platform.util.JarFile;
import com.asiainfo.databusi.util.CharUtil;
import com.asiainfo.databusi.util.DataBusiDbUtils;

/**
 * <p>Title: </p>
 * <p>Description: </p>
 * <p>Company: Asiainfo Technologies(China),Inc </p>
 * <p>Date: Nov 6, 2007 3:55:51 PM </p>
 * <p>Email to: jiangyl@asiainfo.com </p>
 * @author jiangyl
 * @version 1.0
 */  

public class MmsPspSendSvcImpl extends Thread {
	//发送状态  Status 如果已经达到发送次数的上限,则将其状态置为2现在的状态:0,未发送,1,发功成功,2 发送失败, 3发送中*/
	//所有的实现需要根据实际的任务去查找数据,taskId在CtrCenEntry中获取
	public static final int TODO = 0;
	public static final int DONE = 1;
	public static final int DOING = 3;
	public static final int FAIL = 2;
	
	private static final Logger log = Logger.getLogger(MmsPspSendSvcImpl.class);
	private static String strDBType = DataBusiDbUtils.BACKTYPE;
	private String channelId;
	private String sql = "";
	private NbCampChannels channel = null;
	
	
	private boolean safeExit = false;
	
	public void safeExit(){
		safeExit = true;
	}
	
	public void run() {	
		while ( !safeExit ){
			try{
				List list = loadData();
				if (  list != null && list.size() > 0 ){
					sendData(list);
				}else{
					this.threadSleep(10000);
				}
			}catch(Exception e){
				log.error("MMS-PSP发送线程发送严重的错误",e);
			}
		}
	}
	
	public MmsPspSendSvcImpl(String channelId ){
		setName("MMS-MmsPspSendSvcImpl");
		this.channelId = channelId;
		channel = ChannelUtil.getChannelById(channelId);
		sql = " select id, task_id, start_date , end_date ,  camp_id, obj_id, msisdn, file_path, subject, status, start_date,end_date " +
	    			 " from nb_mms_push where status = ? and task_id = ?  ";
		if (strDBType.equalsIgnoreCase("oracle")) {
			sql += " and rownum <= " + MmsConfig.LOADCOUNT;
		}else if (strDBType.equalsIgnoreCase("db2")) {
			sql += " fetch first " + MmsConfig.LOADCOUNT + " rows only ";
		}
		
	}
	
	//这里只根据任务提取数据,主要是因为根据调度任务传进来的taskId已经具备发送的条件
	String udpate = " update nb_mms_push t set t.status = ?, send_count = send_count + 1 where t.id = ? ";
	public List loadData() {
		//获得当前执行的任务ID
		String taskId = CtrCenEntry.getInstance().getTaskIdByChannel(channelId);
		if ( taskId == null )
			return null;
		synchronized( channelId ){
			Connection conn = null;
			List list = new ArrayList();
			try {
				conn = DBCon.getShenYunDataSource().getConnection();
				conn.setAutoCommit(false);
				PreparedStatement ps = conn.prepareStatement(sql);
				PreparedStatement ups = conn.prepareStatement(udpate);
				ps.setInt(1, TODO);
				ps.setString(2, taskId);
				ResultSet rs = ps.executeQuery();
				while(rs.next()){
					MmsPush sms = new MmsPush();
					sms.setId( rs.getLong("id"));
					sms.setCampId( rs.getString("camp_id"));
					sms.setObjId( rs.getString("obj_id").trim());
					sms.setMsisdn( rs.getString("msisdn").trim());
					sms.setFilePath( rs.getString("file_path").trim());   
					sms.setSubject( CharUtil.convertCharToGBK( rs.getString("subject").trim()));   
					sms.setStartDate( rs.getString("start_date").replaceAll("-", "").substring(0,8));
					sms.setEndDate( rs.getString("end_date").replaceAll("-", "").substring(0,8));
					sms.setTaskId( rs.getString("task_id"));
					list.add(sms);
					
					ups.setInt(1, DONE);
					ups.setLong(2, sms.getId());
					ups.addBatch();
				}
				ups.executeBatch();
				ps.close();
				ups.close();
				conn.commit();
				log.debug("深运平台从nb_mms_push表在装载数据时获取" +  list.size() + "条记录,更新" + list.size() +"条记录");
			} catch (Exception e) {
				try{
					conn.rollback();
				}catch(Exception ee){
				}
				log.error("深运平台在装载数据时发生严重的错误",e);
			} finally {
				if(conn!=null){
					try {
						conn.close();
					} catch (SQLException e) {
					}
				}
			}
			return list;
		}
	}
	
	
	public boolean sendData(List list) {
		boolean flag = false;
		int taskNum = TaskIdUtil.getMMSNextId();
		String num = taskNum+"";
		if ( taskNum < 10)
			num = "0" + num;
		String date = DateUtil.getYYYYMMDD();
		String TASKINFO   = "task" + num + "_" + date + ".xml";
		String USERGROUP  = "mobile" + num + "_" + date + ".txt";
		String CHECKFFILE = "check" + num + "_" + date + ".txt";
		int USERGROUPCOUNT = list.size();
		MmsPush push = (MmsPush)list.get(0);
        //1.构造手机号码文件的内容
		StringBuffer msisdns = this.getMsisdnsFile(list);
		//2.构造task文件的内容
		StringBuffer taskxx = this.getTaskxx(push);
		//3.构造校验文件的内容
		StringBuffer checkFile = new StringBuffer("TASKINFO = " + TASKINFO + "\r\n");
		checkFile.append("USERGROUP = " + USERGROUP + "\r\n");
		checkFile.append("USERGROUPCOUNT = " + USERGROUPCOUNT + "\r\n");
		checkFile.append("$$end$$");
		//4.zip彩信文件到指定的目录 dataPath目录下
		JarFile.zipDir(push.getFilePath());
		//5.ftp到psp平台
		FtpUtil ftp = new FtpUtil(MmsConfig.user,MmsConfig.password,MmsConfig.server,MmsConfig.dataPath);
		//ftp.setFtpPath(MmsConfig.ftpPath);
		try{
			//6.保存手机构造文件
			FileUtil.saveMmsFile(msisdns,USERGROUP);
			//7.保存task文件
			FileUtil.saveMmsFile(taskxx,TASKINFO);
			//8.保存校验文件
			FileUtil.saveMmsFile(checkFile,CHECKFFILE);
			//9.上传文件到PSP平台
			if ( MmsConfig.FTP.trim().equals("1")  ){
				ftp.connect(MmsConfig.ftpPath);
				ftp.put(TASKINFO);
				ftp.put(USERGROUP);
				ftp.put(CHECKFFILE);
				ftp.put(push.getFilePath()+".zip");
				
				//10.将处理过的数据转移到bak文件夹
				FileUtil.moveMmsFile(USERGROUP);
				FileUtil.moveMmsFile(TASKINFO);
				FileUtil.moveMmsFile(CHECKFFILE);
				FileUtil.moveMmsFile(push.getFilePath()+".zip");
			}
			flag = true;
		}catch(IOException e){
			flag = false;
			try{
				FileUtil.deleteMmsFile(USERGROUP);
				FileUtil.deleteMmsFile(TASKINFO);
				FileUtil.deleteMmsFile(CHECKFFILE);
				TaskIdUtil.setMMSPreId();
			}catch(Exception ee ){
			}
			log.error("",e);
		}finally{
			try{
				ftp.close();
			}catch(Exception ee){
			}
		}
		return flag;
		
	}
	
	private StringBuffer getMsisdnsFile(List list){
		MmsPush push = null;
		StringBuffer msisdns = new StringBuffer("");
		for ( int i = 0; i < list.size(); i++ ){
			push = (MmsPush)list.get(i);
			msisdns.append(push.getMsisdn()+"\r\n");
		}
		try{
			msisdns = new StringBuffer(new String (msisdns.toString().getBytes("ASCII")));
		}catch(Exception e){
		}
		return msisdns;
	}
	
	private StringBuffer getTaskxx(MmsPush push ){
		//防止在中途修改了发送时段,不能及时同步发送时段
		channel = ChannelUtil.getChannelById(channelId);
		if ( channel.getStartTime().trim().length() == 1 ){
			channel.setStartTime("0" + channel.getStartTime().trim() );
		}
		if ( channel.getEndDate().trim().length() == 1 ){
			channel.setEndDate("0" + channel.getEndDate().trim() );
		}
		if ( channel.getStartTime2().trim().length() == 1 ){
			channel.setStartTime2("0" + channel.getStartTime2().trim() );
		}
		if ( channel.getEndDate2().trim().length() == 1 ){
			channel.setEndDate2("0" + channel.getEndDate2().trim() );
		}
		
		StringBuffer taskxx = new StringBuffer("");
		taskxx.append("<?xml version = \"1.0\" encoding=\"gb2312\"?>\r\n");
		taskxx.append("<psp_task>\r\n");
		taskxx.append("  <request_task_id>" + MmsConfig.SENDID + "_" + DateUtil.getYYYYMMDDHHMMSS()+ "</request_task_id>\r\n");
		taskxx.append("  <task_name>" + push.getTaskId()+ "</task_name>\r\n");  //我们将名称置换为taskId主要是再解析日志的时候根据taskId和手机号码来修改发送成功与否
		taskxx.append("  <task_desc>" + push.getSubject() + "</task_desc>\r\n");
		taskxx.append("  <message>\r\n");
		taskxx.append("    <type>3</type>\r\n");
		taskxx.append("    <subject>" + push.getSubject() + "</subject>\r\n");
		taskxx.append("    <mmfile>" + push.getFilePath()+".zip"+ "</mmfile>\r\n");
		taskxx.append("  </message>\r\n");
		taskxx.append("  <period>\r\n");
		taskxx.append("    <push_date start=\"" + push.getStartDate() + "\" end=\"" + push.getEndDate()+ "\"/>\r\n");
		taskxx.append("    <push_time>\r\n");
		taskxx.append("      <time start=\"" + channel.getStartTime().trim() + ":00\" end=\"" + channel.getEndDate().trim() + ":00\"/>\r\n");
		taskxx.append("      <time start=\"" + channel.getStartTime2().trim() + ":00\" end=\"" + channel.getEndDate2().trim() + ":00\"/>\r\n");
		taskxx.append("    </push_time>\r\n");
		taskxx.append("  </period>\r\n");
		taskxx.append("  <sender>\r\n");
		taskxx.append("    <id>" + MmsConfig.SENDID + "</id>\r\n");
		taskxx.append("    <passwd>" + MmsConfig.SENDPWD + "</passwd>\r\n");
		taskxx.append("    <ip>" + MmsConfig.IP + "</ip>\r\n");
		taskxx.append("  </sender>\r\n");
		taskxx.append("  <reserved>保留字段</reserved>\r\n");
		taskxx.append("</psp_task>");
		return taskxx;
	}
	
	
	//发送成功之后如何处理数据
	public boolean successDone(List list) {
		return true;
	}
	
    //发送失败后需要如何处理数据
	public void failDone(List list) {
		int count  = channel.getSendFailCount().intValue();
		Connection conn = null;
		String update = "update nb_mms_push t set t.status = (case when send_count = " + count + " then 2 else 0 end) where t.id = ?  ";
		try {
			conn = DBCon.getShenYunDataSource().getConnection();
			conn.setAutoCommit(false);
			PreparedStatement ps = conn.prepareStatement(update);
			for (  int i = 0; i < list.size(); i++ ){
				ps.setLong(1, ( (MmsPush)list.get(i) ).getId() );
				ps.addBatch();
			}
			ps.executeBatch();
			conn.commit();
		} catch (SQLException e) {
			try{
				conn.rollback();
			}catch(SQLException se){
			}
			log.error("深运平台在设置nb_mms_push表发送失败状态的时候发生严重的错误",e);
		} finally {
			if(conn!=null){
				try {
					conn.close();
				} catch (SQLException e) {
				}
			}
		}
	}
	
	public void threadSleep(long msec) {
		try {
			Thread.sleep(msec);
		} catch (Exception e) {
		}
	}
}

⌨️ 快捷键说明

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