首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Vertx :如何将路由器划分为不同的类别,保持单个垂直

Vertx :如何将路由器划分为不同的类别,保持单个垂直
EN

Stack Overflow用户
提问于 2019-03-26 16:19:41
回答 2查看 720关注 0票数 1

我们的MainVerticle随着路由数量的增加而不断增长,例如:

代码语言:javascript
运行
复制
router.get("/vehicles/:id").handler(ctx -> {
        LOG.info("Entering get vehicle details");
        getVehicleDetailsCounter.inc();
        vehicleApiImpl.getVehicleDetails(ctx, httpClient);
    });

    router.post("/vehicles/:id/journey").handler(ctx -> {
        // BOOK VEHICLE
        LOG.info("Entering book vehicle");
        startJourneyCounter.inc();
        vehicleApiImpl.startJourney(ctx, httpClient);
    });

    router.post("/vehicles/:id/trips/:tripId/reports").handler(ctx -> {
        LOG.info("Entering trip reports");
        tripReportsCounter.inc();
        getTripReports(ctx, httpClient);
    });

    router.get("/availableVehicles/:cityId").handler(ctx -> {
        LOG.info("Entering available vehicles");
        availableVehCounter.inc();
        getAvailableVehicles(ctx, httpClient);
    });

    router.get("/zonesDetails/:cityId").handler(ctx -> {
        LOG.info("Entering zones details");
        getZonesDetailsCounter.inc();
        vehicleApiImpl.getZonesDetails(ctx, httpClient);
    });

    router.get("/models").handler(ctx -> {
        LOG.info("Entering models");
        modelsCounter.inc();
        vehicleApiImpl.getModels(ctx, httpClient);
    });

    router.get("/options").handler(ctx -> {
        LOG.info("Entering options");
        optionsCounter.inc();
        vehicleApiImpl.getOptions(ctx, httpClient);
    });
    
    // ============================
    // USER
    // ============================
    LOG.info("Handler register : USER");

    // Payment Details
    router.post("/user/notifyAppPaymentTransaction").handler(ctx -> {
        LOG.info("Entering payment transaction");
        notifyAppPaymentTransaction(ctx, httpClient);
    });

    // The user current journey
    router.get("/user/currentJourney").handler(ctx -> {
        LOG.info("Entering get current journey");
        getCurrentJourneyCounter.inc();
        userApiImpl.getCurrentJourney(ctx, httpClient);
    });

    // Create a new user
    router.post("/users").handler(ctx -> {
        LOG.info("Entering create user");
        createUserCounter.inc();
        createUser(ctx, httpClient);
    });

..。

我们需要继续监听单个IP :端口。将这个MainVerticle分成几个类,同时保留单个垂直,这会是一个好主意吗?

一种显而易见的方法是静态帮助器类,它接受路由器并在内部进行映射。但如果Vertx中存在现有的模式,例如使用路由器,它将真的很有帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-26 21:27:55

代码语言:javascript
运行
复制
// Main Clss    
class Main : AbstractVerticle() {
    override fun start() {
        val router = Router.router(vertx)    
        router.route().handler(BodyHandler.create())
        router.get("/vehicles/:id").handler { req -> Controller.get_vehicle(req)}
        router.get("/vehicles/:id/journey").handler{req-> Controller.startJourney(req)}
    }
}

// Controller Class
open class Controller {
    companion object {
        fun get_vehicle(routingContext: RoutingContext) {
            // enter code here
        }
    }
}
票数 1
EN

Stack Overflow用户

发布于 2019-03-26 17:00:33

例如,您可以在不同的处理程序中提取车辆路线。然后,在处理程序中,您可以选择在那里实现您的业务逻辑,或者最好是通过eventbus发送一条消息,在任何其他Verticle中使用该消息,在那里执行您的业务逻辑,并回复您将作为响应发送的消息。

代码语言:javascript
运行
复制
router.route("/vehicles/*").handler(VehicleHandler.create(vertx, router));

VehicleHandler

代码语言:javascript
运行
复制
public interface VehicleHandler extends Handler<RoutingContext> {
    static VehicleHandler create(Vertx vertx, Router router) {
        return new VehicleHandlerImpl(vertx, router);
    }
}

VehicleHandlerImpl

代码语言:javascript
运行
复制
public class VehicleHandlerImpl implements VehicleHandler {

    private Router router;

    public VehicleHandlerImpl(Vertx vertx, Router router) {
         this.router = router;
         router.get("/:id/").handler(this::getVehicle);
         router.post("/:id/trips/:tripId/reports").handler(this::postReports);
         router.post(":id/journey").handler(this::postJourney);      
    }

    @Override
    public void handle(final RoutingContext ctx) {
         router.handleContext(ctx);
    }

    private void getVehicle(RoutingContext ctx) {
         //Option A: do you business logic here
    }

    private void postReports(RoutingContext ctx) {
        //Option B: send an eventbus message, handle the message in the MainVerticle and serve the response here   
    }

    private void postJourney(RoutingContext ctx) {
        //Option C: send an eventbus message, handle the message in a new Verticle and serve the response here 
    }
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55352588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档