我有我的标准Spring Boot应用程序。在某些情况下,我想运行“作业”,这基本上是一些特定的方法,通常是通过用户在浏览器中执行某些操作来运行的,但我想从命令行运行它。
我可以使用gradlew运行任意类;
./gradlew -PmainClass=kcentral.backingservices.URLMetaExtractor execute
但是,以这种方式运行时,“自动装配”均无效。有什么更好的方法来执行任意类(具有main方法),使其也可以与任何Autowiring一起使用?
编辑:
我建议使用CommandLineRunner和一些arg,它们可以通过以下方式执行命令:
./gradlew bootRun -Pargs=--reloadTestData
但是,我的Repo的自动装配失败。我所拥有的是:
@EnableAutoConfiguration
@EnableMongoAuditing
@EnableMongoRepositories(basePackageClasses=KCItemRepo.class)
@ComponentScan(basePackages = {"kcentral"})
public class ReloadTestData implements CommandLineRunner {
@Autowired
AddItemService addItemService;
@Autowired
KCItemRepo itemRepo;
@Autowired
KCItemRatingRepo itemRatingRepo;
private static final Logger log = LoggerFactory.getLogger(ReloadTestData.class);
public void reloadData(){
log.info("reloadData and called");
if (itemRepo == null){
log.error("Repo not found");
return;
}
long c = itemRepo.count();
log.warn("REMOVING ALL items "+c);
itemRepo.deleteAll();
log.warn("REMOVING ALL ratings");
itemRatingRepo.deleteAll();
}
itemRepo始终为null,即使我在“常规”春季启动应用中以相同方式进行接线也没有问题。我该怎么做才能正确接线?
答案 0 :(得分:1)
您说要运行“作业”的事实表明您可能希望在应用程序中使用计划任务,而不是尝试通过命令行运行它。例如Scheduling tasks in Spring
@Scheduled(fixedRate = 5000)
public void reportCurrentTime() {
log.info("The time is now {}", dateFormat.format(new Date()));
}
如果您想使命令行应用程序与自动装配一起使用,可以通过使Application类实现CommandLineRunner
接口(例如Spring Boot Console App
@SpringBootApplication
public class SpringBootConsoleApplication
implements CommandLineRunner {
public static void main(String[] args) {
SpringApplication.run(SpringBootConsoleApplication.class, args);
}
@Override
public void run(String... args) {
}
}
并将spring.main.web-application-type=NONE
添加到属性文件。