공식 홈페이지
오픈소스 메시지 브로커 라이브러리 중 하나로 업무 관련으로 알게 됐다.
안드로이드 앱에서 서버에 데이터를 주기적으로 요청해야 하는 기능을 개발해야 했다.
단순히 레트로핏과 Handler 로 일정 시간마다 서버에 요청을 보낼 수도 있지만, 요청받는 데이터가 생각보다 크고 데이터가 변하지 않았을 때도 요청하기 때문에 리소스 낭비가 발생했다.
RabbitMQ 는 메시지 브로커로 서버와 클라이언트 중간에 위치하면서, 서버가 메시지를 RabbitMQ에 전달하면 RabbitMQ 에 등록된 클라이언트에 메시지를 전달하는 기능을 가지고 있다.
서버 입장에서는 RabbitMQ 에만 메시지를 전달하면 되고, 클라이언트 입장에서는 RabbitMQ 에 등록하기만 하면 되니, 불필요한 네트워크 요청을 줄일 수 있다.
RabbitMQ 를 사용하려면 몇 가지 용어에 대해 알아두는 것이 편하다.
메시지를 보내는 프로그램
메시지를 받는 프로그램
공식 다운로드
아래 코드는 RabbitMQ 를 설치해야 실행할 수 있다.
설치와 관리자 페이지에 대한 설명은 나중에 추가할 예정
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try {
// 서버 연결
Connection connection = factory.newConnection();
// 채널 생성
Channel channel = connection.createChannel();
// 큐 bind
channel.queueDeclare(
"QUEUE 1", false, false, false, null
);
// Publish
String message = "Simple Connection";
channel.basicPublish("", "QUEUE 1", null, message.getBytes());
} catch (Exception e) {close();}
connection 과 channel 은 close() 를 사용해서 종료해야 하지만, try-with 문을 사용하면 자동으로 close 를 해준다.
// 실패 콜백
CancelCallback cancelCallback = consumerTag -> {};
// 성공 콜백
DeliverCallback deliverCallback = (consumerTag, message) -> {
String body = new String(message.getBody(), StandardCharsets.UTF_8);
};
먼저 콜백을 설정해야 한다. RabbitMQ 는 비동기 작업이기 때문에 RabbitMQ 에서 보내는 결과에 따라 콜백 함수가 실행된다.
전송이 성공한 경우, 메시지를 보내는데 byte 형태로 전송되기 때문에 변환을 해야 한다.
// 서버 설정
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try {
// 서버 연결
Connection connection = factory.newConnection();
// 채널 생성
Channel channel = connection.createChannel();
// 큐 bind
channel.queueDeclare(
"QUEUE 1", false, false, false, null
);
// Consume
channel.basicConsume(
"QUEUE 1", true, deliverCallback, cancelCallback
);
} catch (Exception e) {close();}
Producer 와 거의 동일한 것을 볼 수 있다.