#21 Spring Boot – integracja z RabbitMQ

W tym wpisie przedstawię wam jak zintegrować bezpośrednio naszą aplikację z RabbitMQ. Stosowanie kolejek w naszym ekosystemie ma wiele zalet. Dzięki zrównolegleniu pracy możemy w łatwy sposób skalować naszą aplikację. Jednocześnie wysyłając zadania na kolejkę powodujemy, iż nasz system staje się bardziej odporny, ponieważ zadania w pierwszej kolejności trafiają na kolejkę i zostaną z niej pobrane dopiero wtedy, gdy dostępni będą konsumenci tych wiadomości.

RabbitMQ

Nie bez przyczyny wcześniejsze wpisy nawiązywały do Dockera oraz RabbitMQ. Naszą integrację z message brokerem zaczniemy od pobrania oraz uruchomienia obrazu Dockerowego (wszystkie wyjaśnienia w tym artykule):

docker run -d --hostname code-couple --name queue -p 15672:15672 -p 5672:5672 rabbitmq:3.6-management-alpine

Maven

Kolejnym krokiem jest dodanie zależności Mavenowej, która zapewni nam integrację z RabbitMQ:

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

Producer

Producer jak nazwa wskazuje jest “producentem” wiadomości, które trafiają na kolejkę. Wysyłanie wiadomości do RabbitMQ odbywa się poprzez wykorzystanie RabbitTemplate

@RestController("/queue")
class QueueProducer {

    @Value("${queue.name}")
    private String queueName;

    @Autowired
    RabbitTemplate queueSender;

    @GetMapping
    String sendToQueue(@RequestParam(value = "message", defaultValue = "CodeCouple.pl") String message){
        queueSender.convertAndSend(queueName, message);
        return String.format("Message %s sent! See logs...", message);
    }

}

Consumer

Aby odczytywać wiadomości z kolejki należy użyć adnotacji @RabbitListener, która jako parametr queues przyjmuje nazwę kolejek, z których chcemy odbierać wiadomości:

@Component
class QueueConsumer {

    @RabbitListener(queues = "${queue.name}")
    private void reader(String text){
        System.out.println("Consumer: " + text);
    }

}

Testujemy!

Po uruchomieniu aplikacji w logach powinna pokazać się informacja o nawiązaniu połączenia z RabbitMQ:

2017-10-11 18:38:48.379 INFO 6392 --- [cTaskExecutor-1] o.s.a.r.c.CachingConnectionFactory : Created new connection: 
rabbitConnectionFactory#7d04a8ec:0/SimpleConnection@18f7f721 [delegate=amqp://guest@192.168.99.100:5672/, localPort= 53396]

Aby przetestować naszą aplikację wystarczy wejść pod adres aplikacji /queue?message=CodeCouple, a wiadomość wyląduje na kolejce o nazwie określonej w queueName. Odebrane wiadomości powinny być widoczne w logach.

GitHub

Całość jak zawsze na GitHubie.