一、简介
@Conditional
来源于spring-context
包下的一个注解。Conditional中文是条件的意思,@Conditional注解它的作用是按照一定的条件进行判断,满足条件给容器注册bean。
二、自定义自己的条件
需求:集群机器有多台,写了一个定时任务,定时任务只能一台机器跑,其他机器不需要跑这个task,那么这个时候通过配置文件,实现这个接口即可达到要求
@Slf4j
public class TxnTaskCondition implements Condition {
private static final String SERVICE_IP = ConfigReader.getDefaultConfig("txn-service-num");
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
log.info("当前机器编号:{}",SERVICE_IP);
boolean openTask = Arrays.asList("1-1").contains(SERVICE_IP);
log.info("该台机器是否启动task:{}",openTask);
return openTask;
}
}
三、如何使用
将自己定义的注解放到@service 或者 @Configuration 上即可生效
@Conditional(TxnTaskCondition.class)
@Configuration
@EnableScheduling
@Slf4j
public class TxnCheckService {
@Resource
private ITxnHeartbeatRpc txnQryService;
//private static final String HOME_DIR = ConfigReader.getDefaultConfig("home_dir");
/**
* 定时检测心跳结果 ,防止死机
*/
@Scheduled(cron = "1 0/1 * * * ?")
public void checkTxnHeartbeat() {
FileWriter fileWriter = null;
try {
//String homeDirectory = System.getProperty("user.home") + File.separator + "tmp" + File.separator;
File file = new File("/tmp/txn.txt");
// 检测文件是否存在
checkFileExist(file);
fileWriter = new FileWriter(file);
try {
TxnRpcRes<String> state = txnQryService.getState();
log.info("check result :{}", JSONObject.toJSONString(state));
fileWriter.write("I am OK.");
fileWriter.flush();
} catch (Exception e) {
log.error("error ",e);
fileWriter.write("超时了 ---- ");
fileWriter.flush();
}
} catch (IOException e) {
log.error("txn 文件写出失败",e);
StreamUtils.closeStream(fileWriter);
}
}