全新轻量 ioc/aop 框架 loveqq,新增 @Await 新特性,支持异步调用自动转同步调用


介绍

@Async:支持自动将普通方法转为异步调用

但是该功能有一个小问题,就是某些业务又需要同步调用时难以实现,特别是返回值为 void 时,这时候只能修改代码兼容两种逻辑

@Async.Await:该注解支持将异步调用自动转为同步调用

直接注解在方法上,那么该方法体的整个调用链路的异步调用都将自动转为同步调用,不仅仅是 @Async 注解的方法,返回值为 Future/CompletionStage 的方法也将自动转为同步调用
    
下面是代码示例:

package com.kfyty.demo;

import com.kfyty.loveqq.framework.boot.K;
import com.kfyty.loveqq.framework.core.autoconfig.CommandLineRunner;
import com.kfyty.loveqq.framework.core.autoconfig.annotation.Async;
import com.kfyty.loveqq.framework.core.autoconfig.annotation.Autowired;
import com.kfyty.loveqq.framework.core.autoconfig.annotation.BootApplication;
import com.kfyty.loveqq.framework.core.autoconfig.annotation.Component;
import com.kfyty.loveqq.framework.core.utils.CommonUtil;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Async
@BootApplication
public class Main implements CommandLineRunner {
@Autowired
private Main main;

@Autowired
private AsyncService asyncService;

@Override
public void run(String... args) throws Exception {
//main.test();
main.testAwait();
}

/**
 * 结果输出 0,因为内部调用的是异步方法
 */
public void test() {
asyncService.asyncProcess();
System.out.println(asyncService.getState());
}

/**
 * 结果输出 1,因为内部调用异步方法自动转为了同步
 */
@Async.Await
public void testAwait() {
asyncService.asyncProcess();
System.out.println(asyncService.getState());
}

public static void main(String[] args) throws Exception {
K.run(Main.class, args);
}

@Async
@Component
public static class AsyncService {
@Getter
private int state = 0;

@Async
public void asyncProcess() {
// 模拟业务耗时
CommonUtil.sleep(500);

// 修改状态
this.state = 1;
}
}
}

新特性注解源码:

package com.kfyty.loveqq.framework.core.autoconfig.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 描述: 用以支持异步任务
 * <b>
 * 仅在类上同时注释时,方法注释才有效
 * </b>
 *
 * @author kfyty725
 * @date 2021/6/26 11:03
 * @email [email protected]
 * @see com.kfyty.loveqq.framework.boot.proxy.AsyncMethodInterceptorProxy
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface Async {
/**
 * 执行该任务的线程池的 bean name,必须是 {@link java.util.concurrent.ExecutorService} 的子类
 */
String value() default "";

/**
 * 用于支持异步方法转同步
 * 被注解的方法中,当在该方法体中(该方法的整个调用链路中)调用其他异步方法时,其他异步方法自动转为同步调用,而无需显示手动等待
 * <p>
 * 其他异步方法包含 {@link Async} 注解的方法,以及返回值为 {@link java.util.concurrent.Future}/{@link java.util.concurrent.CompletionStage} 的可代理方法
 * <b>
 * 仅在类上同时注释 {@link Async} 时,方法注释才有效
 * </b>
 * </p>
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@interface Await {
/**
 * 由于整个调用链路有效,因此如果有某个异步方法必须异步,则可以再次注解该方法,并设置为 false,则可以覆盖之前的设置
 *
 * @return true/false
 */
boolean value() default true;
}
}

感兴趣的同学可以看一下


相關推薦

2024-06-18

loveqq-framework 轻量级 ioc/aop 框架,比 spring 更强大的条件注解推断,打包后支持 jar index 启动。 本次更新: 正式更名为:loveqq-famework 新增:loveqq-boot-starter-mybatis 新增:loveqq-boot-starter-pagehelper 新增:loveqq-boot-starter-shiro

2025-06-11

