Local vs Live - 使用SimpleAsyncTaskExecutor

时间:2018-03-21 09:39:37

标签: spring multithreading tomcat job-scheduling

我有一个带有这个注释的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
  • 复制架构的数据库是一个postgres。

0 个答案:

没有答案