这个问题可能更多地是关于集成模式,而不是关于多线程。但是,同一应用程序/JVM 中的请求可以使用异步调用和观察者模式的组合进行编排:
最好使用示例(利用您的Java知识)来完成此操作。检查以下尝试复制方案的简单组件:
第三方服务:它公开一个返回相关 ID 并启动长时间运行的执行的操作
class ExternalService {
public String send() {
return UUID.randomUUID().toString();
}
}
面向客户的服务:它接收请求,调用第三方服务,然后在向结果接收方注册后等待响应:
class RequestProcessor {
public Object submitRequest() {
String correlationId = new ExternalService().send();
return new ResultReceiver().register(correlationId).join();
}
}
结果接收器:它向第三方服务公开操作,并维护内部关联注册表:
class ResultReceiver {
Map<String, CompletableFuture<Object>> subscribers;
CompletableFuture<Object> register(String responseId) {
CompletableFuture<Object> future = new CompletableFuture<Object>();
this.subscribers.put(responseId, future);
return future;
}
public void externalResponse(String responseId, Object result) {
this.subscribers.get(responseId).complete(result);
}
}
在这种情况下,期货,承诺,回电都很方便。同步由初始请求处理器完成,以便强制执行为客户端阻止。
现在,这可能会引发许多在这个简单的类集中没有解决的问题。其中一些问题可能是:
- 和 之间的争用条件。这是可以解决的问题,如果它没有,并且某些响应可以非常快(2路等待,可以这么说)
new ExternalService().send()
new ResultReceiver().register(correlationId)
ResultReceiver
-
永无止境的结果:结果可能花费太长时间或只是遇到错误。这些未来的 API 通常提供超时以强制取消请求。例如:
new ResultReceiver().register(correlationId)
.get(10000, TimeUnit.SECONDS);