全量刷新上下文代码示例: package com.kfyty.demo; import com.kfyty.loveqq.framework.boot.K; import com.kfyty.loveqq.framework.boot.context.ContextRefresher; import com.kfyty.loveqq.framework.core.autoconfig.annotation.Autowired; import com.kfyty.loveqq.framework.core.autoconfig.annotat

2024-07-26

框架,即不是模仿 spring,也不是 spring 的二开。而是一个全新的,但又高度符合 spring 开发者使用习惯的完整的 ioc/aop 框架 和 spring 的区别         和 spring 最大的区别就是,loveqq 具有更强大的条件注解推断,因此

2024-05-09

​ kfyty-framework 轻量级 ioc/aop 框架,比 spring 更强大的条件注解推断,打包后支持 jar index 启动,启动速度更快 注解式 ioc/aop、自动装配、异步事件、动态代理、注解式 mvc(支持 Restful)、嵌入式 tomcat、 注解式 jdbc 框架、

2025-05-28

本次更新: 优化:loveqq-boot,事件监听器支持条件表达式 优化:loveqq-core,去除 cglib 代理,使用基于 javassist 的类代理 新增:loveqq-mvc,支持自动暴露公开方法为 post api,进一步减少重复代码 新增:loveqq-boot-starter-test,

2025-05-18

基于Netty TCP与kaka-core领域事件的轻量级RPC框架,相比其它使用各种繁杂设计模式的框架,本框架仅10多个类实现,可谓是极简编码。 基础通信 事件驱动 自定义心跳协议或基于rpc调用的心跳处理 断线重连 同步、future异

2023-11-18

于全异步 Java 服务器 Netty,并扩展了很多其他特性,以其轻量、高性能、支持多语言开发而备受开发者青睐。 Eclipse Vert.x 4.5.0 现已发布,此版本带来了一些新功能,包括虚拟线程支持。亮点更新如下: 虚拟线程 虚拟线程 verti

2024-06-22

;使用完全自由、免费(遵守开源协议)。 ioGame 是一个轻量级的网络编程框架,适用于网络游戏服务器、物联网、内部系统及各种需要长连接的场景。 文档与日志 ioGame javadoc api 框架版本更新日志 (yuque.com) ioGame网络

2025-06-19

ioGame 源码完全开放、最新文档阅读完全开放;使用完全自由、免费(遵守开源协议)。 ioGame 是一个轻量级的网络编程框架,适用于网络游戏服务器、物联网、内部系统及各种需要长连接的场景。 文档与日志 框架版本更

2024-07-25

;使用完全自由、免费(遵守开源协议)。 ioGame 是一个轻量级的网络编程框架,适用于网络游戏服务器、物联网、内部系统及各种需要长连接的场景。 文档与日志 ioGame javadoc api 框架版本更新日志 (yuque.com) ioGame 网络游

2024-06-22

,支持管线编排、效果器、滤镜链。 媒体库 支持全新的分段式拍照流程,支持应用拍照后只消费、直接保存、编辑保存等行为。 支持开发者模式下使用hdc命令读取媒体库公共存储区的图片和视频能力。 支持开发者

2024-08-27

;使用完全自由、免费(遵守开源协议)。 ioGame 是一个轻量级的网络编程框架,适用于网络游戏服务器、物联网、内部系统及各种需要长连接的场景。 文档与日志 ioGame javadoc api 框架版本更新日志 (yuque.com) ioGame 真。轻

2024-07-09

;使用完全自由、免费(遵守开源协议)。 ioGame 是一个轻量级的网络编程框架,适用于网络游戏服务器、物联网、内部系统及各种需要长连接的场景。 文档与日志 ioGame javadoc api 框架版本更新日志 (yuque.com) ioGame 网络游

2024-08-09

;使用完全自由、免费(遵守开源协议)。 ioGame 是一个轻量级的网络编程框架,适用于网络游戏服务器、物联网、内部系统及各种需要长连接的场景。 文档与日志 ioGame javadoc api 框架版本更新日志 (yuque.com) ioGame 真.轻