今天用DWR开发一个手工调度ETL的界面:遇到了由于ETL调度慢,而导致连接超时的问题;
解决方案:前台用DWR定时调度后台,而后台不是等到ETL实行完了才进行返回,而是开启一个线程的方式,让其在后台运行。
前台代码如下:
后台代码如下:
在service上声明一个静态变量:
解决方案:前台用DWR定时调度后台,而后台不是等到ETL实行完了才进行返回,而是开启一个线程的方式,让其在后台运行。
前台代码如下:
/**
* 执行ETL调度
*/
var execETL = function(){
//DWR调用
DbSyncService.execETLForOther(Ext.getCmp('month').getValue(true), function(d){
if(d == 'true'){
Ext.getBody().unmask();
Msg.alert('' + Ext.getCmp('month').getValue().format('Y年m月') +'ETL抽取成功' + ':<br><span style="color:red">' +
' (1)卷包生产模块及设备效能两个文档中所涉及的ETL;<br>' +
' (2)生产综合模块中四个ETL:<br>' +
' 6.1制造中心产量综合分析月报表DW_SUM_SCZH_OUTPUT_ZHFX_MT<br>' +
' 6.2制造中心卷烟价类结构对比分析月报表DW_SUM_SCZH_MANU_PRICE_DBFX_MT<br>' +
' 7.2.1卷包机组产能产量日报表DW_SUM_JBSC_JB_MACHSET_CNCL_DT<br>' +
' 7.2.2卷包班组台套产能产量日报表DW_SUM_JBSC_JBBZ_MSET_CNCL_DT<br>' +
' (3)计划调度模块中:2.5中烟计划管理----生产情况<br>' +
' </span>');
}else{
Ext.getBody().mask('正在' + Ext.getCmp('month').getValue().format('Y年m月') + 'ETL<span style="color:red">' + d + ' </span>数据...','x-mask-loading');
execETL.defer(3000);
}
})
}
//执行调度函数
execETL();
后台代码如下:
在service上声明一个静态变量:
/**
* 当前正在执行ETL相关信息
*/
public static String currentEtlInfo = "";
/**
* <p>方法名: execETLForOther</p>
* <p>描述: 其他模块的ETL抽取</p>
* @param month 月份
* @return
* @throws Exception
*/
public String execETLForOther(final String month)throws Exception{
//要执行的ETL数组
final String[][] etlNameArr=new String[][]{
/********************卷包生产模块所有ETL-Start******************************/
//机台上报
{"cn.com.widemex.dc.etl.jb.jtsb.DwTxJbscScjcxxDt-D",""}, //生产基础信息
{"cn.com.widemex.dc.etl.jb.jtsb.DwSumJbscJjclxhhzDt-D",""}, //卷接机产量消耗汇总表
{"cn.com.widemex.dc.etl.jb.jtsb.DwSumJbscBzclxhhzDt-D",""}, //包装机产量消耗汇总表
//机台生产日报
{"cn.com.widemex.dc.etl.jb.scrb.DwSumJbscJjbbDt-D","卷接生产日报表"}, // 卷接生产日报表
{"cn.com.widemex.dc.etl.jb.scrb.DwSumJbscPackingDt-D","包装生产日报表"}, // 包装生产日报表
{"cn.com.widemex.dc.etl.jb.scrb.DwSumJbscPackBrandDt-D","包装生产按牌号汇总日报表"}, // 包装生产按牌号汇总日报表
};
if("".equals(currentEtlInfo)){//如果当前ETL信息为空,则启动一个线程,在后台
//开启一个线程
new Thread(){
public void run() {
try {
for (String[] etlName : etlNameArr) {
//当前信息赋值给静态变量currentEtlInfo
currentEtlInfo = etlName[1];
//执行ETL
dbSyncDao.execETL(new String[]{etlName[0]} , month);
}
currentEtlInfo = "over";
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
//设置当前线程为第一个
currentEtlInfo = etlNameArr[0][1];
}else if("over".equals(currentEtlInfo)){ //如果执行完毕,则返回true
currentEtlInfo = ""; //指控当前ETL的信息
return "true";
}
return currentEtlInfo;
}