我在应用程序中使用Spring Boot@async实现了一个方法的异步执行。我有一个自定义线程池有20个线程。在调用async方法30次的for循环中。
每个单独的请求都是异步执行的,但是当我从浏览器向API同时发出两个不同的请求时,第一个请求是执行的,然后是第二个请求。不能同时执行同一方法的两个请求。
我们能为每个单独的请求有单独的线程池吗。或者我们可以使每个请求的执行独立于其他请求处理的任何方式。
这是我的代码示例。
@SpringBootApplication
@EnableAsync
public class AppBootStrap
{
public static void main(String[] args)
{
SpringApplication.run(AppBootStrap.class, args);
}
@Bean
public AsyncTaskService asyncTaskService() {
return new AsyncTaskService();
}
@Bean(name="customExecutor")
public Executor taskExecutor() {
ThreadPoolTaskExecutor poolExecutor = new ThreadPoolTaskExecutor();
poolExecutor.setCorePoolSize(10);
poolExecutor.setMaxPoolSize(20);
poolExecutor.setThreadNamePrefix("customPoolExecutor");
poolExecutor.initialize();
return poolExecutor;
}
}
**Controller Class:**
@RestController
public class TaskController
{
@Autowired
private TaskService taskService;
@RequestMapping("/performAction")
public void performAction() {
taskService.performAction();
}
}
**Service class**
@Service
public class TaskService
{
@Autowired
private AsyncTaskService asyncTaskService;
public void performAction()
{
for(int i = 0; i < 30; i++) {
asyncTaskService.greetings(i);
}
}
}
**Async Method Class**
public class AsyncTaskService
{
@Async
public void greetings(Integer i)
{
try
{
Thread.sleep(500 * (i + 10));
}
catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println("Welcome to Async Service: " + i);
}
}
我认为问题在于customExecutor bean是一个单例。这意味着当第二个请求尝试使用这个bean时,它会发现thred池中的所有线程都很忙。您可以尝试通过使用@scope(“prototype”)注释来使customExecutor bean不是单例的,每当请求这种类型的bean时,这将导致实例化一个新的bean。
给stackoverflow社区的人们。我正在寻找一些帮助,以解决HikariCP连接池面临的问题。 高级:我正在尝试使用线程池创建多个线程,我的计划是为每个工作线程提供独立于HikariCP的连接,但HikariCP所做的是在多个线程之间共享一个公共连接。我正在使用 以检索DB连接。现在,当我关闭一个连接时,我在其他线程中看到问题,说连接关闭了,线程正在处理的批次记录被丢弃。 以下是我的日志文件
我有一个WebLogic10.3服务器和一个部署在上面的ear应用程序。 谢谢你,亚历克斯
我对所有这些异步/多线程lib和本地clojure功能感到迷茫。 我有一个Web服务,它调用外部API,转换它响应,然后回馈给客户端。现在是用Python编写的。我想让每个客户端在单独的线程中执行其请求,这样它们就不会等待彼此完成,或者服务器是异步的。不涉及繁重的计算,只需等待IO。 我原以为使用clojure会很容易,但是我忽略了一些东西...Aleph是异步服务器吧?然而,当我在请求处理程序中
我的程序使用Java脚本API,可以同时评估一些脚本。它们不使用共享脚本对象、绑定或上下文,但可以使用相同的和对象。我发现Java8中的OracleNashorn实现不是多线程的,返回,文档中说: 引擎实现不是线程安全的,不能用于在多个线程上并发执行脚本。 这是否意味着我应该为每个线程创建一个单独的实例?此外,文档中没有提到并发使用,而是: 每个已编译脚本都与一个脚本引擎相关联 可以假设线程安全依
我想同时向一个webservice发送webservice调用。最多应有20个并行请求等待webservice响应。任何其他请求都应该等待它们完成。 如果一个用户向我发送一个请求,这通常会导致向目标服务器发送5个并行请求。因此,我一次最多可以服务20/5=4个用户。其他人将不得不等待,这很好。或者被高负荷拒绝。 问题:我应该使用哪个线程池,以及如何配置它? 我读了上面的内容如下:主池可以向网络服务
问题内容: 我正在使用Square的Retrofit库进行短暂的网络调用。我在每个请求中都包含了一些数据作为参数。像这样: 必须定义并且对于中概述的每个单个端点都是很麻烦的。有没有一种方法可以设置每个请求应包含的基本参数集?类似于我们如何设置共同点? 问题答案: 您可以通过将一个自定义RequestInterceptor添加到RestAdapter来确保所有请求都具有这些查询参数。