我正在关注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>
}
如果我理解正确,您希望异步发出一些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) }
创建一个CompletableFuture
s列表,然后向其中添加两个CompletableFuture
s。然后使用“客户机”调用getEmployeeNames()
,使用CompletableFuture
s。
因此,在我看来,您希望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。它还应该能够处理