我有一个Spring应用程序,该应用程序创建一个计划和运行Runnable的任务:
主要:
@SpringBootApplication
@Slf4j
@Configuration
@EnableEncryptableProperties
@EnableJpaAuditing
public class Main {
@Autowired
CoinListerTask coinListerTask;
public static void main(String[] args) {
SpringApplication.run(Main.class, args);
}
@Component
public class CommandLineAppStartupRunner implements CommandLineRunner {
@Override
public void run(String...args) throws Exception {
...
// start coin listing job
coinListerTask.startup();
任务:
@Component
public class CoinListerTask {
private TimeUnit timeUnit = TimeUnit.SECONDS;
private String threadName = "coin-lister";
@Value("${coindatabase.coinlister.initialDelay}")
private long initalDelay;
@Value("${coindatabase.coinlister.period}")
private long period;
private String exchangeNameString = "Cryptopia";
@Autowired
private IDataService dataService;
@Autowired
CoinDbService dbService;
public void startup() {
ScheduledExecutorService executorService = new WrappedScheduledExecutor(threadName, 1, false);
executorService.scheduleAtFixedRate(runnableTask, initalDelay, period, timeUnit);
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
Shutdown.runner(executorService, threadName, 60L);
}
});
}
Runnable runnableTask = () -> {
// do stuff...
}
这按原样可以正常工作,但是我现在想将其概括化,这样我就可以运行任务的多个实例,这些实例具有通过application.properties指定的不同参数集来替换当前自动装配的变量。
我应该删除@Component并将所有内容传递给使用new创建的实例,还是有一种更好的,更适合春季的方法来实现这一点?
解决方案
要扩展Lino和Visal的解决方案,请执行以下操作:
添加到组件: @Scope(“ prototype”)
将组件的@Autowire替换为: @Autowired 提供者coinListerTaskProvider;
将任务的调用更改为: coinListerTaskProvider.get()。startup();
可以通过添加javax / javaee-api / 6.0来使用提供程序
答案 0 :(得分:1)
如果您想在每次调用时创建一个新实例,请将Scope注释与组件,服务,控制器,存储库等配合使用:-
@Component
@Scope("prototype")
原型定义作用域的地方,即每次调用时总是给出一个新实例。
请参见范围的javadoc