SpringWebMVC4+;使用Java 8:在服务层进行链式延迟结果回调的最佳方法?

SpringWebMVC4+;使用Java 8:在服务层进行链式延迟结果回调的最佳方法?,java,spring,hibernate,spring-mvc,asynchronous,Java,Spring,Hibernate,Spring Mvc,Asynchronous,更新:我将代码升级到Java8,没有太多麻烦。因此,我想要与Spring4/Java8相关的答案 我正在执行一项任务,以修复Tomcat/Spring 4.2.4/Java 8 web mvc应用程序中的性能问题(请求速率仅为400/s时达到的Tomcat最大线程数为200,请求延迟周期性增加,等等) 这是一个典型的web应用程序,它通过Hibernate查找Mysql,查找每个请求的用户信息等小而频繁的内容,然后通过RestTemplate将实际数据发布/获取到另一个web服务 代码是Java

更新:我将代码升级到Java8,没有太多麻烦。因此,我想要与Spring4/Java8相关的答案

我正在执行一项任务,以修复Tomcat/Spring 4.2.4/Java 8 web mvc应用程序中的性能问题(请求速率仅为400/s时达到的Tomcat最大线程数为200,请求延迟周期性增加,等等)

这是一个典型的web应用程序,它通过Hibernate查找Mysql,查找每个请求的用户信息等小而频繁的内容,然后通过RestTemplate将实际数据发布/获取到另一个web服务

代码是Java7风格的,因为我刚刚迁移到Java8,但是还没有用这种风格编写新代码。(我也在多年后重新使用Spring,所以不确定什么是最好的)

正如在一个普通的应用程序中所期望的那样,服务层调用其他服务获取信息,然后还将信息传递给对DAO的调用。这里有一些依赖回调

设置

  • @已设置EnableSync
  • 我们的Http请求流来自控制器->服务->DAO->REST或Hibernate
样本流

  • 假设控制器收到POST请求R并期望延迟的结果
  • 控制器调用entityXService.save()
  • EntityXService调用userService.findUser(id)
  • UserService调用UserDAO.findUser(id),后者反过来与Hibernate对话
  • UserService将Spring ListenableFuture返回给调用方
  • EntityXService等待中的用户信息(使用回调),并调用EntityXDAO.save(user,R)
  • EntityXDAO调用AsyncRestTemplate.postForEntity(用户,R)
  • EntityXDAO接收延迟结果>,这是我们对响应的数据抽象
  • EntityXDAO处理响应并转换为EntityXDTO
  • 最终,延迟的结果通过与响应相同的链发送回来
  • 在第3步中,EntityXService异步调用UserService.findUser(id),并对EntityXDAO.save(user,R)进行onSuccess回调,这让我迷惑不解。但是,EntityXDAO.save(user,R)现在还从AsyncRestTemplate返回一个延迟结果

    问题:

  • 在这个应用程序中使用DeferredResult是获得并发性的好方法吗
  • 使用Guava的ListenableFuture或Java 8 CompletableFuture是否有助于让它变得更好,而不是使用DeferredResult
  • 我最大的问题和困惑是如何安排一个服务查找中的DeferredResult供另一个服务查找使用,然后最终为最终响应设置一个完全不同返回类型的DeferredResult
  • 是否有一个如何链接此类回调的示例,以及构建此类流的推荐方法?如果这听起来是完全错误的,那么Java7将是正确的选择吗

  • 提前谢谢

    你解决过这个问题吗?我也看到了类似的情况。