[RabbitMQ] Publisher Confirm - 메시지 전송도 안 잃어버리기

by 스뎅(thDeng) on

RabbitMQ에서 메시지를 꺼내서 처리할 때만 ACK를 보내는게 아니라, 정상적으로 보냈는지 확인할 ACK도 받고 싶을 때 Publisher Confirm을 사용하면 된다. publisher confirm과 transaction은 함께 사용할 수 없다.

아래처럼 confirm.select를 사용하도록 설정하고, 메시지를 보내면 callback을 받을 수 있다. (전체 샘플은 요기에 추가해 두었다.)

channel.confirmSelect();
channel.addConfirmListener(new ConfirmListener() {
  @Override
  public void handleAck(long deliveryTag, boolean multiple) throws IOException {
    System.out.println("ACK: " + deliveryTag);
  }

  @Override
  public void handleNack(long deliveryTag, boolean multiple) throws IOException {
    System.out.println("NACK: " + deliveryTag);
  }
});

spring-amqp를 사용할 때는 아래처럼 하면 된다.

@Bean
public ConnectionFactory rabbitConnectionFactory() {
  CachingConnectionFactory connectionFactory = new CachingConnectionFactory("localhost", 5672);
  // .. 이러저런 설정
  // publisher confirm ON
  connectionFactory.setPublisherConfirms(true);
  return connectionFactory;
}

@Bean
public RabbitTemplate rabbitTemplate(ConnectionFactory rabbitConnectionFactory) {
  RabbitTemplate template = new RabbitTemplate(rabbitConnectionFactory);
  template.setConfirmCallback((correlationData, ack, cause) -> {
    if(ack) {
      System.out.println("ACK");
    } else {
      System.out.println("NACK: " + cause);
    }
  });
  return template;
}

참조

별도로 명시하지 않을 경우, 이 블로그의 포스트는 다음 라이선스에 따라 사용할 수 있습니다: Creative Commons License CC Attribution-NonCommercial-ShareAlike 4.0 International License