SpringBoot实现异步调用功能

springboot的异步调用功能可以先释放容器分配给请求的线程与相关资源,减轻系统负担,提高响应效率,下图为在一种业务场景下的原理图

 此功能为springboot自带,在启动类添加@EnableAsync注解

@EnableAsync
@SpringBootApplication
public class DemoApplication {

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

 异步调用是会从线程池中获取线程,所以需要配置线程池

@Configuration
public class Config {
    private static final int MAX_POOL_SIZE = 50;

    private static final int CORE_POOL_SIZE = 20;

    @Bean("asyncTaskExecutor")
    public AsyncTaskExecutor asyncTaskExecutor() {
        ThreadPoolTaskExecutor asyncTaskExecutor = new ThreadPoolTaskExecutor();
        asyncTaskExecutor.setMaxPoolSize(MAX_POOL_SIZE);
        asyncTaskExecutor.setCorePoolSize(CORE_POOL_SIZE);
        asyncTaskExecutor.setThreadNamePrefix("异步线程-");
        asyncTaskExecutor.initialize();
        return asyncTaskExecutor;
    }
}

使用时,只需要在方法上添加@Async注解即可,名称可填可不填,它会自动去线程池中获取线程

@Override
    @Async("asyncTaskExecutor")
    public String asynchronousMethod() {
        try {
            //让程序睡10s钟
            Thread.sleep(10000L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("线程名称 :" + Thread.currentThread().getName());
        return "异步调用结束";
    }

    @Override
    public String synchronizationMethod() {
        System.out.println("线程名称 :" + Thread.currentThread().getName());
        return "同步方法调用结束";
    }
@RestController
public class AsynchronousDemoController {

    @Autowired
    private AsynchronousDemoService asynchronousDemoService;


    @GetMapping("/demo/1")
    public String demo() {
        //开始时间
        long startTime = System.currentTimeMillis();
        
        //给当前线程起一个名字
        Thread.currentThread().setName("同步线程");
        //调用异步方法
        String asynchronous = asynchronousDemoService.asynchronousMethod();
        //调用同步方法
        String synchronization = asynchronousDemoService.synchronizationMethod();
        
        //结束时间
        long endTime = System.currentTimeMillis();

        String result = "异步结果: " + asynchronous + ":::::::::::" + "同步结果: " + 
        synchronization +
                "\r\n所用时间: " + (endTime-startTime) + "ms";
        System.out.println(result);

        return result;
    }
}

测试结果:可以看到异步线程是在此次请求结束后才执行完的,所以我们可以用它来处理一些耗时的业务,例如复杂的计算,循环判断等等,可以让前端更快的得到响应.

 

Spring Boot实现异步请求可以通过使用`@Async`注解和`CompletableFuture`类来实现。下面是一个简单的示例代码: 首先,需要在Spring Boot应用程序的配置类上添加`@EnableAsync`注解,以启用异步处理: ```java @Configuration @EnableAsync public class AsyncConfig { // 配置异步任务线程池等相关配置 // ... } ``` 然后,在需要进行异步处理的方法上添加`@Async`注解,告诉Spring该方法需要在异步线程中执行: ```java @Service public class MyService { @Async public CompletableFuture<String> asyncMethod() { // 异步处理的逻辑 // 返回一个CompletableFuture对象,用于获取异步处理结果 return CompletableFuture.completedFuture("异步处理完成"); } } ``` 在上面的示例中,`asyncMethod()`方法被标记为异步方法,并且返回一个`CompletableFuture`对象,表示异步处理的结果。 最后,在Controller类中调用异步方法,并通过`CompletableFuture`获取异步处理的结果: ```java @RestController public class MyController { @Autowired private MyService myService; @GetMapping("/async") public CompletableFuture<String> asyncRequest() { return myService.asyncMethod(); } } ``` 在上述示例中,`asyncRequest()`方法调用了异步方法`asyncMethod()`并返回了一个`CompletableFuture`对象,这样客户端就可以异步获取处理结果。 这是一个简单的示例,你可以根据具体需求来扩展和修改。通过使用`@Async`注解和`CompletableFuture`类,你可以在Spring Boot中方便地实现异步请求处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值