본문 바로가기
자바

Vert.x를 활용한 이벤트 기반 애플리케이션 개발: EventBus 예제

by 플라퉁 2023. 7. 27.
728x90
반응형

 

 

 

안녕하세요 오늘은 Vert.x에 대해 알아보겠습니다.

 

Vert.x는 reactive 프로그래밍 모델을 기반으로 한 이벤트 기반 애플리케이션 개발을 위한 도구입니다. 

 

Vert.x 공식 사이트 : https://vertx.io/

 

Eclipse Vert.x

import io.vertx.core.AbstractVerticle; public class Server extends AbstractVerticle { public void start() { vertx.createHttpServer().requestHandler(req -> { req.response() .putHeader("content-type", "text/plain") .end("Hello from Vert.x!"); }).listen(8080)

vertx.io

 

Java, Kotlin, JavaScript, Groovy, Ruby, Ceylon 등 다양한 언어를 지원합니다. 

 

Vert.x는 다른 네트워크 및 웹 프레임워크와 달리 블로킹 호출을 피하도록 설계되어 있으며, 

 

네트워크 및 데이터베이스 작업에서 비동기적으로 처리됩니다. 

 

또한 규모에 대한 대응력을 가지기 위하여 병렬성과 클러스터링을 지원합니다. 

 

Vert.x에서 제공하는 모듈 중 일부는 웹 프레임워크, OAuth 2.0, OpenAPI, gRPC, Event Bus를 비롯한 다양한 기능을 제공합니다.

 

 

 

 

예제를 통해 Vert.x의 이벤트버스 기능을 알아보겠습니다. 

 

<dependency>
    <groupId>io.vertx</groupId>
    <artifactId>vertx-core</artifactId>
    <version>${vertx.version}</version>
</dependency>

 

저는

 

<vertx.version>3.9.13</vertx.version>

 

을 사용하였습니다.

 

 

import io.vertx.core.AbstractVerticle;
import io.vertx.core.Vertx;
import io.vertx.core.eventbus.EventBus;
import io.vertx.core.eventbus.Message;
import io.vertx.core.eventbus.MessageConsumer;
import io.vertx.core.eventbus.MessageProducer;

public class EventBusExample extends AbstractVerticle {

  public static void main(String[] args) {
    Vertx vertx = Vertx.vertx();
    vertx.deployVerticle(new EventBusExample());
  }

  @Override
  public void start() throws Exception {
    // Create an instance of EventBus
    EventBus eventBus = vertx.eventBus();

    // Deploy a consumer verticle which listens to messages on "greetings" address
    vertx.deployVerticle(new GreetingsConsumer());

    // Deploy a producer verticle which sends messages to "greetings" address after a delay
    vertx.deployVerticle(new GreetingsProducer());
  }

  private static class GreetingsConsumer extends AbstractVerticle {

    @Override
    public void start() {
      // Create an instance of MessageConsumer which listens to messages on "greetings" address
      MessageConsumer<String> consumer = vertx.eventBus().consumer("greetings");

      // Register a new message handler
      consumer.handler((Message<String> message) -> {
        System.out.println("Message received: " + message.body());
      });
    }
  }

  private static class GreetingsProducer extends AbstractVerticle {

    @Override
    public void start() {
      // Send a message to "greetings" address after a delay
      vertx.setTimer(5000, t -> {
        MessageProducer<String> producer = vertx.eventBus().publisher("greetings");
        producer.write("Hello World!");
      });
    }
  }
}

 

 

이 예제는 Vert.x의 EventBus를 사용하여 "greetings" 주소로 메시지를 보내고 수신하는 두 개의 버티클을 정의합니다. 

 

 

 

 

GreetingsConsumer라는 컨슈머 버티클은 "greetings" 주소에서 메시지를 수신합니다. 

 

이를 위해 vertx.eventBus().consumer를 호출하여 'consumer` 객체를 생성한 후, 

 

해당 주소로 수신되는 모든 메시지를 처리하는 핸들러를 지정합니다. 

 

 

 

 

GreetingsProducer라는 프로듀서 버티클은 5초 후에 "greetings" 주소로 "Hello World!" 문자열 메시지를 보냅니다. 

 

이를 위해 vertx.eventBus().publisher를 호출하여 producer 객체를 생성한 다음, 

 

producer.write를 호출하여 메시지를 보냅니다. 

 

이러한 방식으로 EventBus를 사용하면 컴포넌트 간 메시지 전달을 효율적이고 비동기적으로 처리할 수 있습니다.

 

 

 

 

 

위의 예제에서는 한 페이지에 모두 작성하여 헷갈릴 수 있지만

 

각 Verticle은 독립적인 프로세스로 실행될 수 있으며, 각각 다른 스레드에서 실행됩니다. 

 

따라서, 여러 Verticle이 하나의 어플리케이션으로 동작하는 것 처럼 보일 수 있지만, 

 

사실은 각각 독립적으로 작동합니다. 

 

 

 

이를 통해 각 Verticle은 다른 시스템과 통신하고 자신의 작업을 비동기적으로 처리할 수 있습니다. 

 

따라서, 위 예제에서 정의된 GreetingsConsumer와 GreetingsProducer는 각각 독립적인 Verticle로 볼 수 있으며, 

 

각각 다른 스레드에서 실행됩니다. 

 

Vert.x는 EventBus를 통해 이러한 독립적인 Verticle의 상호작용을 처리하고, 

 

탄력적이며 확장 가능한 어플리케이션을 만들 수 있게 도와줍니다.

 

 

 

감사합니다.

 

 

 

 

 

728x90
반응형

댓글