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

我是否应该在每个服务方法上都添加@Async,以使我的应用程序在Spring中完全支持异步?

燕凯旋
2023-03-14

我有一个非常简单的控制器,如下所示:

    @RequestMapping(value = "food", method = RequestMethod.POST)
    public ResponseEntity<?> getAll(@RequestParam("term") String term) {

        List<Food> foods = foodService.findByNameMatching(term);

        return new ResponseEntity<>(foods, HttpStatus.OK);
    }

以及服务:

@Service
@Transactional
public class FoodService {

    @Autowired
    private FoodRepository foodRepository;


    public List<Food> findByNameMatching(String name) {
        return foodRepository.findMatchName(name);
    }
}

食品储备只是一种储备。

到目前为止,流将是:控制器--

现在,我希望我所有的RESTAPI都支持异步。在这种情况下,服务调用存储库来查询数据。我是否应该将@Async注释放在FoodService的方法中,使查询任务成为异步的?。

@Async
public List<Food> findByNameMatching(String name) {
         return foodRepository.findMatchName(name);
}

在扩展中,我是否应该将@Async注释放在我的服务的所有方法中,以使我的应用程序完全支持异步?。

据我所知,Spring中的@Async注释支持异步,而Callable和DeferredResult做同样的事情,那么我应该选择哪种情况呢?。

共有1个答案

冀阳文
2023-03-14

@Async与控制器中的Future int the service和DefferredResult结合使用。看见http://spring.io/guides/gs/async-method/

你的餐饮服务。findByNameMatching必须返回java8 CompetableFuture或Spring ListenableFuture或just Future。您的控制器将返回不同的结果。

@Async
public CompletableFuture<List<Food>> findByNameMatching(String name) {
         return CompletableFuture.completedFuture(foodRepository.findMatchName(name));
}    

不要忘记启用应用程序异步。通过spring boot,您可以使用@enableSync。

您希望异步工作的那些API应该根据上述注释进行更改。

 类似资料:
  • 我是RxJava新手,目前正在使用RxJava版本1。我的用例就像我必须进行一次rest API调用(使用rest模板)。因此,使用调度器是更好的主意吗。在这种情况下,每次都可以使用computation()或任何调度器。 我的课程是 SampleController。Java语言 服务Java语言 在这里,我使用Schedulers来启动新线程。但我再次使用延迟结果进行即时响应,Spring将把

  • 考虑注入bean作为其接口之一,或者通过在@enableAsync和/或@enablecaching上设置ProxyTargetClass=true强制使用基于CGLIB的代理。 如果我尝试注释控制器,我得到的get请求的响应是空的。我尝试了每一件事,包括将设置为true。

  • Whitelabel错误页面此应用程序没有 /error的显式映射,因此您将此视为后备。 IRDT 2022年4月26 16:10:15日星期二出现意外错误(类型=未找到,状态=404)。找不到JSP文件[/WEB-INF/jsp/home.jsp] 我已将前缀和sufix添加到我的应用程序中。属性: 这是我的控制器类: 我在控制器类中有1个警告: 我的项目文件夹图片 我的应用类: home.js

  • 到目前为止,我一直认为容器技术(例如:docker)提供了所需的隔离和操作系统级虚拟化。在容器中运行的应用程序受到名称空间、cgroup、设备/selinux、功能的限制,他们无法弄清楚自己所处的主机环境。但是这种理解似乎不是100%正确的。 与wiki-OS级虚拟化一样 操作系统级虚拟化是一种操作系统范例,其中内核允许存在多个独立的用户空间实例。这些实例称为容器(LXC、Solaris容器、Do

  • 问题内容: 我的团队正在开发一种具有Web前端的面向服务的新产品。在讨论我们将使用哪些技术时,我们决定运行JBoss应用程序服务器,Flex前端(可能使用Adobe AIR进行桌面部署)和Web服务来连接客户端和服务器。 在将哪种服务器技术用于我们的业务逻辑方面,我们陷入了僵局。最大的争论是在EJB3和Spring之间,我们最大的担忧是可伸缩性和性能以及代码库的可维护性。 这是我的问题: 支持或反

  • 问题内容: 我应该在哪里为我的Java应用程序存储凭据以访问第三方服务? 凭据不是我的应用程序上每个用户都特定的。它们用于访问我的应用程序正在使用的Web服务。我知道足够多,不可以将它们硬编码到我的应用程序中,但是我在哪里以及如何存储它们呢?我还假设它们将需要加密。 问题答案: 以@Zildyan的答案,评论和对其他答案的引用为基础。 有几个选项 ,其中 存储: 数据库 属性文件 常数(硬编码)