[RabbitMQ] Publisher API

2021. 11. 3. 11:07 Spring Cloud/RabbitMQ

이번 글에서는 Publisher API를 사용해 RabbitMQ에 메세지를 Publish 해보겠습니다.

0. Publisher API를 사용하는이유?

RabbtiMQ로 메세지를 Publish 하기전 메세지의 Validation을 check 하기위해 사용합니다.

아래 그림과 같이 기업에서는 무수히 많은 어플리케이션이 RabbitMQ Message Server를 통해 메세지를 주고받습니다. 때문에 통합된 규격의 메세지 Validation을 활용할 필요가 있습니다.

 

 

따라서 모든 메세지는 RabbitMQ 서버에 Publish 하기전에 Validation API를 거치도록 구현해야 합니다. 이를 Publisher API라고 하며 Spring Boot에서는 RestController의 PostMapping으로 구현할 수 있습니다.

 

 

Publisher API의 구조는 아래와 같습니다.

@RestController
public class RabbitmqRestController {

    private static final Logger log = LoggerFactory.getLogger(RabbitmqRestController.class);

    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();

    @Autowired
    private RabbitTemplate rabbitTemplate;

    public static boolean isValidJson(String string) {
        try {
            OBJECT_MAPPER.readTree(string);
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    @PostMapping(path = { "/api/publish/{exchange}/{routingKey}",
            "/api/publish/{exchange}" }, consumes = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<String> publish(@PathVariable(name = "exchange", required = true) String exchange,
            @PathVariable(name = "routingKey", required = false) Optional<String> routingKey,
            @RequestBody String message) {
        if (!isValidJson(message)) {
            return ResponseEntity.badRequest().body(Boolean.FALSE.toString());
        }

        try {
            rabbitTemplate.convertAndSend(exchange, routingKey.orElse(""), message);
            return ResponseEntity.ok().body(Boolean.TRUE.toString());
        } catch (Exception e) {
            log.error("Error when publishing : {}", e.getMessage());
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage());
        }
    }

}

위의 코드 중 isValidJson()가 메세지의 Validation을 check합니다. 내용을 살펴보면 ObjectMapper.readTree() 함수를 사용해 메세지가 validate한 JSON format이 아닐경우 에러를 return하게 됩니다.

  public static boolean isValidJson(String string) {
        try {
            OBJECT_MAPPER.readTree(string);
            return true;
        } catch (Exception e) {
            return false;
        }
    }

😎 ~

RabbitMQ 서버에 publish 되는 메세지는 항상 Publisher API를 거치도록 함으로써, 모든 애플리케이션이 통합된 Validation을 사용할 수 있습니다.


참고 자료 : https://www.udemy.com/course/rabbitmq-java-spring-boot-for-system-integration/

출처 : https://minholee93.tistory.com/entry/RabbitMQ-Publisher-API