java异步执行代码处理方法(先返回结果,后执行代码)

2023-08-06 0 3,512

目录

业务场景

用户那,角色那变更后,要更新数据,因为更新要比较长时间,需要先返回结果(2:已接收待执行)。更新结束后,再返回值结果。

(执行结果. 0:执行失败 ; 1:执行成功; 2:已接收待执行)

处理1: 简单异步

使用 ExecutorService 异步

    public void onCallback(JSONObject param) {
        ExecutorService executor = Executors.newCachedThreadPool();
        executor.execute(() -> {
            try {
                Thread.sleep(1000 * 10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            // 这边执行具体的方法
            this.syncDealResult(param);
        });
        executor.shutdown();
    }
    public JSONObject dealResult(JSONObject params) {
        // 先返回结果,然后异步执行
        this.onCallback(params);
        JSONObject result = new JSONObject();
        result.put(\"excRs\", \"2\");
        return result;
    }
    public void syncDealResult(JSONObject params) {
        logger.info(\"deal abRole param {}\", JSON.toJSONString(params));
        String logId = MapUtils.getString(params, \"logId\");
        String excRs = \"1\";
        try {
            // 具体操作
        } catch (Exception e) {
            e.printStackTrace();
            excRs = \"-1\";
        }
        logger.info(\"update abRole finish callRecordId {}, excRs {}\", logId, excRs);
        // 处理完后推送结果
        JSONObject param = new JSONObject();
        param.put(\"logId\", logId);
        param.put(\"excRs\", excRs);
        // 推送结果
    }

加 Thread.sleep(1000 * 10); 就明显看得出差别了。

如果是有多种异步执行,比如:A执行完后,B要做通知;C要入库;D要做统计,这时候要怎么处理呢?

处理2:多个异步执行

IRoleCallback

import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;
/**
 * AB角色异步调用接口
 *
 */
public interface IRoleCallback {
    /**
     * Computes a result, or throws an exception if unable to do so.
     *
     * @param param 结果
     * @return computed result
     * @throws Exception if unable to compute a result
     */
    Object call(JSONObject param) throws Exception;
    /**
     * unique name of callback
     *
     * @return callback name
     */
    default String name() {
        return StringUtils.uncapitalize(getClass().getSimpleName());
    }
    /**
     * prior to callback 用于排序
     *
     * @return order
     */
    default double order() {
        return 1.0d;
    }
}

RoleCallbackRegister

import java.util.*;
public class RoleCallbackRegister {
    private static final Map<String, IRoleCallback> CALLBACKS = new HashMap<>();
    public static boolean register(IRoleCallback callback) {
        if (CALLBACKS.containsKey(callback.name())) {
            return false;
        }
        CALLBACKS.put(callback.name(), callback);
        return true;
    }
    public static List<IRoleCallback> getCallbacks() {
        List<IRoleCallback> roleCallbacks = new ArrayList<>(CALLBACKS.values());
        roleCallbacks.sort(Comparator.comparingDouble(IRoleCallback::order));
        return roleCallbacks;
    }
}

SpringUtils

@Component
public class SpringUtils implements ApplicationContextAware {
    private static ApplicationContext applicationContext;
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringUtils.applicationContext = applicationContext;
    }
    public static Object getBean(String name) {
        return applicationContext.getBean(name);
    }
    public static <T> T getBean(Class<T> clazz) {
        return applicationContext.getBean(clazz);
    }
}

AbstractRoleCallbackImpl

import com.web.work.common.support.SpringUtils;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
public abstract class AbstractRoleCallbackImpl implements IRoleCallback, InitializingBean {
    protected final Logger logger = LoggerFactory.getLogger(getClass());
    @Override
    public Object call(JSONObject param) throws Exception {
        return doCall(param);
    }
    protected abstract Object doCall(JSONObject param) throws Exception;
    @Override
    public String name() {
        return StringUtils.uncapitalize(getClass().getSimpleName());
    }
    @Override
    public void afterPropertiesSet() {
        boolean register = RoleCallbackRegister.register(SpringUtils.getBean(this.getClass()));
        if (!register) {
            logger.error(\"register role callback name:{} failed.\", name());
        } else {
            logger.info(\"register role callback name:{} succeed.\", name());
        }
    }
}

RoleCallBackService

@Service
public class RoleCallBackService implements InitializingBean, DisposableBean {
    private final static Logger logger = LoggerFactory.getLogger(RoleCallBackService.class);
    private ThreadPoolExecutor pool;
    public void onCallback(JSONObject param) {
        pool.execute(() -> {
            RoleCallbackRegister.getCallbacks().forEach(x -> {
                try {
                    logger.info(\"call {}\", x.name());
                    x.call(param);
                } catch (Exception e) {
                    logger.error(\"回调{}接口失败:\", x.name(), e);
                }
            });
        });
    }
    @Override
    public void afterPropertiesSet() {
        int size = Runtime.getRuntime().availableProcessors() + 1;
        pool = new ThreadPoolExecutor(size, size * 2, 300L, TimeUnit.SECONDS, new LinkedBlockingQueue<>(1000),
                Executors.defaultThreadFactory(), new ThreadPoolExecutor.CallerRunsPolicy());
    }
    @Override
    public void destroy() throws Exception {
        pool.shutdown();
    }
}

RoleUpdateService

@Service
public class RoleUpdateService extends AbstractRoleCallbackImpl {
    private final static Logger logger = LoggerFactory.getLogger(RoleUpdateService.class);
    @Override
    protected Object doCall(JSONObject params) throws Exception {
        Thread.sleep(1000 * 10);
        logger.info(\"deal abRole param {}\", JSON.toJSONString(params));
        String logId = MapUtils.getString(params, \"logId\");
        String excRs = \"1\";
        try {
            // 执行更新操作
        } catch (Exception e) {
            e.printStackTrace();
            excRs = \"-1\";
        }
        logger.info(\"update abRole finish callRecordId {}, excRs {}\", logId, excRs);
        // 处理完后推送结果
        JSONObject param = new JSONObject();
        param.put(\"logId\", logId);
        param.put(\"excRs\", excRs);
        logger.info(\"update role record {}\", JSON.toJSONString(param));
        // 推送结果
        return \"\";
    }
}

先返回结果后执行

    @Resource
    private RoleCallBackService roleCallBackService;
    public JSONObject dealResult(JSONObject params) {
        // 先返回结果,然后异步执行
        try {
            roleCallBackService.onCallback(params);
        } catch (Exception e) {
            e.printStackTrace();
        }
        JSONObject result = new JSONObject();
        result.put(\"excRs\", \"2\");
        return result;
    }

总结:

要先返回结果,后执行内容,需要使用异步的方式,用ExecutorService进行处理。如果是单个的,就直接调用比较简单。如果是多个的,就先要注册下,然后遍历去调用。 

资源下载此资源下载价格为1小猪币,终身VIP免费,请先
由于本站资源来源于互联网,以研究交流为目的,所有仅供大家参考、学习,不存在任何商业目的与商业用途,如资源存在BUG以及其他任何问题,请自行解决,本站不提供技术服务! 由于资源为虚拟可复制性,下载后不予退积分和退款,谢谢您的支持!如遇到失效或错误的下载链接请联系客服QQ:442469558

:本文采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可, 转载请附上原文出处链接。
1、本站提供的源码不保证资源的完整性以及安全性,不附带任何技术服务!
2、本站提供的模板、软件工具等其他资源,均不包含技术服务,请大家谅解!
3、本站提供的资源仅供下载者参考学习,请勿用于任何商业用途,请24小时内删除!
4、如需商用,请购买正版,由于未及时购买正版发生的侵权行为,与本站无关。
5、本站部分资源存放于百度网盘或其他网盘中,请提前注册好百度网盘账号,下载安装百度网盘客户端或其他网盘客户端进行下载;
6、本站部分资源文件是经压缩后的,请下载后安装解压软件,推荐使用WinRAR和7-Zip解压软件。
7、如果本站提供的资源侵犯到了您的权益,请邮件联系: 442469558@qq.com 进行处理!

猪小侠源码-最新源码下载平台 Java教程 java异步执行代码处理方法(先返回结果,后执行代码) http://www.20zxx.cn/806536/xuexijiaocheng/javajc.html

猪小侠源码,优质资源分享网

常见问题
  • 本站所有资源版权均属于原作者所有,均只能用于参考学习,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担
查看详情
  • 最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,建议提前注册好百度网盘账号,使用百度网盘客户端下载
查看详情

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务