通过ExecutorService、Callable、Future实现有返回结果的多线程来处理有轮询业务

        开发中碰到类似受理业务等相关接口一般都是异步获取结果,要么就属于异步回调后再下一步处理业务,要么就定时轮询查询接口获取结果再下一步处理业务流程;此次碰到类似接口是没有异步回调处理,协同系统只提供业务受理接口及查询结果接口,不明确什么时间会有处理完成结果,仅给大概1分钟时间,只好使用轮询的方式查询结果 ;通过ExecutorService、Callable、Future实现有返回结果的多线程来轮询结果判断是否再下一步业务。

相关代码片段:

public Map<String, Object> queryRetry(PayOrder payOrder) {
        final ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
        // 总共轮询查询时间,单位秒
        final int queryTime = 60;
        // 间隔时间,单位秒
        final int queryPeriod = 5;

        // 使用ExecutorService、Callable、Future实现有返回结果的多线程。
        Callable<Object> queryCallable = () -> {
            Thread.sleep(queryPeriod * 1000);
            return this.orderInfoQuery(payOrder);
        };
        //返回map
        Map<String, Object> map = Maps.newHashMap();
        int n = queryTime / queryPeriod;
        for (int i = 0; i <= n; i++) {
            Future<Object> future = service.submit(queryCallable);
            try {
                //获取map结果
                map = (Map<String, Object>)future.get();
                log.info(i + "次轮询查询返参>>" + map);
                //code 编码为0成功
                if ("0".equals(map.get("code"))) {
                    break;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        // 停止线程池
        service.shutdownNow();
        return map;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值