java异步转同步

1.异步转同步,线程池提交任务,阻塞获取结果

ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) ThreadUtils.newDaemonFixedThreadExecutor("PodActionService"
            , Runtime.getRuntime().availableProcessors() + 1);

 public void delete(String instanceId) throws ExecutionException, InterruptedException {
        Future<ResourceStatus> future = threadPoolExecutor.submit(new DeletePodThread(instanceId));
        ResourceStatus resourceStatus = future.get();
        LOG.info("instanceId : {} destroy status : {}",instanceId,resourceStatus);
}

2.线程任务,返回值类型ResourceStatus枚举

public class DeletePodThread implements Callable<ResourceStatus> {

        public DeletePodThread(String instanceId) {
            this.instanceId = instanceId;
        }

        private String instanceId;

        @Override
        public ResourceStatus call() throws Exception {
            QueryWrapper<FamaVm> vmQueryWrapper = Wrappers.query();
            vmQueryWrapper.eq(FamaVm.INSTANCE_ID_COLUMN,instanceId);
            FamaVm famaVm = famaVmMapper.selectOne(vmQueryWrapper);
            if (null == famaVm){
                return null;
            }
            QueryWrapper<FamaPin> pinQueryWrapper = Wrappers.query();
            pinQueryWrapper.eq(FamaPin.PIN_COLUMN,famaVm.getPin());
            pinQueryWrapper.eq(FamaPin.PIN_ALIAS_COLUMN,famaVm.getPinAlias());
            FamaPin famaPin = famaPinMapper.selectOne(pinQueryWrapper);
            if (null == famaPin){
                return null;
            }
            PodService podService = new PodService(famaPin);
            DeletePodResponse deletePodResponse = podService.delete(famaVm);
            if (null != deletePodResponse.getError() && deletePodResponse.getError().getStatus().equalsIgnoreCase("NOT_FOUND" )){
                return ResourceStatus.DELETED;
            }
            InstanceStatus resourceStatus = describeResStatus(podService,famaVm);
            while (!resourceStatus.typeIsFinished()){
                ThreadUtils.sleep(Constants.SLEEP_TIME_MILLIS);
                resourceStatus = describeResStatus(podService,famaVm);
            }
            famaVmMapper.updateById(famaVm);
            ResourceInstance resourceInstance = processInstanceMapper.selectById(famaVm.getResourceInstanceId());
            resourceInstance.setState(resourceStatus);
            processInstanceMapper.updateById(resourceInstance);
            return famaVm.getState();
        }
    }
posted @   SpecialSpeculator  阅读(425)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
点击右上角即可分享
微信分享提示