当前位置: 首页 > 知识库问答 >
问题:

如何转换io。微型机器人。http。Http要求完成未来

叶桐
2023-03-14

我正在关注4个低级客户,我想调整示例以返回一个完整的未来。我的最终目标是并行使用两个不同的endpoint。我是Micronaut的新手。我相信一个很好的方法是创建两个Micronaut低级别客户,它们返回一个可完成的未来,然后用可完成的未来将两者结合起来。allOf()。加入

所以我把服务编码为

import com.mycomp.application.clients.EmployeClient
import com.mycomp.application.clients.EmployeeLowLevelClient
import java.awt.desktop.PrintFilesEvent
import java.util.*
import java.util.concurrent.CompletableFuture
import javax.inject.Inject
import javax.inject.Singleton

@Singleton
class EmployeeService {

    @Inject
    lateinit var employeClient: EmployeClient //Declarative Cliente

    @Inject
    lateinit var employeeLowLevelClient: EmployeeLowLevelClient //Low Level Client

    fun thenCombineAsyncExample() {

        val allFutures: MutableList<CompletableFuture<String>> = ArrayList<CompletableFuture<String>>()

        allFutures.add(employeClient.getEmployeesA()) //### THIS WORKS
        allFutures.add(employeClient.getEmployeesB()) //### THIS WORKS
        employeeLowLevelClient.getEmployeeSurname()?.let { allFutures.add(it) } //### THIS FAILS

        CompletableFuture.allOf(*allFutures.toTypedArray<CompletableFuture<*>>()).join()

        for (i in 0..1) {
            print("response: " + allFutures[i].get().toString())
        }
    }
}

而低层客户作为

import io.micronaut.http.HttpRequest
import io.micronaut.http.client.RxHttpClient
import java.util.concurrent.CompletableFuture
import javax.inject.Singleton

@Singleton
class EmployeeLowLevelClient(private val httpClient: RxHttpClient) {
    internal fun getEmployeeSurname(): CompletableFuture<String>? {

        val req = HttpRequest.GET<String>("http://localhost:3000/employees_a?first_name=Jimis")
        //val flowable = httpClient.retrieve(req)
        return req as CompletableFuture<String> //### HERE IS THE ISSUE

    }
}

借口是

java.lang.ClassCastException: class io.micronaut.http.client.netty.NettyClientHttpRequest cannot be cast to class java.util.concurrent.CompletableFuture (io.micronaut.http.client.netty.NettyClientHttpRequest is in unnamed module of loader 'app'; java.util.concurrent.CompletableFuture is in module java.base of loader 'bootstrap')

有趣的是,我对声明式客户机没有什么例外。

import io.micronaut.http.annotation.Get
import io.micronaut.http.client.annotation.Client
import io.reactivex.Single
import java.util.concurrent.CompletableFuture

@Client()
interface EmployeClient {

    @Get("http://localhost:3000/employees_a?first_name=Jimis")
    fun getEmployeesA(): CompletableFuture<String>

    @Get("http://localhost:3001/employees_b?first_name=Jimis")
    fun getEmployeesB(): CompletableFuture<String>
}

共有1个答案

施景同
2023-03-14

如果我理解正确,您希望异步发出一些Http请求。。。

以下几行相对来说比较直截了当,但我认为可能存在一些困惑。。。

val allFutures: MutableList<CompletableFuture<String>> = ArrayList<CompletableFuture<String>>()

allFutures.add(employeClient.getEmployeesA()) //### THIS WORKS
allFutures.add(employeClient.getEmployeesB()) //### THIS WORKS
employeeLowLevelClient.getEmployeeSurname()?.let { allFutures.add(it) }

创建一个CompletableFutures列表,然后向其中添加两个CompletableFutures。然后使用“客户机”调用getEmployeeNames(),使用CompletableFutures。

因此,在我看来,您希望GetEmployeeAn姓氏()返回一个CompletableFuture,以便将其添加到allFutures

所以你想要一个函数的get雇员Surname()更像:

internal fun getEmployeeSurname(): CompletableFuture<String>? {

        val req = HttpRequest.GET<String>("http://localhost:3000/employees_a?first_name=Jimis")
        //val flowable = httpClient.retrieve(req)
        return CompletableFuture.runAsync(req)
    }

然后,该函数返回包装在可完成未来的Http请求。你不能仅仅把一个HttpClient转换成一个完整的未来,因为两者之间没有共同之处。

所以现在当你这样做的时候:

employeeLowLevelClient.getEmployeeSurname()?.let { allFutures.add(it) }

它应该添加CompletableFuture调用应该在单独的线程上运行,而不会阻塞主线程上的执行。

 类似资料:
  • 其实针对大多应用场景,DNS 是不会频繁变更的,使用 Nginx 默认的 resolver 配置方式就能解决。 对于部分应用场景,可能需要支持的系统众多:win、centos、ubuntu 等,不同的操作系统获取 DNS 的方法都不太一样。再加上我们使用 Docker,导致我们在容器内部获取 DNS 变得更加难以准确。 如何能够让 Nginx 使用随时可以变化的 DNS 源,成为我们急待解决的问题

  • 问题内容: 我有以下CURL请求,谁能请我确认subesquest HTTP请求是什么? 会是这样吗? 任何人都可以帮助我将上述curl请求完全转换为httpreq。 提前致谢。 苏维 问题答案: 有很多方法可以实现这一目标。在我看来,以下一项是最简单的,同意它不是很灵活,但是可以工作。

  • 问题内容: 我正在使用Node的模块发出 HTTP 请求,但是在上,返回的块似乎并不满足完整的请求响应。这是我的代码: 有没有办法在结束请求之前等待完整的输出?难道我做错了什么?谢谢! 问题答案: 您还应该收听“结束”事件

  • 因此,这个discord机器人只是加入输入命令的人的语音通道,播放音频文件,然后离开<机器人成功加入语音频道,开始播放音频,在结束前离开。它不是在音频文件完成之前机器人离开,因为在删除机器人离开的能力后,它仍然在同一点被切断。这是我的代码: 我已经在这个问题上绞尽脑汁好几个小时了,但我似乎无法确定为什么会发生这种情况。感谢任何帮助!

  • 我以前有个可打电话的课 我曾经使用提交。如何更改为使用

  • 问题内容: 我正在尝试编写一个自动完成指令,该指令使用$ http请求 (不使用任何外部插件或脚本) 从服务器获取数据。当前,它仅适用于静态数据。现在,我知道我需要将我的$ http请求插入指令的中,但是我找不到关于该主题的任何好的文档。 http请求 指示 视图 那么,如何将这些正确地按Angular方式拼凑在一起? 问题答案: 我做了一个自动完成指令,并将其上传到GitHub。它还应该能够处理