Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Java同步异步API调用_Java_Spring Boot_Asynchronous_Synchronous - Fatal编程技术网

用Java同步异步API调用

用Java同步异步API调用,java,spring-boot,asynchronous,synchronous,Java,Spring Boot,Asynchronous,Synchronous,考虑以下场景: 服务A调用服务B以完成任务 服务B返回“OK”,并继续以异步方式执行任务 由于A从B接收到OK,它还向调用它的人返回响应 我希望能够同步此任务。服务B是可定制的,因此它可以在任务结束时调用API。我的想法是: 服务A调用服务B以完成任务 服务B返回“OK”,并继续以异步方式执行任务 服务A从B接收响应,但不返回 服务B结束任务,并向A发送API调用(到某个端点等) 服务A接收后返回 这只是一个例子。事实上,服务A是一个Spring引导应用程序,而服务B是我们正在其上构建的第三方软

考虑以下场景:

  • 服务A调用服务B以完成任务
  • 服务B返回“OK”,并继续以异步方式执行任务
  • 由于A从B接收到OK,它还向调用它的人返回响应
  • 我希望能够同步此任务。服务B是可定制的,因此它可以在任务结束时调用API。我的想法是:

  • 服务A调用服务B以完成任务
  • 服务B返回“OK”,并继续以异步方式执行任务
  • 服务A从B接收响应,但不返回
  • 服务B结束任务,并向A发送API调用(到某个端点等)
  • 服务A接收后返回
  • 这只是一个例子。事实上,服务A是一个Spring引导应用程序,而服务B是我们正在其上构建的第三方软件


    可以用Java/Spring同步异步API调用吗?我尝试在网上搜索,但找不到任何合适的信息。

    因此,根据您的请求数据,我将假设存在一个从服务a发送到服务B的唯一id

    如果是这种情况,您可以使用此id作为关联id,并可以使用CompletableFutures实现等待策略。当服务B响应“OK”时,服务A可以使用唯一ID作为键创建一个可完成的未来,并在此基础上调用get(),这将一直阻止,直到调用complete()。当服务B完成其处理时,它可以调用服务A上的API,并将结果与相关id一起调用,现在可以使用该id完成将来的处理

    下面是一些基本的代码,只是为了表达这个想法

    公共类服务a{
    私有地图相关存储;
    公共服务A(){
    correlationStore=新HashMap();
    }
    公共字符串性能任务(字符串id、字符串数据){
    CompletableFutureResult=新的CompletableFuture();
    字符串submissionResult=callServiceB(id,数据);
    如果(!“确定”。相等信号情况(提交结果)){
    返回“失败”;
    }
    //服务B已接受请求,正在忙于处理结果
    correlationStore.put(id,未来结果);
    字符串响应=null;
    试一试{
    //将超时设置为合理的值
    response=futuresult.get(30,TimeUnit.SECONDS);//线程现在被阻塞,直到调用complete()为止
    }捕获(InterruptedException | ExecutionException | TimeoutException e){
    if(例如TimeoutException的实例){
    correlationStore.remove(id);
    }
    //根据您的要求处理故障
    }
    返回响应;
    }
    //这是从服务B的API回调调用的
    公共void onResponse(字符串id、字符串responseData){
    CompletableFuture Pendingreult=correlationStore.remove(id);
    如果(Pendingreult!=null){
    待处理结果完成(响应数据);
    }否则{
    //处理没有未来等待响应的场景
    }
    }
    }
    
    然而,使用这种方法,有许多事情需要考虑,比如如果服务B从未实际调用服务a并产生结果,或者如果您超时等待服务B响应,删除未来,然后响应在稍后阶段返回,您应该如何处理

    但现在这一切都取决于您的服务A所做的事情,以及您在失败方面的具体情况,即在服务A中存储请求的状态,并提供查询状态的机制等


    但是,我强烈建议,根据您项目的灵活性,要研究中间件队列机制,可以使用RabbitMQ/Kafka/Pulsar等,因为它们都为基于工作队列的体系结构提供了强大的功能,并且可以根据您的情况为您提供有用的功能。

    因此,根据您的请求数据的外观,我将假设有一个从服务a发送到服务B的唯一id

    如果是这种情况,您可以使用此id作为关联id,并可以使用CompletableFutures实现等待策略。当服务B响应“OK”时,服务A可以使用唯一ID作为键创建一个可完成的未来,并在此基础上调用get(),这将一直阻止,直到调用complete()。当服务B完成其处理时,它可以调用服务A上的API,并将结果与相关id一起调用,现在可以使用该id完成将来的处理

    下面是一些基本的代码,只是为了表达这个想法

    公共类服务a{
    私有地图相关存储;
    公共服务A(){
    correlationStore=新HashMap();
    }
    公共字符串性能任务(字符串id、字符串数据){
    CompletableFutureResult=新的CompletableFuture();
    字符串submissionResult=callServiceB(id,数据);
    如果(!“确定”。相等信号情况(提交结果)){
    返回“失败”;
    }
    //服务B已接受请求,正在忙于处理结果
    correlationStore.put(id,未来结果);
    字符串响应=null;
    试一试{
    //将超时设置为合理的值
    response=futuresult.get(30,TimeUnit.SECONDS);//线程现在被阻塞,直到调用complete()为止
    }捕获(InterruptedException | ExecutionException | TimeoutException e){
    if(例如TimeoutException的实例){
    correlationStore.remove(id);
    }
    //根据您的要求处理故障
    }
    返回响应;
    }
    //这是从服务B的API回调调用的
    公共void onResponse(字符串i)