Рубрики
Без рубрики

Интеграция пружин Vert.x

Узнайте, как интегрировать Spring и Vert.x в одном приложении.

Автор оригинала: baeldung.

1. Обзор

В этой краткой статье мы обсудим интеграцию Spring с Vertex и используем лучшее из обоих миров: мощную и хорошо известную функцию Spring и реактивный цикл с одним событием от Vert.x.

Чтобы узнать больше о Vert.x, пожалуйста, ознакомьтесь с нашей вступительной статьей здесь .

2. Настройка

Во-первых, давайте установим наши зависимости:


    org.springframework.boot
    spring-boot-starter-data-jpa


    org.springframework.boot
    spring-boot-starter-web
    
        
            org.springframework.boot
            spring-boot-starter-tomcat
        
    


    io.vertx
    vertx-web
    3.4.1

Обратите внимание, что мы исключили встроенную зависимость Tomcat из spring-boot-starter-web s , поскольку мы собираемся развернуть наши службы с помощью verticles.

Вы можете найти последние зависимости здесь .

3. Применение Spring Vert.x

Теперь мы построим пример приложения с двумя развернутыми вершинами.

Первая вертикаль направляет запросы обработчику, который отправляет их в виде сообщений на указанный адрес. Другая вертикаль слушает по заданному адресу.

Давайте посмотрим на это в действии.

3.1. Вершина отправителя

Сервер Verticle принимает HTTP-запросы и отправляет их в виде сообщений на указанный адрес. Давайте создадим Server Verticle класс, расширяющий AbstractVerticle, и переопределим метод start() для создания вашего HTTP-сервера:

@Override
public void start() throws Exception {
    super.start();

    Router router = Router.router(vertx);
    router.get("/api/baeldung/articles")
      .handler(this::getAllArticlesHandler);

    vertx.createHttpServer()
      .requestHandler(router::accept)
      .listen(config().getInteger("http.port", 8080));
}

В обработчике запросов сервера мы передали объект router , который перенаправляет любой входящий запрос в обработчик getAllArticlesHandler :

private void getAllArticlesHandler(RoutingContext routingContext) {
    vertx.eventBus().send(ArticleRecipientVerticle.GET_ALL_ARTICLES, "", 
      result -> {
        if (result.succeeded()) {
            routingContext.response()
              .putHeader("content-type", "application/json")
              .setStatusCode(200)
              .end(result.result()
              .body());
        } else {
            routingContext.response()
              .setStatusCode(500)
              .end();
        }
      });
}

В методе обработчика мы передаем событие на шину событий Vert.x с идентификатором события GET_ALL_ARTICLES. Затем мы обрабатываем обратный вызов соответственно для сценариев успеха и ошибок.

Сообщение из шины событий будет использоваться вершиной Получателя статьи , , обсуждаемой в следующем разделе.

3.2. Вертикаль получателя

Вершина получателя статьи прослушивает входящие сообщения и вводит компонент Spring . Он действует как точка встречи для Spring и Vert.x.

Мы введем компонент Spring service в вершину и вызовем соответствующие методы:

@Override
public void start() throws Exception {
    super.start();
    vertx.eventBus().consumer(GET_ALL_ARTICLES)
      .handler(getAllArticleService(articleService));
}

Здесь/| article Service – это впрыснутый пружинный боб:

@Autowired
private ArticleService articleService;

Эта вершина будет продолжать прослушивать шину событий по адресу GET_ALL_ARTICLES. Как только он получает сообщение, он делегирует его методу обработчика get All Article Service :

private Handler> getAllArticleService(ArticleService service) {
    return msg -> vertx. executeBlocking(future -> {
        try {
            future.complete(
            mapper.writeValueAsString(service.getAllArticle()));
        } catch (JsonProcessingException e) {
            future.fail(e);
        }
    }, result -> {
        if (result.succeeded()) {
            msg.reply(result.result());
        } else {
            msg.reply(result.cause().toString());
        }
    });
}

Это выполняет необходимую операцию обслуживания и отвечает на сообщение со статусом. Ответ на сообщение ссылается на Серверную вершину и обратный вызов результат , как мы видели в предыдущем разделе.

4. Класс обслуживания

Класс обслуживания-это простая реализация, предоставляющая методы для взаимодействия со слоем репозитория:

@Service
public class ArticleService {

    @Autowired
    private ArticleRepository articleRepository;

    public List
getAllArticle() { return articleRepository.findAll(); } }

Репозиторий Article extends, org.springframework.data.repository.CrudRepository и предоставляет базовые функции CRUD.

5. Развертывание вершин

Мы будем развертывать приложение точно так же, как это было бы сделано для обычного приложения Spring Boot. Мы должны создать экземпляр Vert.X и развернуть в нем вершины после завершения инициализации контекста Spring:

public class VertxSpringApplication {

    @Autowired
    private ServerVerticle serverVerticle;

    @Autowired
    private ArticleRecipientVerticle articleRecipientVerticle;

    public static void main(String[] args) {
        SpringApplication.run(VertxSpringApplication.class, args);
    }

    @PostConstruct
    public void deployVerticle() {
        Vertx vertx = Vertx.vertx();
        vertx.deployVerticle(serverVerticle);
        vertx.deployVerticle(articleRecipientVerticle);
    }
}

Обратите внимание, что мы вводим экземпляры verticle в класс Spring application. Итак, нам придется аннотировать классы вершин,

Итак, нам придется аннотировать классы Verticle, Server Verticle и Article Recipient Verticle с помощью @Component.

Давайте протестируем приложение:

@Test
public void givenUrl_whenReceivedArticles_thenSuccess() {
    ResponseEntity responseEntity = restTemplate
      .getForEntity("http://localhost:8080/api/baeldung/articles", String.class);
 
    assertEquals(200, responseEntity.getStatusCodeValue());
}

6. Заключение

В этой статье мы узнали о том, как создать веб-сервис RESTful с использованием Spring и Vert.x.

Как обычно, пример доступен на GitHub.