2016-12-27 2 views
0

В ответе за Configuring Spring Batch Steps in Parallel (Split) using Annotations приведен пример (FlowJobBuilderTests.java).Весенняя партия загрузки: производительность процессора оптимизирована Пример

Вопрос: этот ответ действительно подходит для оптимизации производительности? (У меня есть некоторые длительные задачи по потреблению ЦП для выполнения и нужно использовать доступные процессоры оптимизированным образом)

ответ

0

Использование

 Thread thread = Thread.currentThread(); 
     System.out.println(thread); 

в ступеньках показывает, что пример действительно использует потоки. Поэтому пример подходит.

Другой хороший пример, который использует различные темы, это:

https://examples.javacodegeeks.com/enterprise-java/spring/batch/spring-batch-multithreading-example/ Ашрафа Сархан.

0

Пример: вы указываете на использование SimpleAsyncTaskExecutor.

Javadocs:

Примечание: Эта реализация не использует повторно темы! Вместо этого рассмотрите реализацию TaskExecutor для объединения потоков, в частности для выполнения большого количества краткосрочных задач.

Поэтому, чтобы повысить эффективность использования вашего ЦП, я предпочел бы использовать ThreadPoolTaskExecutor or ConcurrentTaskExecutor.

Поскольку ваши задачи связаны с процессором, я бы установил размер пула потоков на количество ядер ЦП на машине, в котором он будет работать. Чтобы ваши циклы процессора не пропадали даром при переключении потоков.

(Имея больший размер пула потоков будет лучшим выбором для IO ограничивающей задач, так что процессор не будет ждать операции ввода-вывода)

Реакции на комментарии:

Теперь я лучше понимаю ваши проблемы , Да, вы можете запускать шаги параллельно. Вот example from my book about enterprise Spring:

@Bean 
    public Job prepareTeaJob(JobBuilderFactory jobBuilderFactory, 
     @Qualifier("boilWaterStep") Step boilWaterStep, 
     @Qualifier("addTeaStep") Step addTeaStep, 
     @Qualifier("addSugarStep") Step addSugarStep, 
     @Qualifier("addWaterStep") Step addWaterStep, 
     TaskExecutor customTaskExecutor) { 
    Job job = jobBuilderFactory.get("prepareTeaJob") 
     .start(boilWaterStep) 
     .split(customTaskExecutor) 
     .add(new FlowBuilder<Flow>("addIngredientsSplit") 
      .from(boilWaterStep).next(addTeaStep) 
      .from(boilWaterStep).next(addSugarStep) 
      .end()) 
     .next(addWaterStep) 
     .end() 
     .build(); 
    return job; 
    } 
} 

Из этого примера addTeaStep и addSugarStep будут выполняться параллельно, сразу после boilWaterStep.

+0

Спасибо. Но если я правильно понимаю пример, данный @Michael Minella, также SimpleAsyncTaskExecutor запускает новый поток, и поэтому все шаги будут выполняться параллельно. Или я ошибаюсь? – user2145488

+0

Я обновил свой ответ. – luboskrnac

+0

@luboskmac, к сожалению, с вашим решением, 'Thread thread = Thread.currentThread();' 'System.out.println (thread);' просто показывает один поток. Будет ли это действительно использовать процессоры оптимизированным образом? – user2145488

Смежные вопросы