我有一个带有这个注释的Java配置:
@EnableAsync
@EnableCaching
@Configuration
@EnableScheduling
@ComponentScan("XXX")
public class AppConfig implements AsyncConfigurer {
...
@Override
public Executor getAsyncExecutor() {
SimpleAsyncTaskExecutor executor = new SimpleAsyncTaskExecutor("Rm-");
executor.setConcurrencyLimit(50);
executor.setThreadPriority(Thread.MAX_PRIORITY);
return executor;
}
}
然后我有3个调度程序
/**
* Schedul on application start.
*/
@Transactional
@Scheduled(fixedDelay = Long.MAX_VALUE, initialDelay = 200)
public void initialReplicate() {
replicateFromTime(0l);
}
/**
* Every minute check for synchronization.
*/
@Transactional
@Scheduled(cron = "0 * * * * * ")
public void replicate() {
long minutesSinceTimeRecord = System.currentTimeMillis() / 1000 / 60;
replicateFromTime(minutesSinceTimeRecord);
}
@Transactional
@Scheduled(fixedDelay = 1000)
public void build() {
LOG.info("Check if somethings to build.");
}
复制时间的作用:
它计算一天是否结束,如果是,它每天复制一次(并在appstart一次)数据库的模式。 对于数据库中的每个表,都会创建一个连接。
@Async
@Transactional
public Future<Void> readTable(TableModel table, String jdbcurl, Driver driver, Properties props, String schema,
Set<Throwable> errors, String catalogName) {
Connection connect = connectionService.connect(jdbcurl, errors, driver, props);
final DatabaseMetaData metadata;
try {
metadata = connect.getMetaData();
} catch (SQLException e) {
errors.add(e);
try {
connect.close();
} catch (SQLException e2) {
errors.add(e2);
}
return new AsyncResult<Void>(null);
}
...
数据库中有804个表(视图,表,临时表,......)。对于每个表,创建一个连接。制作804个帖子。
数据库作为应用程序在机器上。我从localhost测试。
在远程服务器上,在appstart上它成功复制。但除了public void build()
- 调度程序之外,不再执行任何其他调度程序。但只有48次(参见配置中50个线程的限制)。
从本地服务器,在appstart上它成功复制。所有3个调度程序都按预期工作。
服务器上的tomcat应该运行所有调度程序,但它只运行一个。我本地计算机上的tomcat运行所有调度程序。
我希望在本地环境中遇到更多问题,连接到远程服务器而不是远程服务器本身。
任何想法为什么远程服务器有问题,但我的本地机器没有?
apache-tomcat-8.5.27
。apache-tomcat-8.5.15
。