회사에서 Vertx. 라는 프레임워크를 다루게 되었습니다. 처음 접할 때 이해하는게 쉽지 않았는데, 알면 알수록 상당히 유용한 프레임워크입니다. Vert.x 에 대해서는 조만간 개념 정리해서 따로 올리도록 하겠습니다.
오늘 포스팅에서는 Verticle 을 여러 개 배포하는 법을 살펴보겠습니다.
Vert.x 프로젝트를 shadowJar 를 이용해 jar 파일로 떨군 후 리눅스에서 실행시키는 건 간단해서 별 문제가 안됐습니다. 문제는 shadowJar config 에서 MainVerticle 를 하나만 지정할 수 있기 때문에 verticle 을 여러 개 사용하려면 다른 방법이 필요했습니다.
Main Verticle 만들기
App.java 라는 메인 버티클을 먼저 만들고 MainVerticle 로 지정해주겠습니다.
verticle 배포는 async 로 처리되기 때문에 callback 을 넘겨줘서 배포가 완료될 시점에 처리할 작업을 정의할 수 있습니다.
1 2 3 4 5 6 7
vertx.deployVerticle("com.future.creator.TestVerticle", res -> { if (res.succeeded()) { System.out.println("Deployment id is: " + res.result()); } else { System.out.println("Deployment failed!"); } });
Verticle 여러 개 배포하기
이런 식으로 MainVerticle 을 하나 만들어놓고 배포할 verticle 들을 전부 배포해주시면 되는데요,
여러 verticle 을 배포할 경우엔 각각 async 방식으로 돌기 때문에 전체적인 결과를 한번에 확인하기가 어렵습니다.
이럴 땐 Vert.x API 중 CompositeFuture 를 이용하면 비동기 결과를 묶어서 확인 후 처리할 수 있습니다.
CompositeFuture.all 전부 성공하거나 하나라도 실패할 경우 리턴
CompositeFuture.any 하나가 성공하거나 전부 다 실패할 경우 리턴
CompositeFuture.join 전부 성공하거나 전부 완료되었지만 하나라도 실패할 경우 리턴
이를 이용해서 코드를 작성하면 다음과 같습니다. 저는 모두 성공하면 성공, 하나라도 실패하면 실패하는 all 을 이용했습니다.
-- 배포 시작 01:31:56.461 [vert.x-eventloop-thread-0] INFO com.future.creator.App - START DEPLOYMENT 01:31:56.468 [vert.x-eventloop-thread-0] INFO com.future.creator.App - Using 2 Event Loops.
-- 0, 1 Thread 2개에서 각각 작업 시작함 01:31:56.516 [vert.x-eventloop-thread-1] DEBUG o.z.exec.ProcessExecutor - Executing [java, -version]. 01:31:56.523 [vert.x-eventloop-thread-0] DEBUG o.z.exec.ProcessExecutor - Executing [java, -version]. 01:31:56.554 [vert.x-eventloop-thread-1] DEBUG o.z.exec.ProcessExecutor - Started java.lang.UNIXProcess@19a240e 01:31:56.561 [vert.x-eventloop-thread-0] DEBUG o.z.exec.ProcessExecutor - Started java.lang.UNIXProcess@f08c85
-- 작업 종료 deploy 종료 01:31:57.149 [vert.x-eventloop-thread-0] DEBUG o.zeroturnaround.exec.WaitForProcess - java.lang.UNIXProcess@f08c85 stopped with exit code 0 01:31:57.154 [vert.x-eventloop-thread-0] INFO com.future.creator.TestVerticle2 01:31:57.168 [vert.x-eventloop-thread-1] DEBUG o.zeroturnaround.exec.WaitForProcess - java.lang.UNIXProcess@19a240e stopped with exit code 0 01:31:57.169 [vert.x-eventloop-thread-1] INFO com.future.creator.TestVerticle1
-- 나머지 하나 verticle3 deploy 중 01:31:57.169 [vert.x-eventloop-thread-1] DEBUG o.z.exec.ProcessExecutor - Executing [java, -version]. 01:31:57.182 [vert.x-eventloop-thread-1] DEBUG o.z.exec.ProcessExecutor - Started java.lang.UNIXProcess@169db54 01:31:57.518 [vert.x-eventloop-thread-1] DEBUG o.zeroturnaround.exec.WaitForProcess - java.lang.UNIXProcess@169db54 stopped with exit code 0 01:31:57.519 [vert.x-eventloop-thread-1] INFO com.future.creator.TestVerticle3
-- 모두 deploy 완료 01:31:57.520 [vert.x-eventloop-thread-0] INFO com.future.creator.App - All Verticles deployed.
-- deploy 시작 01:29:14.074 [vert.x-eventloop-thread-0] INFO com.future.creator.App - START DEPLOYMENT 01:29:14.106 [vert.x-eventloop-thread-0] INFO com.future.creator.App - Using 2 Event Loops.
-- verticle 1에서 deploy 실패 -- 각각 deploy 중인데 이미 verticle 1이 실패하였으므로 벌써 전체 deploy 는 실패로 판정됨. 01:29:14.203 [vert.x-eventloop-thread-0] INFO com.future.creator.App - Verticle deployment failed : com.future.creator.TestVerticle1
-- future를 fail 처리했기 때문에 deploy 실패함. -- 이거 없으면 error 있어도 그냥 전체 배포했다고 완료됨. May 25, 2018 1:29:14 AM io.vertx.core.impl.launcher.commands.VertxIsolatedDeployer SEVERE: Failed in deploying verticle