J'essaie d'exécuter une méthode de manière asynchrone au sein d'une chaîne réactive existante dans mon application basée sur Project Reactor. La méthode doUpdateLayoutInAsync est destinée à effectuer une lourde tâche en arrière-plan, mais il semble que mon approche ne fonctionne pas comme prévu. Voici ma mise en œuvre actuelle :
public Mono<Boolean> publishPackage(String branchedPackageId) { PackagePublishingMetaDTO publishingMetaDTO = new PackagePublishingMetaDTO(); publishingMetaDTO.setPublishEvent(true); return packageRepository .findById(branchedPackageId, packagePermission.getPublishPermission()) .switchIfEmpty(Mono.error(new AppsmithException( AppsmithError.ACL_NO_RESOURCE_FOUND, FieldName.PACKAGE_ID, branchedPackageId))) .flatMap(originalPackage -> { String nextVersion = PackageUtils.getNextVersion(originalPackage.getVersion()); Package packageToBePublished = constructPackageToBePublished(originalPackage); originalPackage.setVersion(nextVersion); originalPackage.setLastPublishedAt(packageToBePublished.getLastPublishedAt()); publishingMetaDTO.setOriginPackageId(branchedPackageId); publishingMetaDTO.setWorkspaceId(originalPackage.getWorkspaceId()); Mono<Void> unsetCurrentLatestMono = packageRepository.unsetLatestPackageByOriginId(originalPackage.getId(), null); Mono<Package> saveOriginalPackage = packageRepository.save(originalPackage); Mono<Package> savePackageToBePublished = packageRepository.save(packageToBePublished); return unsetCurrentLatestMono .then(Mono.zip(saveOriginalPackage, savePackageToBePublished)) .flatMap(tuple2 -> { Package publishedPackage = tuple2.getT2(); publishingMetaDTO.setPublishedPackage(publishedPackage); return modulePackagePublishableService .publishEntities(publishingMetaDTO) .flatMap(publishedModules -> { if (publishedModules.isEmpty()) { return Mono.error(new AppsmithException( AppsmithError.PACKAGE_CANNOT_BE_PUBLISHED, originalPackage.getUnpublishedPackage().getName())); } return moduleInstancePackagePublishableService .publishEntities(publishingMetaDTO) .then(Mono.defer(() -> newActionPackagePublishableService.publishEntities(publishingMetaDTO)) .then(Mono.defer(() -> actionCollectionPackagePublishableService .publishEntities(publishingMetaDTO)))); }) .then(Mono.defer(() -> autoUpgradeService.handleAutoUpgrade(publishingMetaDTO))); }) .as(transactionalOperator::transactional) .then(Mono.defer(() -> doUpdateLayoutInAsync(publishingMetaDTO))); }); } private Mono<Boolean> doUpdateLayoutInAsync(PackagePublishingMetaDTO publishingMetaDTO) { Mono<List<String>> updateLayoutsMono = Flux.fromIterable(publishingMetaDTO.getAutoUpgradedPageIds()) .flatMap(pageId -> updateLayoutService .updatePageLayoutsByPageId(pageId) .onErrorResume(throwable -> { log.warn("Update layout failed for pageId: {} with error: {}", pageId, throwable.getMessage()); return Mono.just(pageId); })) .collectList(); // Running the updateLayoutsMono task asynchronously updateLayoutsMono.subscribeOn(Schedulers.boundedElastic()).subscribe(); return Mono.just(Boolean.TRUE); }
Problème : Je souhaite que doUpdateLayoutInAsync s'exécute en arrière-plan pendant que le reste de la chaîne réactive se termine. Cependant, la méthode semble s'exécuter de manière synchrone et la chaîne réactive ne continue pas comme prévu.
Question : Comment puis-je m'assurer que doUpdateLayoutInAsync s'exécute de manière asynchrone et ne bloque pas la suite de la chaîne réactive ?
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!