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

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

相关代码片段:

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

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

你可能感兴趣的:(java,java,算法,前端)