代码之家  ›  专栏  ›  技术社区  ›  Basil Battikhi

Vertx没有绑定路由器

  •  1
  • Basil Battikhi  · 技术社区  · 7 年前

    嗯,我觉得自己真的迷失了与垂直结构,因为一切都是一个lambda的表达。 我跟着 this 为了更好地构建我的应用程序, 不幸的是它没有注册任何路由器我不知道为什么。请告诉我我做了什么

    ServiceEndpoint与上述教程相同

    import io.vertx.core.Vertx;
    import io.vertx.ext.web.Router;
    
    public interface ServiceEndPoint {
        String mountPoint();
    
        Router router(Vertx vertx);
    }
    

    这里是订阅服务

    import com.poc.poc.repositories.SubscriptionRepository;
    import com.poc.poc.services.ServiceEndPoint;
    import io.vertx.core.Vertx;
    import io.vertx.ext.web.Router;
    
    public class SubscriptionService implements ServiceEndPoint {
        private SubscriptionRepository subscriptionRepository;
    
        public SubscriptionService() {
            subscriptionRepository = new SubscriptionRepository();
    
        }
    
        @Override
        public String mountPoint() {
            return "/test";
        }
    
        @Override
        public Router router(Vertx vertx) {
            Router router = Router.router(vertx);
            router.get("/test").handler(rc -> rc.response().end(subscriptionRepository.getSubscriptionInfo(rc, vertx).toString()));
            return router;
        }
    }
    

    最后是服务器垂直

    import com.poc.poc.services.ServiceEndPoint;
    import io.vertx.core.AbstractVerticle;
    import io.vertx.core.Future;
    
    import java.util.ServiceLoader;
    import java.util.stream.StreamSupport;
    
    import io.vertx.ext.web.Router;
    
    public class ServerVertical extends AbstractVerticle {
    
        @Override
        public void start(final Future<Void> startFuture) throws Exception {
    
            ServiceLoader<ServiceEndPoint> loader = ServiceLoader.load(ServiceEndPoint.class);
    
            Router main = StreamSupport.stream(loader.spliterator(), false)
                .collect(() -> Router.router(vertx), //the main router
                    (r, s) -> r.mountSubRouter(s.mountPoint(), s.router(vertx)),
                    (r1, r2) -> {
                    });
    
            vertx.createHttpServer().requestHandler(main::accept).listen(8080, res -> {
                if (res.succeeded()) {
                    startFuture.complete();
                } else {
                    startFuture.fail(res.cause());
                }
            });
        }
    }
    

    请注意,一旦我运行应用程序,我收到这些警告

    Jun 12, 2018 6:16:45 PM io.vertx.core.impl.BlockedThreadChecker
    WARNING: Thread Thread[vert.x-eventloop-thread-0,5,main] has been blocked for 2486 ms, time limit is 2000
    Jun 12, 2018 6:16:46 PM io.vertx.core.impl.BlockedThreadChecker
    WARNING: Thread Thread[vert.x-eventloop-thread-0,5,main] has been blocked for 3485 ms, time limit is 2000
    

    顺便说一句 Router main = StreamSupport.stream(loader.spliterator(), false) 尺寸是0。

    有什么帮助吗?

    2 回复  |  直到 7 年前
        1
  •  1
  •   Alexey Soshin    7 年前

    首先,不是vert.x中的所有内容都是lambda表达式。这是一个很奇怪的教程,你发现。如你所见,它使用 java.util.ServiceLoader 不是垂直X类。我也不熟悉其他人推荐将这个类用于vert.x应用程序。
    它试图做的是动态加载类。你可能错过的是把正确的文件放进去 META-INF 目录,如下所述: https://docs.oracle.com/javase/tutorial/ext/basics/spi.html#register-service-providers

    无论如何,这不是我推荐的使用vertx的方式。相反,请使用常规的Vertx教程,这是非常好的: https://vertx.io/docs/vertx-web/java/#_handling_requests_and_calling_the_next_handler

        2
  •  1
  •   tmarwen    7 年前

    一旦你创造了你 服务接口 ( com.poc.poc.services.ServiceEndPoint )宣言与具体实施( SubscriptionService ),您应该添加 服务提供程序绑定 .

    按照 ServiceLocator 文档中,应该将绑定插入到以接口fqn命名的文件下,即 META-INF/services/com.poc.poc.services.serviceEndpoint (整个目录结构在project/module下 资源 目录)。

    该文件将包含实际的接口实现:

    com.poc.poc.services.SubscriptionService