关于commandResult和Completable用法小笔记

本文探讨了如何在Java代码中正确处理支付撤销操作的CommandResult订阅问题,通过修改execute方法和publishEvent逻辑,确保事件成功发布并推送到Kafka。作者分享了解决未订阅问题的方法及优化后的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

要在处理完成后追加一个Delete处理:

    @Nonnull
    @Override
    public Single<CommandResult> execute(@Nonnull PaymentUnallocateRequest request) {
        return validatorRegistry.getValidator(commandIdentity()).validate(request).switchIfEmpty(Single.defer(
            () -> paymentUnallocateActivityWrite(request).flatMap(
                paymentRequest -> createPaymentActivityLink(paymentRequest).flatMapSingle(
                        activityLink -> paymentUnallocateActivityApply(paymentRequest, activityLink,
                            request.getBillingViewLink()).flatMap(
                                a -> billingPaymentService.extractActivity(EntityLinkUtil.getId(activityLink), paymentRequest))
                            .flatMap(
                                activity -> paymentUnallocateActivityComplete((PaymentActivity) activity, paymentRequest)))
                    .flatMap(commandResult -> publishEventIfUnallocateDeleteMemberRecord(paymentRequest)))));
    }

    private Single<commandResult> publishEventIfUnallocateDeleteMemberRecord(BillingPaymentRequest request) {
        return Single.jues( eventPublisher.publishEventAsync(paymentEventFactory.createDeleteMemberRecordIndexEvent(request)).map(deletrMemberRecordIndexEvent -> commandResult);
    }

如上修改,发现因为没有地方订阅commandResultpublishEventAsync并没有被push,Kafka上没有发出消息。publishEventAsync return了Completable但是没有调用这个线程,我只返回了commandResult,但是commandResult并没有被订阅。

改成如下代码后,可正常push:

    public Single<CommandResult> execute(@Nonnull PaymentUnallocateRequest request) {
        return validatorRegistry.getValidator(commandIdentity()).validate(request).switchIfEmpty(Single.defer(
            () -> paymentUnallocateActivityWrite(request).flatMap(
                paymentRequest -> createPaymentActivityLink(paymentRequest).flatMapSingle(
                        activityLink -> paymentUnallocateActivityApply(paymentRequest, activityLink,
                            request.getBillingViewLink()).flatMap(
                                a -> billingPaymentService.extractActivity(EntityLinkUtil.getId(activityLink), paymentRequest))
                            .flatMap(
                                activity -> paymentUnallocateActivityComplete((PaymentActivity) activity, paymentRequest)))
                    .flatMap(commandResult -> publishEventIfUnallocateDeleteMemberRecord(paymentRequest).andThen(
                        Single.just(commandResult))))));
    }
    private Completable publishEventIfUnallocateDeleteMemberRecord(BillingPaymentRequest request) {
        return eventPublisher.publishEventAsync(paymentEventFactory.createDeleteMemberRecordIndexEvent(request));
    }

重点在于commandResult有没有被正确的订阅

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值