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

从@Async函数调用获取数据

邹京
2023-03-14

大家好,我是java多线程新手。有人能帮我吗:

我的服务:

@Async
public List<String> doSomething(int a){
    //Do something
    return list;
}

SpringBoot应用程序:

@SpringBootApplication
@EnableAsync
public class Test {

    public static void main(String[] args) {
        SpringApplication.run(Test.class, args);
    }

}

异步配置:

@Configuration
@EnableAsync
public class AsyncConfig {

    @Bean(name ="taskExecutor")
    public Executor taskExecutor(){
        ThreadPoolTaskExecutor executor=new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(2);
        executor.setMaxPoolSize(2);
        executor.setQueueCapacity(100);
        executor.setThreadNamePrefix("userThread-");
        executor.initialize();
        return executor;
    }
}

控制器:

@RestController
public class Controller{
    
    @Autowired
    private Service service;

    @GetMapping("test")
    public List<String> getAll(){
        return service.doSomething(1);
    }
}

当我点击这个来自邮递员的get请求时,它在响应中显示为空白。我知道我的调用是异步进行的,响应甚至在调用我的方法之前就回来了。有没有办法通过更改邮递员或Spring启动应用程序中的一些设置来查看此响应

共有3个答案

韦宏扬
2023-03-14

如果您想使用async,我会将您的单个请求分成所谓的“开始任务”和“获取任务结果”请求。您的应用程序为“开始任务”请求返回“请求id”。然后在执行“获取任务结果”时使用“请求id”。这种情况是批处理任务中的常见方式。如果您使用Spring,您可能会对Spring批处理框架感兴趣,该框架具有启动/停止/重启作业功能。

景育
2023-03-14

你可以回到未来。当CompleteableFuture完成时,您将收到http响应。

服务:

@Async
public CompletableFuture<List<String>> doSomething() {
    return CompletableFuture.completedFuture(Arrays.asList("1", "2", "3"));
} 

控制器:

@GetMapping("test")
public CompletableFuture<List<String>> getAll(){
    return service.getAll();
}
端木承业
2023-03-14

如果您希望异步处理请求,但也希望API客户端在完成处理后接收响应,这样从客户端的角度来看,请求处理看起来仍然是同步的,关键是使用Servlet3异步处理功能。

您不需要使用@Aysnc将其配置为在服务级别异步执行。而是将控制器方法配置为返回CompletableFuture。在封面下,它将触发Servlet3的异步请求处理,该处理将在接收请求的HTTP线程之外的另一个线程中处理该请求。

所以你的代码应该是这样的:

public class Service {
    
    //No need to add @Async
    public List<String> doSomething(int a){
        return list;
    }
}


@RestController
public class Controller{
    
    @Autowired
    private Service service;

    @GetMapping("test")
    public CompletableFuture<List<String>> getAll(){
        return CompletableFuture.supplyAsync(()->service.doSomething(1));
    }
}

有关spring mvc支持的Servlet3异步请求处理的详细信息,您可以参考本系列博客,从这里开始。

 类似资料:
  • 问题内容: 我正在编写Go程序。从这个Go程序中,我想调用另一个文件中定义的Python函数并接收该函数的返回值,以便可以在Go程序的后续处理中使用它。我在将所有返回的数据恢复到我的Go程序时遇到了麻烦。以下是我认为可行的最低示例,但显然无效: gofile.go pythonfile.py 如果我打电话,我得到以下输出: 一些注意事项: 我在Python调用中使用该标志,因此可以直接调用该函数。

  • 我正在开发我的第一个WP插件,我被卡住了。 我在内容编辑器下面的帖子页面上创建了一个定制字段(字段1)。它保存正确。:) 添加媒体时,我在媒体库弹出窗口中创建了一个自定义字段(字段2)。它保存正确。:) 我想做的是使用字段1中的值作为字段2的默认值。 我怀疑问题出在attachment_fields_to_edit回调函数中。 我认为$post现在指的是实际的“文件附件帖子”,而不是帖子本身,所以

  • 问题内容: 我已经在数据库中编写了一个简单的函数。从我的源代码中,我像这样调用此函数 我的数据正确无误,但数据集的表头显示的是我的函数名(),而不是和。在这种情况下如何获取数据? 目前的输出是 但是我想输出如下: 我正在努力实现以下目标: 以下查询工作正常: 问题答案: 当函数返回结果集时,您应该使用。 不要将用于设置返回函数的调用放入选择列表。

  • 上一节介绍了 Promise 对象,我们可以很方便地利用 Promise 将过去基于回调函数的异步过程改造成基于链式调用实现,这样更符合我们线性的思维习惯。但实践过程中发现,这种链式调用的异步方案仍然不够直观,我们更希望采用类似于同步函数的书写方式来实现异步。因此在 ES2017 标准中引入了 Async 函数(Async Functions)用于进一步简化异步编程。 需要注意的是,由于 Asyn

  • 我想对签名为的方法进行单元测试 连接对象使用 并在测试时传递给methodA。 神谕sql。数组有一个构造函数 methodA具有获取ArrayDescriptor的逻辑。它还具有为该构造函数提供第三个参数的逻辑,但它将其作为对象数组提供 我模拟这两组逻辑,并传递一个模拟的ArrayDescriptor对象和一个模拟的对象数组。所有这些模仿都是正确的。 所以我的构造函数调用就像 当作为测试的一部分