使用写死服务器Host(srv23)的方式,控制只在一台服务器上执行task
public abstract class SingletonServerTaskScanner implements TaskScanner {
private final Logger logger = LoggerFactory.getLogger(SingletonServerTaskScanner.class);
@Override
public void execute() {
String hostname = "";
try {
hostname = InetAddress.getLocalHost().getHostName();
} catch (UnknownHostException e) {
logger.error(e.getMessage(), e);
}
//判断是否为当前可执行服务器
if (ConfigUtil.getValueByKey("core.scan.server").equals(hostname)) {
doScan();
}
}
public abstract void doScan();
}
//对于srv23的重启,保存在内存中的任务将丢失,每次重启srv23重新生成定时任务
public class CrmInitializer implements InitializingBean {
private Logger logger = LoggerFactory.getLogger(CrmInitializer.class);
@Override
public void afterPropertiesSet() throws Exception {
// 扫描商家状态,创建定时任务
logger.info("扫描商家状态,创建定时任务");
accountStatusTaskScanner.execute();
// 扫描N天未拜访商家,创建定时任务
logger.info("扫描N天未拜访商家,创建定时任务");
nDaysActivityScanner.execute();
}
}
//通过调用srv23的特定URL的方式,动态指定任务(如取消N天未拜访,私海进保护期,保护期进公海等)
public class SingletonServerTaskController {
@Resource
private AccountService accountService;
@RequestMapping(value = "/reschedule")
public @ResponseBody
String checkAndRescheduleAccount(Integer accountId) {
logger.debug("reschedule task for accountId:" + accountId);
if (isCurrentServer()) {
accountService.checkAndRescheduleAccount(Arrays.asList(accountId));
}
return "ok";
}
private boolean isCurrentServer() {
String hostname = "";
try {
hostname = InetAddress.getLocalHost().getHostName();
} catch (UnknownHostException e) {
logger.error(e.getMessage(), e);
}
if (ConfigUtil.getValueByKey("core.scan.server").equals(hostname)) {
return true;
} else {
return false;
}
}
}
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-29777-2.html
性