Skip to content

Commit 08116e8

Browse files
committed
Added mutexes to the process initiators [#2455]
* Changed processComicBooks => loadComicBooks
1 parent 0de2db7 commit 08116e8

File tree

26 files changed

+265
-238
lines changed

26 files changed

+265
-238
lines changed

CONFIGURATION.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ needs of the server administrator.
1919
| comixed.batch.update-comic-metadata.chunk-size | The number of comics to process at a time | Count |
2020
| comixed.batch.add-cover-to-image-cache.schedule | The schedule for caching cover images | Schedule |
2121
| comixed.batch.add-cover-to-image-cache.chunk-size | The number of pages to process at a time | Count |
22-
| comixed.batch.process-comic-books.period | The time between checking for comics to process | Delay |
23-
| comixed.batch.process-comic-books.chunk-size | The number of comics to process at a time | Count |
22+
| comixed.batch.load-comic-books.period | The time between checking for comics to process | Delay |
23+
| comixed.batch.load-comic-books.chunk-size | The number of comics to process at a time | Count |
2424
| comixed.batch.load-page-hashes.period | The time between checking for comics to process | Delay |
2525
| comixed.batch.load-page-hashes.chunk-size | The number of comics to process at a time | Count |
2626
| comixed.batch.mark-blocked-pages.period | The time between checking for pages to process | Delay |

comixed-app/src/main/resources/comixed-core.properties

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,8 @@ comixed.batch.recreate-comic-files.chunk-size=1
5757
comixed.batch.update-comic-metadata.chunk-size=1
5858
comixed.batch.add-cover-to-image-cache.schedule=0 0 * * * *
5959
comixed.batch.add-cover-to-image-cache.chunk-size=1
60-
comixed.batch.process-comic-books.period=60000
61-
comixed.batch.process-comic-books.chunk-size=10
60+
comixed.batch.load-comic-books.period=60000
61+
comixed.batch.load-comic-books.chunk-size=10
6262
comixed.batch.load-page-hashes.period=60000
6363
comixed.batch.load-page-hashes.chunk-size=1
6464
comixed.batch.mark-blocked-pages.period=60000

comixed-batch/src/main/java/org/comixedproject/batch/BatchConfiguration.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -93,17 +93,17 @@ public JobLauncher batchJobLauncher(
9393
* Returns the step that launches the processing batch job.
9494
*
9595
* @param jobRepository the step factory
96-
* @param processComicBooksJob the job
96+
* @param loadComicBooksJob the job
9797
* @param jobLauncher the job launcher
9898
* @return the step the step
9999
*/
100-
@Bean(name = "processComicBooksJobStep")
101-
public Step processComicBooksJobStep(
100+
@Bean(name = "loadComicBooksStep")
101+
public Step loadComicBooksStep(
102102
final JobRepository jobRepository,
103-
final @Qualifier("processComicBooksJob") Job processComicBooksJob,
103+
final @Qualifier("loadComicBooksJob") Job loadComicBooksJob,
104104
final @Qualifier("batchJobLauncher") JobLauncher jobLauncher) {
105-
return new StepBuilder("processComicBooksJobStep", jobRepository)
106-
.job(processComicBooksJob)
105+
return new StepBuilder("loadComicBooksStep", jobRepository)
106+
.job(loadComicBooksJob)
107107
.parametersExtractor(new DefaultJobParametersExtractor())
108108
.launcher(jobLauncher)
109109
.build();

comixed-batch/src/main/java/org/comixedproject/batch/comicbooks/ProcessComicBooksConfiguration.java renamed to comixed-batch/src/main/java/org/comixedproject/batch/comicbooks/LoadComicBooksConfiguration.java

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -37,18 +37,17 @@
3737
import org.springframework.transaction.PlatformTransactionManager;
3838

3939
/**
40-
* <code>ProcessComicBooksConfiguration</code> defines the batch process for importing comics.
40+
* <code>LoadComicBooksConfiguration</code> defines the batch process for importing comics.
4141
*
4242
* @author Darryl L. Pierce
4343
*/
4444
@Configuration
4545
@Log4j2
46-
public class ProcessComicBooksConfiguration {
47-
public static final String PROCESS_COMIC_BOOKS_JOB = "processComicBooksJob";
48-
public static final String PROCESS_COMIC_BOOKS_STARTED_JOB =
49-
"job.process-comic-books.time-started";
46+
public class LoadComicBooksConfiguration {
47+
public static final String LOAD_COMIC_BOOKS_JOB = "loadComicBooksJob";
48+
public static final String LOAD_COMIC_BOOKS_JOB_STARTED = "job.load-comic-books.time-started";
5049

51-
@Value("${comixed.batch.process-comic-books.chunk-size:10}")
50+
@Value("${comixed.batch.load-comic-books.chunk-size:10}")
5251
private int chunkSize;
5352

5453
/**
@@ -59,12 +58,12 @@ public class ProcessComicBooksConfiguration {
5958
* @param loadFileContentsStep the load file contents step
6059
* @return the job
6160
*/
62-
@Bean(name = PROCESS_COMIC_BOOKS_JOB)
63-
public Job processComicBooksJob(
61+
@Bean(name = LOAD_COMIC_BOOKS_JOB)
62+
public Job loadComicBooksJob(
6463
final JobRepository jobRepository,
65-
final ProcessComicBooksJobListener jobListener,
64+
final LoadComicBooksJobListener jobListener,
6665
@Qualifier("loadFileContentsStep") final Step loadFileContentsStep) {
67-
return new JobBuilder(PROCESS_COMIC_BOOKS_JOB, jobRepository)
66+
return new JobBuilder(LOAD_COMIC_BOOKS_JOB, jobRepository)
6867
.incrementer(new RunIdIncrementer())
6968
.listener(jobListener)
7069
.start(loadFileContentsStep)

comixed-batch/src/main/java/org/comixedproject/batch/comicbooks/RecreateComicFilesConfiguration.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,12 +57,12 @@ public Job recreateComicFilesJob(
5757
final JobRepository jobRepository,
5858
final RecreatingComicFilesJobListener listener,
5959
@Qualifier("recreateComicFileStep") final Step recreateComicFileStep,
60-
@Qualifier("processComicBooksJobStep") final Step processComicBooksJobStep) {
60+
@Qualifier("loadComicBooksStep") final Step loadComicBooksStep) {
6161
return new JobBuilder(RECREATE_COMIC_FILES_JOB, jobRepository)
6262
.incrementer(new RunIdIncrementer())
6363
.listener(listener)
6464
.start(recreateComicFileStep)
65-
.next(processComicBooksJobStep)
65+
.next(loadComicBooksStep)
6666
.build();
6767
}
6868

comixed-batch/src/main/java/org/comixedproject/batch/comicbooks/listeners/ProcessComicBooksJobListener.java renamed to comixed-batch/src/main/java/org/comixedproject/batch/comicbooks/listeners/LoadComicBooksJobListener.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,15 @@
2727
import org.springframework.stereotype.Component;
2828

2929
/**
30-
* <code>ProcessComicBooksJobListener</code> relays overall job state during the comic processing
31-
* batch process.
30+
* <code>loadComicBooksJobListener</code> relays overall job state during the comic processing batch
31+
* process.
3232
*
3333
* @author Darryl L. Pierce
3434
*/
3535
@Component
3636
@JobScope
3737
@Log4j2
38-
public class ProcessComicBooksJobListener extends AbstractBatchProcessListener
38+
public class LoadComicBooksJobListener extends AbstractBatchProcessListener
3939
implements JobExecutionListener {
4040
@Override
4141
public void beforeJob(final JobExecution jobExecution) {

comixed-batch/src/main/java/org/comixedproject/batch/comicbooks/readers/CreateMetadataSourceReader.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
@Component
3030
@Log4j2
3131
public class CreateMetadataSourceReader extends AbstractComicReader {
32-
@Value("${comixed.batch.process-comic-books.chunk-size:10}")
32+
@Value("${comixed.batch.load-comic-books.chunk-size:10}")
3333
@Getter
3434
private int chunkSize;
3535

comixed-batch/src/main/java/org/comixedproject/batch/comicbooks/readers/LoadFileContentsReader.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
@StepScope
3636
@Log4j2
3737
public class LoadFileContentsReader extends AbstractComicReader {
38-
@Value("${comixed.batch.process-comic-books.chunk-size:10}")
38+
@Value("${comixed.batch.load-comic-books.chunk-size:10}")
3939
@Getter
4040
private int chunkSize;
4141

comixed-batch/src/main/java/org/comixedproject/batch/initiators/AddPagesToImageCacheInitiator.java

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@
4444
@Component
4545
@Log4j2
4646
public class AddPagesToImageCacheInitiator {
47+
private static final Object MUTEX = new Object();
48+
4749
@Autowired private PageCacheService pageCacheService;
4850
@Autowired private ComicPageService comicPageService;
4951
@Autowired private BatchProcessesService batchProcessesService;
@@ -59,26 +61,28 @@ public class AddPagesToImageCacheInitiator {
5961
/** Starts a batch process to add pages to the image cache. */
6062
@Scheduled(cron = "${comixed.batch.add-cover-to-image-cache.schedule:0 0 * * * *}")
6163
public void execute() {
62-
try {
63-
log.debug("Preparing to process uncached cover pages");
64-
this.pageCacheService.prepareCoverPagesWithoutCacheEntries();
65-
if (this.comicPageService.findPagesNeedingCacheEntriesCount() > 0L
66-
&& !this.batchProcessesService.hasActiveExecutions(
67-
AddPagesToImageCacheConfiguration.ADD_PAGES_TO_IMAGE_CACHE_JOB)) {
68-
log.debug("Starting process: add pages to image cache");
69-
this.jobLauncher.run(
70-
addPagesToImageCacheJob,
71-
new JobParametersBuilder()
72-
.addLong(
73-
AddPagesToImageCacheConfiguration.PARAM_ADD_IMAGE_CACHE_ENTRIES_STARTED,
74-
System.currentTimeMillis())
75-
.toJobParameters());
64+
synchronized (MUTEX) {
65+
try {
66+
log.debug("Preparing to process uncached cover pages");
67+
this.pageCacheService.prepareCoverPagesWithoutCacheEntries();
68+
if (this.comicPageService.findPagesNeedingCacheEntriesCount() > 0L
69+
&& !this.batchProcessesService.hasActiveExecutions(
70+
AddPagesToImageCacheConfiguration.ADD_PAGES_TO_IMAGE_CACHE_JOB)) {
71+
log.debug("Starting process: add pages to image cache");
72+
this.jobLauncher.run(
73+
addPagesToImageCacheJob,
74+
new JobParametersBuilder()
75+
.addLong(
76+
AddPagesToImageCacheConfiguration.PARAM_ADD_IMAGE_CACHE_ENTRIES_STARTED,
77+
System.currentTimeMillis())
78+
.toJobParameters());
79+
}
80+
} catch (JobExecutionAlreadyRunningException
81+
| JobInstanceAlreadyCompleteException
82+
| JobParametersInvalidException
83+
| JobRestartException error) {
84+
log.error("Failed to start batch process", error);
7685
}
77-
} catch (JobExecutionAlreadyRunningException
78-
| JobInstanceAlreadyCompleteException
79-
| JobParametersInvalidException
80-
| JobRestartException error) {
81-
log.error("Failed to start batch process", error);
8286
}
8387
}
8488
}

comixed-batch/src/main/java/org/comixedproject/batch/initiators/ProcessComicBooksInitiator.java renamed to comixed-batch/src/main/java/org/comixedproject/batch/initiators/LoadComicBooksInitiator.java

Lines changed: 26 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@
1616
* along with this program. If not, see <http://www.gnu.org/licenses>
1717
*/ package org.comixedproject.batch.initiators;
1818

19-
import static org.comixedproject.batch.comicbooks.ProcessComicBooksConfiguration.*;
19+
import static org.comixedproject.batch.comicbooks.LoadComicBooksConfiguration.*;
2020

2121
import lombok.extern.log4j.Log4j2;
22-
import org.comixedproject.model.batch.ProcessComicBooksEvent;
22+
import org.comixedproject.model.batch.LoadComicBooksEvent;
2323
import org.comixedproject.service.batch.BatchProcessesService;
2424
import org.comixedproject.service.comicbooks.ComicBookService;
2525
import org.springframework.batch.core.Job;
@@ -37,27 +37,29 @@
3737
import org.springframework.stereotype.Component;
3838

3939
/**
40-
* <code>ProcessComicBooksInitiator</code> provides an initiator that periodically scans the library
40+
* <code>LoadComicBooksInitiator</code> provides an initiator that periodically scans the library
4141
* for unprocessed comic books and starts a batch job to process them.
4242
*
4343
* @author Darryl L. Pierce
4444
*/
4545
@Component
4646
@Log4j2
47-
public class ProcessComicBooksInitiator {
47+
public class LoadComicBooksInitiator {
48+
private static final Object MUTEX = new Object();
49+
4850
@Autowired private ComicBookService comicBookService;
4951
@Autowired private BatchProcessesService batchProcessesService;
5052

5153
@Autowired
52-
@Qualifier(value = PROCESS_COMIC_BOOKS_JOB)
53-
private Job processComicBooksJob;
54+
@Qualifier(value = LOAD_COMIC_BOOKS_JOB)
55+
private Job loadComicBooksJob;
5456

5557
@Autowired
5658
@Qualifier("batchJobLauncher")
5759
private JobLauncher jobLauncher;
5860

5961
/** Checks for unprocessed comics not in a group and kicks off a new batch job to process them. */
60-
@Scheduled(fixedDelayString = "${comixed.batch.process-comic-books.period:60000}")
62+
@Scheduled(fixedDelayString = "${comixed.batch.load-comic-books.period:60000}")
6163
public void execute() {
6264
this.doExecute();
6365
}
@@ -69,30 +71,27 @@ public void execute() {
6971
*/
7072
@EventListener()
7173
@Async
72-
public void execute(ProcessComicBooksEvent event) {
74+
public void execute(LoadComicBooksEvent event) {
7375
this.doExecute();
7476
}
7577

7678
private void doExecute() {
77-
log.debug("Looking for unprocessed comic books");
78-
final long unprocessedComicBookCount = this.comicBookService.getUnprocessedComicBookCount();
79-
if (unprocessedComicBookCount == 0L) {
80-
log.debug("No comic books to be processed");
81-
return;
82-
}
83-
if (!this.batchProcessesService.hasActiveExecutions(PROCESS_COMIC_BOOKS_JOB)) {
84-
log.info("Starting process comics job");
85-
try {
86-
this.jobLauncher.run(
87-
this.processComicBooksJob,
88-
new JobParametersBuilder()
89-
.addLong(PROCESS_COMIC_BOOKS_STARTED_JOB, System.currentTimeMillis())
90-
.toJobParameters());
91-
} catch (JobExecutionAlreadyRunningException
92-
| JobRestartException
93-
| JobInstanceAlreadyCompleteException
94-
| JobParametersInvalidException error) {
95-
log.error("Failed to start batch job processing comics", error);
79+
synchronized (MUTEX) {
80+
if (!this.batchProcessesService.hasActiveExecutions(LOAD_COMIC_BOOKS_JOB)
81+
&& this.comicBookService.getUnprocessedComicBookCount() > 0) {
82+
log.info("Starting process comics job");
83+
try {
84+
this.jobLauncher.run(
85+
this.loadComicBooksJob,
86+
new JobParametersBuilder()
87+
.addLong(LOAD_COMIC_BOOKS_JOB_STARTED, System.currentTimeMillis())
88+
.toJobParameters());
89+
} catch (JobExecutionAlreadyRunningException
90+
| JobRestartException
91+
| JobInstanceAlreadyCompleteException
92+
| JobParametersInvalidException error) {
93+
log.error("Failed to start batch job processing comics", error);
94+
}
9695
}
9796
}
9897
}

0 commit comments

Comments
 (0)