如何把一个单成为一个真正的异(没有反应!) 方法打电话?

0

的问题

我有一个方法

@Service
public class MyService {
    public Mono<Integer> processData() {
        ... // very long reactive operation
    }
}

在正常程序流程,我呼此方法的异步通过一种卡夫卡的事件。

为测试目的,我需要 让的方法作为一个网络服务,但该方法应该暴露如异:返回仅HTTP代码200确定("接受的请求"),继续数据处理的背景。

它是确定(=它没有任何不必要的副作用)只是为了叫 Mono#subscribe() 和返回从控制方法?

@RestController
@RequiredArgsConstructor
public class MyController {
    private final MyService service;

    @GetMapping
    public void processData() {
        service.processData()
            .subscribeOn(Schedulers.boundedElastic())
            .subscribe();
    }
}

或者是更好地做到这一点像这样(在这里我很困惑的警告从用浏览器也许一样 https://youtrack.jetbrains.com/issue/IDEA-276018 ?):

public Mono<Void> processData() {
    service.processData()
        .subscribeOn(Schedulers.boundedElastic())
        .subscribe(); // IntelliJ complains "Inappropriate 'subscribe' call" but I think it's a false alarm in my case(?)
    return Mono.empty();
}

或者一些其他的解决方案?

2

最好的答案

3

它是确定(=它没有任何不必要的副作用)只是到呼叫单#订阅()和返回从控制方法?

有副作用,但是你可以确定生活,与他们:

  • 这真的是火,并要忘记,这意味着同时你永远不会知有关一个成功的(其中大多数人意识到),你也从来没有被通知有关故障(其中很少人意识到.)
  • 如果该进程挂起,因为某些原因,发行将永远不会完成,你有没有办法知道。 因为你是订阅的界弹性的线程池,它还将占用一些有限的线下去了。

第一点你可能会被罚款,或者您可能想要把一些错误记录进一步下降,反应链作为一个副作用某种方式这样你至少有一个内部通知,如果出现错误。

对于第二点,我建议把(慷慨)超时上你的方法调用,所以它至少被取消,如果它还没有完成设置时间和不再挂在消耗的资源。 如果你正在运行的一个步的任务,那么这不是一个巨大的问题,因为这只会耗费一点的记忆。 如果你包裹阻断呼吁弹性的调度程序,那么这是糟糕但是,因为你绑了个线程在线程池下去。

我也想问你为什么需要使用的界弹性的调度程序在所有在这里-这是用于包裹阻断呼吁,这似乎并不是基金的使用情况。 (需要明确的是,如果服务是阻止然后你绝对应该包裹上的弹计划-但如果不那么就没有理由这样做。)

最后,这个例子:

public Mono<Void> processData() {
    service.processData()
        .subscribeOn(Schedulers.boundedElastic())
        .subscribe();
    return Mono.empty();
}

...是一个辉煌例子什么 做,因为你创造一种"冒名顶替者的反应性方法"-有人可能非常合理的订阅,返回的出版商想,它将完成在基本发行完成,这显然不是这里发生了什么。 使用 void 返回的类型,因此不回任何东西是正确的事情要做,在这种情况。

2021-11-23 16:54:58
1

你的选择与以下代码实际上是确定:

@GetMapping
public void processData() {
    service.processData()
        .subscribeOn(Schedulers.boundedElastic())
        .subscribe();
}

这实际上是你做了什么在 @Scheduled 方法,简单地返回什么,你明确订阅 MonoFlux 使元素射出。

2021-11-23 08:36:44

其他语言

此页面有其他语言版本

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................