话不多说,直接看代码,注解已经描述很清晰。
package achun.spring.assist.config;
import achun.spring.assist.dto.AchunDes;
import achun.spring.assist.dto.IConst;
import achun.spring.assist.source.PropertyUtil;
import achun.spring.assist.source.StrUtil;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
@AchunDes("@async异步注解多线程配置(开关)")
public class ScheduleConfigCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
boolean b = false;
String type = PropertyUtil.getStringConfig(IConst.项目插件);
if(StrUtil.isNotBlankOrNull(type)){
for(String s:type.split("@@")){
if("schedule".equalsIgnoreCase(s)){
b = true;
break;
}
}
}
return b;
}
}
package achun.spring.assist.config;
import achun.spring.assist.dto.AchunDes;
import achun.spring.assist.source.ThreadUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
@AchunDes("@async异步注解多线程配置")
@Conditional(value=ScheduleConfigCondition.class)
@Configuration
@EnableAsync
public class ScheduleConfig implements SchedulingConfigurer {
private static final Logger logger = LoggerFactory.getLogger("AChunLog");
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setScheduler(ThreadUtil.getSchedule(10));
logger.info("==========@@@ ScheduleConfig start successfully @@@==========");
}
}
注:如下方式会使@Async失效
1、异步方法使用static修饰 2、异步类没有使用@Component注解(或其他注解)导致spring无法扫描到异步类 3、异步方法不能与异步方法在同一个类中 4、类中需要使用@Autowired或@Resource等注解自动注入,不能自己手动new对象 5、如果使用SpringBoot框架必须在启动类中增加@EnableAsync注解 6、在Async 方法上标注@Transactional是没用的。 在Async 方法调用的方法上标注@Transactional 有效。 7、调用被@Async标记的方法的调用者不能和被调用的方法在同一类中不然不会起作用!!!!!!! 8、使用@Async时要求是不能有返回值的不然会报错的 因为异步要求是不关心结果的