最近在写一个话单生成服务,主要的作用就是在每天凌晨0点的时候,从一个表中将昨天的通话记录查询出来,放在一个表里面,然后通知另一个服务进行下载入库!
项目最主要的就是一个job和一些主动触发job的接口。框架结构SpringMvc+Spring+JdbcTemplate ;
主要使用spring注解的方式进行bean的初始化和注入,job类写法如下:
@Service
public class SdrJob {
@Resource(name="sdrHelpServiceImpl")
private SdrHelpService sdrHelpService;
private final Logger logger = Log4jUtil.getSdrLog();
@Scheduled(cron="0 0 0 * * ?")
protected void excuteBillCreate() {
//查询数据库获取话单,并且将话单存放在CSV文件中,并且通知下载服务下载!
logger.debug("===========================账单csv文件生成开始==========================");
/** 1. 基础数据获取*/
String bossAddress = PropertiesTools.getPropertyValue("boss_address");
logger.debug("会员系统地址:"+bossAddress);
String inDbAddress = PropertiesTools.getPropertyValue("indb_service_address");
logger.debug("入库服务地址:"+inDbAddress);
String nodeName = PropertiesTools.getPropertyValue("node_name");
logger.debug("本计费节点:"+nodeName);
String dataBaseType = PropertiesTools.getPropertyValue("database_type");
logger.debug("数据库类型:"+dataBaseType);
//该节点下所有企业
List<UserEnts> callInUserEnts = sdrHelpService.get400UserEntsList(bossAddress,nodeName);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date preDay = DateFormatUtil.getPreDay(new Date());
String preDate = sdf.format(preDay);
/** 2. 根据数据库模式加载csv文件 */
Map<String, String> resultMap = new HashMap<>();
if("oracle".equals(dataBaseType)){
resultMap = sdrHelpService.createCsvAndNoticeOracle(callInUserEnts,preDate,nodeName,inDbAddress);
}else if ("mysql".equals(dataBaseType)){
resultMap = sdrHelpService.createCsvAndNoticeMysql(callInUserEnts,preDate,nodeName,inDbAddress);
}else{
logger.debug("=============抱歉:没有获取到数据库类型,本次SDR服务到此结束!==========");
}
/** 3. 通知入库系统下载 */
String result = sdrHelpService.noticeInDb(inDbAddress,nodeName,resultMap.get("callOutFilePath"),resultMap.get("callInFilePath"),preDate);
if(!"".equals(result)){
JSONObject fromObject = JSONObject.fromObject(result);
if("0".equals(fromObject.getString("status"))){
logger.warn("通知入库出现异常,异常原因:"+fromObject.getString("message"));
}else if("1".equals(fromObject.getString("status"))){
logger.debug("通知入库成功:"+fromObject.getString("message"));
}
}
logger.debug("===========================账单csv文件生成结束==========================");
} catch (Exception e) {
logger.debug("账单csv文件生成时,发生异常!!!");
e.printStackTrace();
}
}
}
大致写法就是上面的,applicationContext.xml配置也加上了task注解驱动:
<!-- task任务调度注解 -->
<task:annotation-driven/>
web服务容器选用的resin工具;resin开启了自动检测:
<dependency-check-interval>${dependency_check_interval?:'2s'}</dependency-check-interval>
线上的运行结果: