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

Spring Boot REST-对单个作业使用ThreadPoolTaskExecutor

宗政斌
2023-03-14

我加入了公司的一个新团队,我看到他们广泛使用“ThreadPoolTaskExecutor”。它基本上是前端的后端REST应用程序,它调用其他SOAP API并将结果返回给客户机--只是一个传递。99%的情况下,每个RESTendpoint只调用单个SOAP API,并将json格式的响应返回给客户机。然而,尽管这只是一个SOAP调用,但它们使用了“ThreadPoolTaskExecutor”并调用了.get()阻塞方法。

@Configuration类上的ThreadPoolTaskExecutor@Bean:

@Bean(name=“soapAsyncExecutor")
@Qualifier("soapAsyncExecutor")
   public ThreadPoolTaskExecutor getSoapAsyncExecutor() {
    final ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    final ThreadFactory customThreadfactory = new ThreadFactoryBuilder()
        .setNameFormat(“SoapExecutor-%d")
        .setUncaughtExceptionHandler(uncaughtExceptionHandler())
        .setDaemon(true)
        .build();
    executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
    executor.setCorePoolSize(80);
    executor.setMaxPoolSize(200);
    executor.setQueueCapacity(80);
    executor.setKeepAliveSeconds(60);
    executor.setAllowCoreThreadTimeOut(true);
    executor.setThreadFactory(customThreadfactory);
    executor.afterPropertiesSet();
    return executor;
   }

@service上的代码:

@Async("soapAsyncExecutor")
@Override
public Future<OrderInfo> getOrderInfoAsync(final String orderId) {
    return new AsyncResult<OrderInfo>(this.getOrderInfo(orderId);
}

private OrderInfo getOrderInfo(final String orderId) {
    // return result from SOAP call which typically take 1 second
}

然后从上面的@RestController异步方法调用如下:

@GetMapping(value = "/order/{orderId}")
public OrderInfo getOrderInfo(@PathVariable("orderId") final String orderId) {
   OrderInfo orderInfo = orderService.getOrderInfoAsync(orderId).get();
   return orderInfo;
}
  1. 主线程的官方状态是什么--“阻塞”还是“等待”?如果阻塞,那么对单个作业使用这样的“ThreadPoolTaskExecutor”是否有一点好处,因为它会使主线程阻塞?
  2. 可以以任何方式对此代码进行调整以带来好处吗?或者在RestControllerendpoint内对单个作业使用异步编程没有意义吗?

共有1个答案

章宏恺
2023-03-14

主线程的官方状态是什么--“阻塞”还是“等待”?

被封锁了。

如果阻塞了,对单个作业使用这样的“ThreadPoolTaskExecutor”是否有一点好处,因为它会阻塞主线程?

这段代码可以以任何方式进行调整以带来好处吗?或者在RestControllerendpoint内对单个作业使用异步编程没有意义吗?

当然可以。这里有一个例子。这里还有一个。本质上,在您的场景中,只返回completablefuture就足够了,而不是调用.get()

 类似资料:
  • 我正在开发一个REST API,使用Spring Boot启动数据Rest。我想与JPA同步的一个类是User类,其中包含有关用户的信息,包括谁被允许访问API。 不幸的是,拥有用户和UserRepository意味着我的用户类在API中公开。我能够删除Id(在configureRepositoryRestConfiguration函数中)、用户名和密码(通过向我的用户类的每个变量添加@JsonI

  • 我正在使用Hadoop处理一个mapreduce项目。我目前有3个连续的工作。 我想使用Hadoop计数器,但问题是我想在第一个作业中进行实际计数,却在第3个作业的reducer中访问计数器值。 我怎样才能做到这一点呢?我应该在哪里定义?我需要通过它扔第二个工作吗?这也将有助于看到一些代码示例这样做,因为我还没有找到任何东西。 注意:我使用的是Hadoop 2.7.2 编辑:我已经尝试了这里解释的

  • 问题内容: 我在负载均衡器后面有一层相同的应用程序服务器。出于操作原因,我的约束是两个应用程序服务器上的应用程序配置必须相同,以便可以轻松添加和删除节点。所有应用服务器共享相同的数据库。应用服务器未/将不会集群。 到现在为止,它一直运行良好,但是现在我希望有一个计划的作业,该作业恰好在其中一个应用程序服务器上执行。所有应用服务器都将运行Quartz,并且具有相同的运行时间表。触发器将在每台应用服务

  • 我在Spring boot应用程序中有一个quartz调度作业,通过每5分钟激发一次的方法,将一个大列表中的项目发送到一些webservices。 我在下面的代码中尝试了一个,其池大小为5个线程。然而,当我执行并检查作业日志时,它说作业只需几秒钟就完成了,但发送所有数据需要几分钟。它继续正常工作,但工作似乎在几秒钟内完成。它可能表示在设置了所有线程之后作业就完成了。这是我避免的,因为我不知道作业执

  • 问题内容: 我想确定显示点集合所需的最小面积。最简单的方法是像这样遍历整个集合: 我开始了解流。为此,您可以执行以下操作: 两者给出相同的结果。但是,尽管流方法很优雅,但速度却慢得多(如预期的那样)。 有没有办法让,,并在一个单一的流操作? 问题答案: 与类推,创建一个收集所需信息的类。它定义了两种方法:一种用于记录a的值,一种用于组合两个的值。 然后,您可以将收集到中。 更新 我完全对 OP得出

  • 我想用Quartz实现下面的算法,但不确定是否可以做到。这是我第一次尝试使用石英。 用户通知作业-此作业计算每月报告并向用户发送电子邮件,它需要用户id和用于生成自定义用户报告的其他参数 可能需要生成10,000多个这样的报告 null 如何确保每月作业在单个事务中执行,以便识别所有需要每月报告的用户,并安排作业通知他们 如何立即安排作业在创建它们的作业之后立即执行? 我用的是Spring 3.2