Что ж, я почувствовал себя действительно потерянным со структурой Vertx, потому что все является лямбда-выражением. я точно следовал руководству это, чтобы хорошо структурировать свое приложение, к сожалению, он не регистрирует ни один роутер, я понятия не имею почему. пожалуйста, найди ниже, что я сделал
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.
любая помощь ?




Во-первых, не все в Vert.x является лямбда-выражением. Вы нашли довольно странный учебник. Как видите, он использует 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
На самом деле я рассмотрел это в другом ответе: stackoverflow.com/a/46015735/5985853 Суть в том, что вы вызываете ctx.next() в своем «промежуточном» маршруте, и он будет продолжать цепочку.
После того, как вы создали декларацию сервисный интерфейс (com.poc.poc.services.ServiceEndPoint) и конкретную реализацию (SubscriptionService), вы должны добавить привязка поставщика услуг.
Согласно документации ServiceLocator, привязка должна быть вставлена в файл, названный в честь вашего интерфейса FQN, то есть в META-INF / services / com.poc.poc.services.ServiceEndPoint (вся структура каталогов находится в каталоге проекта / модуля Ресурсы).
Файл будет содержать фактическую реализацию интерфейса:
com.poc.poc.services.SubscriptionService
интересно, могу ли я сделать и промежуточное ПО? Я имею в виду, что хочу добавить атрибут к каждому запросу, который я получаю