Vertx-web compose新姿勢(shì)

現(xiàn)在版本3.8.4,加入Promise之后,邏輯更加清楚了,因?yàn)橛悬c(diǎn)閑,重構(gòu)下以前寫(xiě)的小小的web。
1.如果是單次訪問(wèn),那么不需要compose,來(lái)做個(gè)簡(jiǎn)單封裝。

    /**
     * 查詢(xún)數(shù)據(jù)集
     * 
     * @param ctx
     * @param sql
     * @param params
     */
    public static void rows(RoutingContext ctx, String sql, JsonArray params) {
        HttpServerResponse res = ctx.response();
        res.putHeader("content-type", "application/json");
        SQLClient client = ConfigVerticle.client;
        CallResult<List<JsonObject>> result = new CallResult<List<JsonObject>>();
        try {
            client.getConnection(cr -> {
                if (cr.succeeded()) {
                    SQLConnection connection = cr.result();
                    if (connection != null) {
                        connection.queryWithParams(sql, params, qr -> {
                            if (qr.succeeded()) {
                                res.end(result.ok(qr.result().getRows()).toString());
                            } else {
                                res.end(result.err().toString());
                            }
                            connection.close();
                        });
                    } else {
                        res.end(result.err("the DB connect is null.").toString());
                    }
                } else {
                    res.end(result.err("get DB connect err.").toString());
                }
            });
        } catch (Exception e) {
            res.end(result.err(e.getMessage()).toString());
            e.printStackTrace();
        }
    }

調(diào)用也是非常方便的,片段:

    /**
     * 工作聯(lián)系單時(shí)間線(xiàn)查詢(xún)
     */
    public void handleTimeline(RoutingContext ctx) {
        JsonObject rp = ctx.getBodyAsJson();
        String sql = "select a.*,b.contactType from contact_log a,contact b " + //
                " where a.contactId = ? and a.contactId = b.contactId order by a.operationdate";
        JsonArray params = new JsonArray().add(rp.getInteger("contactId"));
        JdbcHelper.rows(ctx, sql, params);
    }

2.如果是多次訪問(wèn),且要保持隊(duì)形的,可將訪問(wèn)封裝成Future,并以Function<>或Supplier<>接口包裹,如果需要上次訪問(wèn)結(jié)果的用Function,如不需要傳值,用Supplier即可。片段:

                // 1.1 添加-ID
                Supplier<Future<Integer>> getIdFuture = () -> {
                    Future<Integer> f = Future.future(promise -> {
                        String sql = "select f_getSequ(?) as seq from dual";
                        JsonArray params = new JsonArray().add("LXDSEQ");
                        connection.queryWithParams(sql, params, r -> {
                            if (r.succeeded()) {
                                promise.complete(r.result().getRows().get(0).getInteger("SEQ"));// newId
                            } else {
                                promise.fail("get contact id error.");
                            }
                        });
                    });
                    return f;
                };
                // 1.2 添加-保存聯(lián)系單信息
                Function<Integer, Future<Integer>> sf = newId -> {
                    Future<Integer> f = Future.future(promise -> {
                        String sql = "insert into contact(contactid,contacttype,department,"http://
                                + "linkman,phone,linksystem,contactlevel,content,status,checkinuser,"http://
                                + "checkindate,infin,finlink) values(?,?,?,?,?,?,?,?,?,?,?,?,?)";
                        JsonArray params = new JsonArray();
                        params.add(newId);
                        params.add(rp.getString("contactType"));// contactType
                        params.add(rp.getString("department"));// department
                        params.add(rp.getString("linkman"));// linkMan
                        params.add(rp.getString("phone"));// phone
                        params.add(rp.getString("linkSystem"));// linkSystem
                        params.add(rp.getString("contactLevel"));// contactLevel
                        params.add(rp.getString("content"));// content
                        params.add("CHECKIN");// status
                        params.add(rp.getString("checkinUser"));// checkinUser
                        params.add(rp.getString("checkinDate"));// checkinDate
                        params.add(rp.getString("inFin"));// inFin
                        params.add(rp.getString("finLink"));// finLink
                        connection.updateWithParams(sql, params, r -> {
                            if (r.succeeded()) {
                                promise.complete(newId);
                            } else {
                                promise.fail("save contact error.");
                            }
                        });
                    });
                    return f;
                };

然后將這些封裝的Future組合起來(lái):

                    getIdFuture.get().compose(r -> {
                        return sf.apply(r);
                    }).compose(r -> {
                        return cf.apply(r);
                    }).compose(r -> {
                        return alf.apply(r);
                    }).setHandler(r -> {
                        if (r.succeeded()) {
                            String message = "聯(lián)系單" + r.result() + "已創(chuàng)建";
                            notifyHandler.sendMsg(r.result(), message);
                            uploadHandler.fileTheDocument(rp.getString("checkinUser"), r.result(),
                                    rp.getString("fileList"));
                            res.end(result.ok().toString());
                        } else {
                            res.end(result.err(r.cause().getMessage()).toString());
                        }
                        connection.close();
                    });

看起來(lái)隊(duì)形比較整齊,不象原來(lái)那樣亂。

源碼 https://github.com/peijie1662/ITAF

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容