Vertx不绑定路由器

时间:2018-06-12 15:26:34

标签: java microservices vert.x

好吧,我觉得自己真的迷失了Vertx结构,因为一切都是lambda表达式。 我完全按照this教程,以便很好地构建我的应用程序, 不幸的是它没有注册任何路由器我不知道为什么。请找到我所做的事情

serviceEndPoint与上述教程相同

import io.vertx.core.Vertx;
import io.vertx.ext.web.Router;

public interface ServiceEndPoint {
    String mountPoint();

    Router router(Vertx vertx);
}

这是subscriptionService

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 个答案:

答案 0 :(得分:1)

首先,并非Vert.x中的所有内容都是lambda表达式。这是你发现的一个非常奇怪的教程。如您所见,它使用的java.util.ServiceLoader不是Vert.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

答案 1 :(得分:1)

创建服务接口com.poc.poc.services.ServiceEndPoint)声明和具体实现(SubscriptionService)之后,您应该添加服务提供商绑定

根据ServiceLocator文档,绑定应插入到以FQN接口命名的文件下,即在 META-INF / services / com.poc.poc.services.ServiceEndPoint下 (整个目录结构位于项目/模块 resources 目录下)。

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

com.poc.poc.services.SubscriptionService