Flink--AsyncI/O

使用异步IO查询高德地图关联数据

/**
 * 封装数据的对象
 */
public class OrderBean {
    public String oid;

    public String cid;

    public Double money;

    public Double longitude;

    public Double latitude;

    public String province;

    public String city;

    public OrderBean(){}
    public OrderBean(String oid, String cid, Double money, Double longitude, Double latitude) {
        this.oid = oid;
        this.cid = cid;
        this.money = money;
        this.longitude = longitude;
        this.latitude = latitude;
    }

    public static OrderBean of(String oid, String cid, Double money, Double longitude, Double latitude) {
        return new OrderBean(oid, cid, money, longitude, latitude);
    }

    @Override
    public String toString() {
        return "OrderBean{" + "oid='" + oid + '\'' + ", cid='" + cid + '\'' + ", money=" + money + ", longitude=" + longitude + ", latitude=" + latitude + ", province='" + province + '\'' + ", city='" + city + '\'' + '}';
    }
}
public class AsyncIODemo {

    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        //测试数据
        //{"oid": "o1000", "cid": "c10", "money": 99.99, "longitude": 116.413467, "latitude": 39.908072}
        //{"oid": "o1001", "cid": "c11", "money": 99.99, "longitude": 115.413467, "latitude": 39.908072}
        //{"oid": "o1000", "cid": "c10", "money": 99.99, "longitude": 116.413467, "latitude": 39.908072}
        //{"oid": "o1001", "cid": "c11", "money": 99.99, "longitude": 116.413467, "latitude": 39.908072}
        //{"oid": "o1000", "cid": "c10", "money": 99.99, "longitude": 116.413467, "latitude": 39.908072}
        //{"oid": "o1001", "cid": "c11", "money": 99.99, "longitude": 116.413467, "latitude": 39.908072}
        DataStreamSource<String> lines = env.socketTextStream("linux01", 7777);
        //使用异步IO进行查询关联信息
        //unorderedWait发送请求返回的结果与发送请求的先后顺序可以一致
        //orderedWait发送请求返回的结果与发送请求的先后顺序一致
        SingleOutputStreamOperator<OrderBean> result = AsyncDataStream.unorderedWait(lines, new AsyncHttpQueryFunction(), 2000, TimeUnit.MILLISECONDS, 10);

        result.print();

        env.execute();


    }

    private static class AsyncHttpQueryFunction extends RichAsyncFunction<String,OrderBean>{
        private String key = "30b53366c61ebb8385081113dd875e49";
        private transient CloseableHttpAsyncClient httpAsyncClient;
        @Override
        public void open(Configuration parameters) throws Exception {
            //获取连接
            RequestConfig requestConfig = RequestConfig.custom()
                    .setConnectTimeout(3000)    //设置连接的超时时间
                    .setSocketTimeout(3000)     //设置Socket超时时间
                    .build();
             httpAsyncClient = HttpAsyncClients.custom()
                    .setMaxConnTotal(20)        //设置最大请求的个数
                    .setDefaultRequestConfig(requestConfig)
                    .build();
             httpAsyncClient.start();
        }

        @Override
        public void asyncInvoke(String input, ResultFuture<OrderBean> resultFuture) throws Exception {

            try {
                //将输入的数据转换成Bean
                OrderBean orderBean = JSON.parseObject(input, OrderBean.class);
                String latitude = orderBean.latitude;
                String longitude = orderBean.longitude;
                String uri = "https://restapi.amap.com/v3/geocode/regeo?output=json&location="+longitude+","+latitude+"&key="+key;
                HttpGet httpGet = new HttpGet(uri);
                Future<HttpResponse> future = httpAsyncClient.execute(httpGet, null);

                CompletableFuture.supplyAsync(new Supplier<OrderBean>() {

                    @Override
                    public OrderBean get() {
                        try {
                            HttpResponse response = future.get();

                            if (response.getStatusLine().getStatusCode() == 200) {

                                //将获取的数据转成字符串
                                String result = EntityUtils.toString(response.getEntity());
                                //转换成json对象
                                JSONObject jsonObject = JSON.parseObject(result);
                                JSONObject regeocode = jsonObject.getJSONObject("regeocode");
                                if (regeocode != null && !regeocode.isEmpty()) {
                                    JSONObject addressComponent = regeocode.getJSONObject("addressComponent");
                                    orderBean.province = addressComponent.getString("province");
                                    orderBean.city = addressComponent.getString("city");
                                    orderBean.district = addressComponent.getString("district");
                                }
                            }
                            return orderBean;

                        }catch (Exception e){
                            return orderBean;
                        }
                    }
                }).thenAccept(new Consumer<OrderBean>() {
                    @Override
                    public void accept(OrderBean orderBean) {
                        resultFuture.complete(Collections.singleton(orderBean));
                    }
                });
            }catch (Exception e){
                e.printStackTrace();
            }
        }

        @Override
        public void close() throws Exception {
            //释放资源
            httpAsyncClient.close();
        }
    }
}

