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
Leave a comment