一、Quartz
1配置
<bean autowire="no"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="startupDelay" value="0"/>
<property name="triggers">
<list>
<!-- 定时任务列表 -->
<!-- 更新广告状态 -->
<ref bean="advertisementStatus"/>
</list>
</property>
</bean>
<!-- 调度功能描述:广告状态更新开始 -->
<bean id="advertisementStatus"
class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="advertisementStatusJobTask"/>
<!-- cron表达式 -->
<property name="cronExpression" value="${advertisementStatus.batch.time}"></property>
<!--<property name="cronExpression" value="0 */1 * * * ?"></property>-->
</bean>
<bean id="advertisementStatusJobTask"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="advertisementStatusTask"></property>
<property name="targetMethod" value="executeTask"></property>
<property name="concurrent" value="false"></property>
</bean>
<bean id="advertisementStatusTask" class="com.qujie.batch.quartz.QuartzTask">
<property name="batchTaskName" value="更新广告管理状态"/>
<!-- 定时任务列表 -->
<property name="taskList">
<list>
<ref bean="advertisementStatusJob"/><!--更新广告管理状态-->
</list>
</property>
<property name="executeMap">
<map>
<entry key="advertisementStatusJob" value="execute"/>
</map>
</property>
<!--成功代码 -->
<property name="codeSuccessVal" value="0000"/>
</bean>
<bean id="advertisementStatusJob" class="com.qujie.batch.job.AdvertisementStatusJob">
</bean>
<!-- 调度功能描述:广告状态更新结束 -->
2 代码
public class AdvertisementStatusJob {
private final static Logger log = LoggerFactory.getLogger(AdvertisementStatusJob.class);
@Autowired
private AdvertisementStatusService advertisementStatusService;
/**
* 定时任务执行
*
* @return
* @throws Exception
*/
public BatchResp execute() {
BatchResp resp = new BatchResp();
log.info("--------- 广告管理更新状态任务-----开始--------");
resp = advertisementStatusService.changStatus();
log.info("--------- 广告管理更新状态任务-----结束--------");
if (!StringUtils.equals("0000", resp.getReturnCode())) {
log.error("{},广告管理更新状态失败",DateUtil.today());
} else {
log.info("{},广告管理更新状态成功!", DateUtil.today());
}
return resp;
}
}
@Component
public class AdvertisementStatusService {
private Logger log = LoggerFactory.getLogger(AdvertisementStatusService.class);
@Autowired
private AdvertisementStatusDao advertisementStatusDao;
/**
* 广告管理更新状态
*
* @return
*/
public BatchResp changStatus() {
BatchResp resp = new BatchResp();
try {
//具体业务实现
//.....
resp.setReturnCode("0000");
resp.setReturnMsg("广告管理更新状态定时任务执行成功");
} catch (Exception e) {
log.error("广告管理更新状态定时任务执行失败{}", e);
resp.setReturnCode("0001");
resp.setReturnMsg("广告管理更新状态定时任务执行失败");
}
return resp;
}
}
Spring Task
@Configuration //1.主要用于标记配置类,兼备Component的效果。
@EnableScheduling // 2.开启定时任务
public class ScheduleTask {
public final static Logger logger = LoggerFactory.getLogger(ScheduleTask.class);
private String masterSecret = "c8fc9e276e1b50f691b3ff08";
private String appKey = "b7f4a42f6611dbb5e47747e5";
@Autowired
private BMarketMarketingTaskService marketMarketingTaskService;
@Autowired
private Config config;
@Autowired
private ShopDAO shopDAO;
@Autowired
private RedisUtil redisUtil;
/**
* 定时扫描自动生成日常营销任务
*/
@Scheduled(cron = "0 10 0 * * ? ")
private void addMarketDaily() {
boolean haskey = redisUtil.zAddNx("marketDailyFlag", "1", 0);
// 没有新增返回true,存在返回false
if(haskey){
logger.info("定时扫描自动生成日常营销任务开始执行==============");
QueryWrapper<MarketMarketingTask> marketingTaskQueryWrapper = new QueryWrapper<>();
marketingTaskQueryWrapper.eq("if_finish", 1);//已完成
marketingTaskQueryWrapper.eq("if_complaint", 0);//未投诉
marketingTaskQueryWrapper.eq("if_daily", 0);//未生成日常营销任务
marketingTaskQueryWrapper.eq("ifTransfer", 0);//现在权益人
List<MarketMarketingTask> marketingTaskList = marketMarketingTaskService.list(marketingTaskQueryWrapper);
List<MarketMarketingTask> dailyTaskList = new ArrayList<>();
List<MarketMarketingTask> comTaskList = new ArrayList<>();
marketingTaskList.stream().forEach(task -> {
MarketMarketingTask marketingTask = new MarketMarketingTask();
marketingTask.setShopid(task.getShopid());
//查询任务权益人是否是当前商户对应的权益人
Map<String, Object> map = shopDAO.queryDevelopidaftById(task.getShopid());
if (map!=null && map.get("developidaft")!=null){
marketingTask.setCustManagerId(Integer.valueOf(map.get("developidaft").toString()));
}else {
marketingTask.setCustManagerId(task.getCustManagerId());
}
marketingTask.setMarketingTaskType(2);
marketingTask.setTaskCreateDatetime(new Date());
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate ld = LocalDate.now().plusDays(1);
String timeStr = ld.format(df);
SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
marketingTask.setEffectiveStartDatetime(f.parse(timeStr + " 00:00:01"));
ld = LocalDate.now().plusDays(3000);
timeStr = ld.format(df);
marketingTask.setEffectiveEndDatetime(f.parse(timeStr + " 23:59:59"));
} catch (ParseException e) {
e.printStackTrace();
}
marketingTask.setCreateBy("system");
marketingTask.setIfTransfer(0);
dailyTaskList.add(marketingTask);
MarketMarketingTask comtask = new MarketMarketingTask();
comtask.setMarketingTaskId(task.getMarketingTaskId());
comtask.setIfDaily(1);
comTaskList.add(comtask);
});
if (!dailyTaskList.isEmpty()) {
marketMarketingTaskService.saveBatch(dailyTaskList);
}
if (!comTaskList.isEmpty()) {
marketMarketingTaskService.updateBatchById(comTaskList);
}
logger.info("定时扫描自动生成日常营销任务执行结束==============");
redisUtil.del("marketDailyFlag");
logger.info("删除redis中key:marketDailyFlag");
}
}
@Scheduled(cron = "0 48 17 * * ? ")
private void expiringMartingTask() {
boolean haskey = redisUtil.zAddNx("expiringMarketFlag", "1", 0); // 没有新增返回true,存在返回false
if(haskey){
//距离时效30小时时预警
logger.info("定时扫描银行客户经理营销任务距离时效30小时时预警==============");
QueryWrapper<MarketMarketingTask> marketingTaskQueryWrapper = new QueryWrapper<>();
marketingTaskQueryWrapper.eq("if_finish", 0);
//获取第二天晚上截止时间的数据进行
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String df = sdf.format(DateUtil.getDateByAddDays(1));
try {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Date newDate = format.parse(df+" 23:59:59");
marketingTaskQueryWrapper.eq("effective_end_datetime", newDate);
} catch (Exception e) {
logger.error("日期转换异常",e);
}
List<MarketMarketingTask> marketingTaskList = marketMarketingTaskService.list(marketingTaskQueryWrapper);
marketingTaskList.stream().forEach(task -> {
Map<String, Object> shopInfo = shopDAO.queryShopInfoById(task.getShopid());
// 极光推送app消息
//JPushClient jpushClient = new JPushClient(masterSecret, appKey);
ClientConfig conf = ClientConfig.getInstance();
conf.put("device.host.name", config.getDEVICE_HOST_NAME());
conf.put("push.host.name", config.getPUSH_HOST_NAME());
conf.put("report.host.name", config.getREPORT_HOST_NAME());
conf.put("schedule.host.name", config.getSCHEDULE_HOST_NAME());
if (config.getAPNS_PRODUCTION() != null) {
conf.put("apns.production", Integer.valueOf(config.getAPNS_PRODUCTION()));
}
JPushClient jpushClient = new JPushClient(masterSecret, appKey, null, conf);
List<String> tagList = new ArrayList<>();
tagList.add(task.getCustManagerId().toString());
String message = "您负责的【" + shopInfo.get("ShopName") + "】有营销任务需要在30小时内完成,请合理安排时间,及时完成任务";
int result = JPushUtil.sendToAliasList(jpushClient, tagList, message, "type", "", message);
logger.info("推送结果:" + result);
});
redisUtil.del("expiringMarketFlag");
logger.info("删除redis中key:expiringMarketFlag");
}
}
}