Merge pull request 'feat/concurrency' (#63) from feat/concurrency into main

Reviewed-on: #63
This commit is contained in:
rov 2026-06-24 08:12:16 -03:00
commit b51e119bcc
4 changed files with 23 additions and 11 deletions

View File

@ -13,7 +13,9 @@ import org.springframework.stereotype.Service;
public class MangaIngestConsumer { public class MangaIngestConsumer {
private final MangaIngestService mangaIngestService; private final MangaIngestService mangaIngestService;
@RabbitListener(queues = "${queues.manga-ingest}") @RabbitListener(
queues = "${queues.manga-ingest}",
concurrency = "${queues.manga-ingest-concurrency:3-5}")
public void receiveMangaIngestCommand(MangaIngestCommand command) { public void receiveMangaIngestCommand(MangaIngestCommand command) {
log.info("Received manga ingest command: {}", command); log.info("Received manga ingest command: {}", command);
mangaIngestService.ingestManga(command.providerId(), command.mangaTitle(), command.url()); mangaIngestService.ingestManga(command.providerId(), command.mangaTitle(), command.url());

View File

@ -36,6 +36,15 @@ public class MangaIngestService {
return; return;
} }
if (mangaIngestReviewRepository.existsByMangaTitleIgnoreCaseAndContentProvider_Id(
mangaTitle, contentProviderId)) {
log.info(
"Manga ingest review already exists for manga with mangaTitle '{}' and provider {}, skipping ingest",
mangaTitle,
contentProviderId);
return;
}
var manga = mangaResolutionService.findOrCreateManga(mangaTitle); var manga = mangaResolutionService.findOrCreateManga(mangaTitle);
if (isNull(manga)) { if (isNull(manga)) {
createMangaIngestReview(mangaTitle, url, contentProviderId); createMangaIngestReview(mangaTitle, url, contentProviderId);
@ -72,15 +81,6 @@ public class MangaIngestService {
mangaTitle, mangaTitle,
contentProviderId); contentProviderId);
if (mangaIngestReviewRepository.existsByMangaTitleIgnoreCaseAndContentProvider_Id(
mangaTitle, contentProviderId)) {
log.info(
"Manga ingest review already exists for manga with mangaTitle '{}' and provider {}, skipping review creation",
mangaTitle,
contentProviderId);
return;
}
try { try {
var contentProvider = contentProviderService.find(contentProviderId); var contentProvider = contentProviderService.find(contentProviderId);

View File

@ -13,7 +13,9 @@ import org.springframework.stereotype.Service;
public class ProviderPageIngestConsumer { public class ProviderPageIngestConsumer {
private final IngestionService ingestionService; private final IngestionService ingestionService;
@RabbitListener(queues = "${queues.provider-page-ingest}") @RabbitListener(
queues = "${queues.provider-page-ingest}",
concurrency = "${queues.provider-page-ingest-concurrency:2-4}")
public void receiveProviderPageIngestCommand(ProviderPageIngestCommand command) { public void receiveProviderPageIngestCommand(ProviderPageIngestCommand command) {
log.info("Received provider page ingest command: {}", command); log.info("Received provider page ingest command: {}", command);
ingestionService.fetchProviderPageMangas(command.providerId(), command.page()); ingestionService.fetchProviderPageMangas(command.providerId(), command.page());

View File

@ -20,6 +20,11 @@ spring:
max-request-size: 4GB max-request-size: 4GB
cloud: cloud:
openfeign: openfeign:
client:
config:
default:
connect-timeout: 10000
read-timeout: 30000
rabbitmq: rabbitmq:
host: ${RABBITMQ_HOST} host: ${RABBITMQ_HOST}
port: ${RABBITMQ_PORT} port: ${RABBITMQ_PORT}
@ -28,6 +33,7 @@ spring:
listener: listener:
simple: simple:
default-requeue-rejected: false default-requeue-rejected: false
prefetch: 10
data: data:
redis: redis:
host: ${REDIS_HOST:localhost} host: ${REDIS_HOST:localhost}
@ -65,12 +71,14 @@ topics:
queues: queues:
manga-ingest: ${MANGA_INGEST_QUEUE:mangamochi.manga.ingest} manga-ingest: ${MANGA_INGEST_QUEUE:mangamochi.manga.ingest}
manga-ingest-concurrency: 3-5
manga-update: ${MANGA_UPDATE_QUEUE:mangamochi.manga.update} manga-update: ${MANGA_UPDATE_QUEUE:mangamochi.manga.update}
manga-content-ingest: ${MANGA_CONTENT_INGEST_QUEUE:mangamochi.manga.content.ingest} manga-content-ingest: ${MANGA_CONTENT_INGEST_QUEUE:mangamochi.manga.content.ingest}
manga-content-image-ingest: ${MANGA_CONTENT_IMAGE_INGEST_QUEUE:mangamochi.manga.content.image.ingest} manga-content-image-ingest: ${MANGA_CONTENT_IMAGE_INGEST_QUEUE:mangamochi.manga.content.image.ingest}
manga-content-image-update: ${MANGA_CONTENT_IMAGE_UPDATE_QUEUE:mangamochi.manga.content.image.update} manga-content-image-update: ${MANGA_CONTENT_IMAGE_UPDATE_QUEUE:mangamochi.manga.content.image.update}
manga-content-image-delete: ${MANGA_CONTENT_IMAGE_DELETE_QUEUE:mangamochi.manga.content.image.delete} manga-content-image-delete: ${MANGA_CONTENT_IMAGE_DELETE_QUEUE:mangamochi.manga.content.image.delete}
provider-page-ingest: ${PROVIDER_PAGE_INGEST_QUEUE:mangamochi.provider.page.ingest} provider-page-ingest: ${PROVIDER_PAGE_INGEST_QUEUE:mangamochi.provider.page.ingest}
provider-page-ingest-concurrency: 2-4
image-fetch: ${IMAGE_FETCH_QUEUE:mangamochi.image.fetch} image-fetch: ${IMAGE_FETCH_QUEUE:mangamochi.image.fetch}
manga-cover-update: ${MANGA_COVER_UDPATE_QUEUE:mangamochi.manga.cover.update} manga-cover-update: ${MANGA_COVER_UDPATE_QUEUE:mangamochi.manga.cover.update}
file-import: ${FILE_IMPORT_QUEUE:mangamochi.file.import} file-import: ${FILE_IMPORT_QUEUE:mangamochi.file.import}