Java 列表流量<;对象>;无阻塞
正在查找将磁通量转换为Java 列表流量<;对象>;无阻塞,java,reactive-programming,project-reactor,graphql-java,Java,Reactive Programming,Project Reactor,Graphql Java,正在查找将磁通量转换为列表。如果使用block(),则获取错误。因此,需要在不阻塞呼叫的情况下进行转换 Flux.from(Collection.find()) 使用反应式编程,但graphql需要列表和返回流量的错误 用Block()编码 在这里,我需要返回列表,因为我由于某种原因无法发送流量。如评论中所述,您不能。反应模式是保持在流程中 所以 Mono=Flux.just(“A”、“B”、“C”) .LIST() .map(this::someMethod); 图形方法(列出abcs){
列表
。如果使用block(),则获取错误。因此,需要在不阻塞呼叫的情况下进行转换
Flux.from(Collection.find())
使用反应式编程,但graphql需要列表
和返回流量的错误
用Block()编码
在这里,我需要返回
列表
,因为我由于某种原因无法发送流量
。如评论中所述,您不能。反应模式是保持在流程中
所以
Mono=Flux.just(“A”、“B”、“C”)
.LIST()
.map(this::someMethod);
图形方法(列出abcs){
返回图ql.剂量测定法(abcs);
}
我假设集合
类来自某个正在执行tcp/http调用的反应器库collection.find
返回一个Flux/Mono/Publisher
我假设?这并不是因为collectList
不允许您这样做,而是因为您试图在NonBlocking
线程上运行block
,我假设collection.find
发布NonBlocking
实例线程上的元素,从它的名字reactor-http-kqueue-7
来看,它可能是一个网络线程
您可以查看BlockingSingleSubscriber.blockingGet
方法,它会告诉您原因
final T blockingGet() {
if (Schedulers.isInNonBlockingThread()) {
throw new IllegalStateException("block()/blockFirst()/blockLast() are blocking, which is not supported in thread " + Thread.currentThread().getName());
}
...
如果必须从调用程序线程(调用Flux.from)获取结果,那么可以这样做
Flux.from(testCondition.find())
.publishOn(Schedulers.boundedElastic())
.collectList()
.block()
你不能。这需要更多的细节-绝对没有办法以非阻塞方式将
通量
转换为集合
。解决这个问题的方法有很多-您可以在允许阻塞的情况下切换流量以使用单独的线程,您可以调用订阅链中的graphql库,等等-但是很难/不可能判断哪种方法最适合使用。如果上下文是关于Spring Webflux,你真的不需要,因为框架是隐式订阅flux/mono的;(b) 请始终使用大写字母作为人称代词“I”;(c) 请避免添加问候和感谢等对话材料;(d) 始终使用“预览”窗格,以便查看材质是否已正确渲染。这里需要修复泛型表达式。
Mono<GraphqlResponse> = Flux.just("A", "B" "C")
.collectList()
.map(this::someMethod);
GraphqlResponse someMethod(List<String> abcs) {
return graphQl.doSomething(abcs);
}
final T blockingGet() {
if (Schedulers.isInNonBlockingThread()) {
throw new IllegalStateException("block()/blockFirst()/blockLast() are blocking, which is not supported in thread " + Thread.currentThread().getName());
}
...
Flux.from(testCondition.find())
.publishOn(Schedulers.boundedElastic())
.collectList()
.block()