外汇交易中心,某版本需求变更:交易后将每天定时生成的全量黄金成交编号映射关系文件推送至金交所。
设计:
定时任务跑批实现。
1.根据传入的参数是否是给黄金交易所判断 isSFTP.传参, 以下方法组装Excel表头及内容列名、格式等 。
2.定义exportMappingFile(),使用JxlExcelUtil工具类,调用工具类dataToExcel()生成Excel文件。
定时任务设定。
<!-- 黄金询价成交映射关系表生成映射文件定时job -->
<bean id="goldDealCdMappingJob" class="com.cfets.ptrd.quartz.GoldDealCdMappingJob">
<property name="goldDealCdMappingService" ref="goldDealCdMappingService"></property>
</bean>
<bean id="goldDealCdMappingJobJobDetail"
class="com.cfets.framework.quartz.BeanInvokingJobDetailFactoryBean">
<property name="concurrent" value="false"></property>
<property name="targetBean" value="goldDealCdMappingJob"></property>
<property name="targetMethod" value="process"></property>
<property name="shouldRecover" value="false"></property>
</bean>
<bean id="goldDealCdMappingCronTriggerBean" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="goldDealCdMappingJobJobDetail"></property>
<property name="cronExpression">
<value>0 40 15 * * ?</value>
</property>
<property name="misfireInstruction" value="2"></property>
</bean>
生成文件关键代码
package com.running.tdd.util;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
public class FileUtil {
/**
* @param args
*/
public static void main(String[] args) {
String path = "c:\\Log";
List<File> list = getFileSort(path);
for (File file : list) {
System.out.println(file.getName() + " : " + new Date(file.lastModified()));
}
}
/**
*
* 获取目录下最新的文件
*
* @param realpath
* @param files
* @return
*/
public static File getLatestFile(String realpath) {
List<File> files = getFileSort(realpath);
if (files != null && files.size() > 0) {
return files.get(0);
}
return null;
}
/**
* 获取目录下所有文件(按时间排序)
*
* @param path
* @return
*/
public static List<File> getFileSort(String path) {
List<File> list = getFiles(path, new ArrayList<File>());
if (list != null && list.size() > 0) {
Collections.sort(list, new Comparator<File>() {
public int compare(File file, File newFile) {
if (file.lastModified() < newFile.lastModified()) {
return 1;
} else if (file.lastModified() == newFile.lastModified()) {
return 0;
} else {
return -1;
}
}
});
}
return list;
}
/**
*
* 获取目录下所有文件
*
* @param realpath
* @param files
* @return
*/
public static List<File> getFiles(String realpath, List<File> files) {
File realFile = new File(realpath);
if (realFile.isDirectory()) {
File[] subfiles = realFile.listFiles();
for (File file : subfiles) {
if (file.isDirectory()) {
getFiles(file.getAbsolutePath(), files);
} else {
files.add(file);
}
}
}
return files;
}
}
public static File[] searchFile(File folder, final String keyWord) {// 递归查找包含关键字的文件
File[] subFolders = folder.listFiles(new FileFilter() {// 运用内部匿名类获得文件
@Override
public boolean accept(File pathname) {// 实现FileFilter类的accept方法
if (pathname.isDirectory()
|| (pathname.isFile() && pathname.getName().toLowerCase().contains(keyWord.toLowerCase())))// 目录或文件包含关键字
{ return true; }
else {
return false;
}
}
});
List<File> result = new ArrayList<File>();// 声明一个集合
for (int i = 0; i < subFolders.length; i++) {// 循环显示文件夹或文件
if (subFolders[i].isFile()) {// 如果是文件则将文件添加到结果列表中
result.add(subFolders[i]);
} else {// 如果是文件夹,则递归调用本方法,然后把所有的文件加到结果列表中
File[] foldResult = searchFile(subFolders[i], keyWord);
for (int j = 0; j < foldResult.length; j++) {// 循环显示文件
result.add(foldResult[j]);// 文件保存到集合中
}
}
实现类
public class GoldDlCdMappingServiceImpl extends CommonBaseAction implements
IGoldDlCdMappingService {
private BaseDAO dao;
private static final Log log = LogFactory
.getLog(GoldDlCdMappingServiceImpl.class);
private final static String SGEDLCD_START = "5.1.";
/**
* Function Name: exportMappingFile
*
* @param list
* @param orgId
* 6位码
* @param isSFTP
*/
public void exportMappingFile(List<GoldDealCdMappingVO> list, String orgId,
boolean isSFTP) throws ServiceException {
String fileName = " ";
ArrayList<String> fieldArr = new ArrayList<String>();
ArrayList<String> colName = new ArrayList<String>();
String orgCd = (orgId == null) ? "" : translateOrgId(Long
.parseLong(orgId));// 根据6位码获取4位码
if (list != null) {
try {
int totalSize = list.size();
int sheetNum = totalSize / 50000;
fileName = getGoldDlCdMappingFileName(orgCd, isSFTP);
if (!isSFTP) {
// excel表头信息 ----20180108 dongyibo start up 根据传过来的orgId判断
// tk方是否为本方 如果不是则将mk与tk互换
if (StringUtil.isBlank(orgId)) {
// 字段名称
fieldArr = new ArrayList<String>() {
private static final long serialVersionUID = 1L;
{
add("dlDt");
add("dlTmst");
add("tktCd");
add("mkCd");
add("dlCd");
add("sgeDlCd");
}
};
colName = new ArrayList<String>() {
private static final long serialVersionUID = 1L;
{
// 成交日期 成交时间 本方机构代码 对手方机构代码 交易中心格式的成交编号
// 金交所格式的成交编号
add("成交日期");
add("成交时间");
add("发起方机构四位码");
add("报价方机构四位码");
add("交易中心格式的成交编号");
add("金交所格式的成交编号");
}
};
} else {
for (GoldDealCdMappingVO vo : list) {
if (!orgId.equals(vo.getTkrId())) {
vo.setLocalCd(vo.getMkCd());
vo.setOppCd(vo.getTktCd());
} else {
vo.setLocalCd(vo.getTktCd());
vo.setOppCd(vo.getMkCd());
}
}
// 字段名称
fieldArr = new ArrayList<String>() {
private static final long serialVersionUID = 1L;
{
add("dlDt");
add("dlTmst");
add("localCd");
add("oppCd");
add("dlCd");
add("sgeDlCd");
}
};
colName = new ArrayList<String>() {
private static final long serialVersionUID = 1L;
{
// 成交日期 成交时间 本方机构代码 对手方机构代码 交易中心格式的成交编号
// 金交所格式的成交编号
add("成交日期");
add("成交时间");
add("本方机构代码");
add("对手方机构代码");
add("交易中心格式的成交编号");
add("金交所格式的成交编号");
}
};
}
// excel表头信息 ----20180108 dongyibo end up 根据传过来的orgId判断
// tk方是否为本方 如果不是则将mk与tk互换
} else {
// fileName = downFileAbsPath("SGE");
/*
* String absolutePath = new
* File(fileName).getAbsolutePath();
* System.out.println(absolutePath);
*/
fieldArr = new ArrayList<String>() {
private static final long serialVersionUID = 1L;
{
add("dlCd");
add("sgeDlCd");
}
};
// excel表头信息
colName = new ArrayList<String>() {
private static final long serialVersionUID = 1L;
{
// 交易中心格式的成交编号 金交所格式的成交编号
add("交易中心格式的成交编号");
add("金交所格式的成交编号");
}
};
}
// 宽度
int[] widthArr = new int[fieldArr.size()];
for (int i = 0; i < widthArr.length; i++) {
widthArr[i] = 30;
}
JxlExcelUtil excelOp = new JxlExcelUtil(new FileOutputStream(
fileName));
for (int i = 0; i <= sheetNum; i++) {
ArrayList<GoldDealCdMappingVO> list2 = new ArrayList<GoldDealCdMappingVO>();
// 一个sheet页50000条,每个Sheet起始值
int j = i * 50000;
for (; j >= i * 50000 && j < (i + 1) * 50000; j++) {
if (list.size() > j) {
list2.add(list.get(j));
} else {
break;
}
}
excelOp.dataToExcel(list2,
fieldArr.toArray(new String[fieldArr.size()]),
null, colName.toArray(new String[colName.size()]),
widthArr, "sheet" + (i + 1));
}
excelOp.getWorkbook().write();
excelOp.close();
} catch (Exception e) {
log.error(e);
e.getMessage();
}
} else {
log.info("no dlcd mappings generated for " + orgId);
}
}
文件名定义
private String getGoldDlCdMappingFileName(String orgId, boolean isSFTP) {
String fileName;
File retPath = new File(AppStorageUtil.getSharedStorage(),
"GoldDlCdMapping");
if (!retPath.exists()) {
retPath.mkdirs();
}
String separator = File.separator;
if (isSFTP) {
fileName = retPath.getAbsolutePath()+separator
+ "黄金成交编号映射表_SGE_"
+ DateUtil.getDateString(DateUtil.getCurrentDate(),
"yyyyMMdd") + ".xls";
} else if (StringUtils.isBlank(orgId)) {
fileName = retPath.getAbsolutePath()+separator
+ "黄金成交编号映射表_"
+ DateUtil.getDateString(DateUtil.getCurrentDate(),
"yyyyMMdd") + ".xls";
} else {
fileName = retPath.getAbsolutePath()+separator
+ "黄金成交编号映射表_"
+ orgId.trim()
+ "_"
+ DateUtil.getDateString(DateUtil.getCurrentDate(),
"yyyyMMdd") + ".xls";
}
log.info("getGoldDlCdMappingFileName " + fileName);
return fileName;
}
正则匹配文件名
/*
* @param orgid 机构4位码
*
* @see
* com.cfets.ptrd.services.cw.IGoldDlCdMappingService#downFileAbsPath(java
* .lang.String)
*/
@Override
public String downFileAbsPath(String orgId) throws ServiceException {
try {
File retPath = new File(AppStorageUtil.getSharedStorage(),
"GoldDlCdMapping");
if (!retPath.exists())
retPath.mkdirs();
File latestFile = null;
final String regex = "黄金成交编号映射表_" + orgId + "_[0-9]{8}";// 会员映射文件及推送金交所映射文件正则表达式
final String regex_cw = "黄金成交编号映射表_[0-9]{8}";// 场务映射文件正则表达式
// 获得会员最新下载文件
if (!StringUtil.isBlank(orgId) && !("CW").equals(orgId)) {
latestFile = FileUtil.getLatestFileByPattern(retPath, regex);
} else {
// 获得场务最新下载文件
latestFile = FileUtil.getLatestFileByPattern(retPath, regex_cw);
}
if (latestFile != null) {
log.info("the latest file for [" + orgId + "] is "
+ latestFile.getAbsolutePath());
return latestFile.getAbsolutePath();
} else {
throw new ServiceException("E-0502");
}
} catch (Exception e) {
log.error("", e);
throw new ServiceException(e.getMessage());
}
}