[求助,急]最近遇到的项目中job定时任务放在服务器上多次运行,次数不定

DaySurprise 2018-08-13 04:43:40
最近在写一个话单生成服务,主要的作用就是在每天凌晨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>

线上的运行结果:


...全文
512 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ade子夜 2019-12-03
  • 打赏
  • 举报
回复
仔细检查一下。
C_zm 2019-12-02
  • 打赏
  • 举报
回复
怎么样?解决了吗? 我线上的定时也是跑两次,其中一次的时间还是之前没修改的定时时间. 请问怎么解决的.
DaySurprise 2018-08-17
  • 打赏
  • 举报
回复
线上定时执行的,打印的没问题,就是执行了多遍,并且spring容器也只加载了一遍
BUG胡汉三 2018-08-14
  • 打赏
  • 举报
回复
感觉打印信息不太对啊~为什么你其他的打印没有出来呢?是手动去修改时间测试的吗?

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