Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我的计划作业不能并行执行_Java_Hibernate_Spring Boot_Spring Transactions_Spring Scheduled - Fatal编程技术网

Java 为什么我的计划作业不能并行执行

Java 为什么我的计划作业不能并行执行,java,hibernate,spring-boot,spring-transactions,spring-scheduled,Java,Hibernate,Spring Boot,Spring Transactions,Spring Scheduled,我试图弄明白为什么我的计划作业不能并行执行。也许我的交易管理有问题?方法JobScheduledExecutionService.execute是@Scheduled,fixedRate=250,因此无论上一个作业是否完成,都应该每250ms触发一次。由于日志原因,它无法按预期工作 日志: 我的代码如下 @Service @Slf4j public class JobExecutionService { private final TransactionalJobExecutionSe

我试图弄明白为什么我的计划作业不能并行执行。也许我的交易管理有问题?方法JobScheduledExecutionService.execute是@Scheduled,fixedRate=250,因此无论上一个作业是否完成,都应该每250ms触发一次。由于日志原因,它无法按预期工作

日志:

我的代码如下

@Service
@Slf4j
public class JobExecutionService {

    private final TransactionalJobExecutionService transactionalJobExecutionService;

    @Autowired
    public JobExecutionService(TransactionalJobExecutionService transactionalJobExecutionService) {
        this.transactionalJobExecutionService = transactionalJobExecutionService;
    }

    public void execute() {
        TestJob job = transactionalJobExecutionService.getJob();
        executeJob(job);
        transactionalJobExecutionService.finishJob(job);
    }

    private void executeJob(TestJob testJob) {
        log.debug("Execution-0: {}", testJob.toString());
        Random random = new Random();
        try {
            Thread.sleep(random.nextInt(3000) + 200);
        } catch (InterruptedException e) {
            log.error("Error", e);
        }
        log.debug("Execution-1: {}", testJob.toString());
    }

}

@Service
@Slf4j
public class JobScheduledExecutionService {

    private final JobExecutionService jobExecutionService;

    @Autowired
    public JobScheduledExecutionService(JobExecutionService jobExecutionService) {
        this.jobExecutionService = jobExecutionService;
    }

    @Scheduled(fixedRate = 250)
    public void execute() {
        log.trace("Job fired");
        jobExecutionService.execute();
    }

}

@Service
@Slf4j
@Transactional
public class TransactionalJobExecutionService {

    private final Environment environment;
    private final TestJobRepository testJobRepository;
    private final TestJobResultRepository testJobResultRepository;

    @Autowired
    public TransactionalJobExecutionService(Environment environment, TestJobRepository testJobRepository, TestJobResultRepository testJobResultRepository) {
        this.environment = environment;
        this.testJobRepository = testJobRepository;
        this.testJobResultRepository = testJobResultRepository;
    }

    public TestJob getJob() {
        TestJob testJob = testJobRepository.findFirstByStatusOrderByIdAsc(
                0
        );
        testJob.setStatus(1);
        testJobRepository.save(testJob);
        return testJob;
    }

    public void finishJob(TestJob testJob) {
        testJobResultRepository.save(
                new TestJobResult(
                        null,
                        testJob.getId(),
                        environment.getProperty("local.server.port")
                )
        );
    }

}

@Configuration
public class SchedulingConfigurerConfiguration implements SchedulingConfigurer {

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
        taskScheduler.setPoolSize(32);
        taskScheduler.initialize();
        taskRegistrar.setTaskScheduler(taskScheduler);
    }

}

原因是调度器将只触发一个事件,该事件将由一个线程执行,然后我看不到您在逻辑中生成多个线程来并行执行。调用jobExecutionService.execute;JobScheduledExecutionService的执行在该线程中。所以总的来说,它最终是顺序执行

似乎您需要将多线程[Callable Future based]逻辑放入JobExecutionService:execute以拾取作业[transactionalJobExecutionService.getJob],并在其中调用executeJob。希望这有帮助