要在处理完成后追加一个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);
}
如上修改,发现因为没有地方订阅commandResult,publishEventAsync并没有被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有没有被正确的订阅