使用异步IO关联MySQL中的数据

public class AsyncQueryFromMySQLDemo {
    public static void main(String[] args) throws Exception {

        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        DataStreamSource<String> lines = env.socketTextStream("linux01", 7777);
        int maxConnTotal =20 ;
        SingleOutputStreamOperator<Tuple2<String, String>> result = AsyncDataStream.orderedWait(lines, new AsyncQueryMySQL(maxConnTotal), 1000, TimeUnit.MILLISECONDS, 20);

        result.print();

        env.execute();


    }


    private static class AsyncQueryMySQL extends RichAsyncFunction<String, Tuple2<String,String>>{
        private transient ExecutorService pool;
        private transient DruidDataSource druidDataSource;
        private int maxConnTotal ;

        public AsyncQueryMySQL(int maxConnTotal) {
            this.maxConnTotal = maxConnTotal;
        }

        @Override
        public void open(Configuration parameters) throws Exception {
            //创建线程池
            pool = Executors.newFixedThreadPool(maxConnTotal);
            //创建MySQL连接池
            druidDataSource = new DruidDataSource();
            druidDataSource.setUrl("jdbc:mysql://localhost:3306/test");
            druidDataSource.setUsername("root");
            druidDataSource.setPassword("root");
            druidDataSource.setMaxActive(maxConnTotal);

        }

        @Override
        public void asyncInvoke(String id, ResultFuture<Tuple2<String, String>> resultFuture) throws Exception {
            Future<String> future = pool.submit(new Callable<String>() {
                @Override
                public String call() throws Exception {
                    return query(id);
                }
            });

            CompletableFuture.supplyAsync(new Supplier<String>() {
                @Override
                public String get() {
                    try {
                        return future.get();
                    } catch (Exception e) {
                        return null;
                    }
                }
            }).thenAccept(new Consumer<String>() {
                @Override
                public void accept(String name) {
                    resultFuture.complete(Collections.singleton(Tuple2.of(id,name)));
                }
            });

        }

        public String query(String id) throws SQLException {
            String name = "未知";
            DruidPooledConnection conn = null;
            PreparedStatement preparedStatement = null;
            ResultSet rs = null;
            try {
                //获取连接
                conn = druidDataSource.getConnection();
                String sql ="select name from tb_data where id = ?";
                //获取预编译对象
                preparedStatement = conn.prepareStatement(sql);
                preparedStatement.setString(1,id);
                //执行查询
                rs = preparedStatement.executeQuery();
                while (rs.next()){
                    name = rs.getString("name");
                }
            }finally {
                if (rs != null){
                   rs.close();
                }

                if (preparedStatement != null){
                   preparedStatement.close();
                }

                if (conn != null){
                    conn.close();
                }
            }
            return name;
        }

        @Override
        public void close() throws Exception {
            //关闭连接
            pool.shutdown();
            druidDataSource.close();
        }
    }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值