RabbitMQ z użyciem Spring Boota i Dockera

RabbitMQ z użyciem Spring Boota i Dockera

Mechanizm kolejkowania jest bardzo istotnym mechanizmem z którym każdy programista prędzej czy później z pewnością się spotka. Najbardziej rozpowszechnionym przykładem jest przykład wysyłania wiadomości e-mail do użytkowników. Klasyczne rozwiązanie bez użycia systemu kolejkowania to utworzenie tabeli którą zasila aplikacja tworząca wiadomości e-mail. Cyklicznie np. za pomocą Crona co 5 minut wiadomości pobierane są z tabeli pełniącej rolę kolejki a następnie są one wysyłane za pomocą aplikacji przetwarzającej wiadomości e-mail. Nie jest to zdecydowanie rozwiązanie optymalne chociażby ze względu na uzależnienie się od schematu bazy danych. Ponadto ze względu na czas potrzebny na cykliczne uruchamianie Crona jest to rozwiązanie niewydajne.

Z pomocą przychodzi RabbitMQ. W tym przypadku aplikacja tworząca wiadomości e-mail zasila system RabbitMQ a aplikacja wysyłająca wiadomości pobiera je z kolejki. Jest to znaczne uproszczenie opisanego modelu. Co więcej nie ma przestojów w pobieraniu wiadomości e-mail co miało miejsce z użyciem Crona. W artykule tym za pomocą Dockera uruchomimy system RabbitMQ oraz zamodelujemy aplikację która wysyła (z ang. producer) oraz pobiera (z ang. consumer) wiadomości email. Do dzieła!

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

Wynik:

root@vps663965:~# docker run -d --hostname localhost --name queue -p 15672:15672 -p 5672:5672 rabbitmq:3.6-management-alpine
Unable to find image 'rabbitmq:3.6-management-alpine' locally
3.6-management-alpine: Pulling from library/rabbitmq
cd784148e348: Pull complete
6942394937c2: Pull complete
9b810cb4438e: Pull complete
05c43906cd73: Pull complete
fedf5b1b1c33: Pull complete
fde114ead4a3: Pull complete
046b8cc56402: Pull complete
e2b994cef718: Pull complete
d156eba9441a: Pull complete
2cd20e13ffc0: Pull complete
4c5a843376d8: Pull complete
Digest: sha256:483745c7faebb33214e0b2630d99c23c725434dd7c388339fc4083217bd004fb
Status: Downloaded newer image for rabbitmq:3.6-management-alpine
6c68e6b0a4a631d324534263a6f29c19cd28e527f3a2e723c248735e2a7dceba
root@vps663965:~#

Pod adresem:

http://localhost:15672 znajduje się instancja RabbitMQ:

Domyślne dane do logowania to:

login: guest

haslo: guest

Zanim przejdziemy do projektu aplikacji tworzymy nową kolejkę:

Tworzymy teraz nowy projekt Spring Boota, niezbędne zależności:

<dependencies>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
	</dependency>
 
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-amqp</artifactId>
	</dependency>
 
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-test</artifactId>
		<scope>test</scope>
	</dependency>
</dependencies>

Plik application.properties:

spring.rabbitmq.host = localhost
spring.rabbitmq.port = 5672
spring.rabbitmq.username = guest
spring.rabbitmq.password = guest
queue.name = pl.javaleader

Producer – RestController:

@RestController("/email-producer")
public class Producer {
 
    @Value("${queue.name}")
    private String queueName;
 
    @Autowired
    RabbitTemplate queueSender;
 
    @GetMapping
    String sendToQueue(@RequestParam(value = "email") String message){
        queueSender.convertAndSend(queueName, message);
        return String.format("email %s has been sent to pl.javaleader queue!", message);
    }
 
}

Consumer:

@Component
public class Consumer {
    @RabbitListener(queues = "${queue.name}")
    private void reader(String text){
        System.out.println("email received from pl.javaleader.queue " + text);
    }
}

Uruchamiamy aplikację Spring Boota:

root@vps663965:/rabbitmq/target# java -jar rabbitmq-0.0.1-SNAPSHOT.jar

i testujemy wysyłając żądanie typu GET pod adres:

http://localhost:8080/email-producer?email=kontakt@javaleader.pl

Wynik:

email kontakt@javaleader.pl has been sent to pl.javaleader queue!

Na ekranie konsoli zobaczyć można komunikat o pobraniu wiadomości z kolejki:

email received from pl.javaleader queue kontakt@javaleader.pl

Zobacz kod na GitHubie i zapisz się na bezpłatny newsletter!

.

Leave a comment

Your email address will not be published.


*