Spring Boot ile RabbitMQ Kullanımı
Bu yazımızda RabbitMQ’ya veri yazma üzerinde duracağız. İlk adımımız RabbitMQ’yu docker üzerinde ayağa kaldırmak olacak. Bunun için hub.docker.com gidip Rabbit image’ını indirebiliriz. Eğer docker komutlarına aşina değilseniz basit docker komutlarını anlattığım önceki yazıma bakmanız faydalı olabilir.
https://bilisim.io/2020/05/09/docker-101/
Bu yazı için yeni bir proje başlatmayacağım, önceki yazılarda adım adım ilerlettiğimiz GraphQL projesi üzerine geliştirme yapacağım. O projeye aşağıdaki linkten ulaşabilirsiniz.
https://github.com/cemdrman/SpringBootWithGraphQL
RabbitMQ
Aşağıdaki komutu kullanarak kendi makinenizde RabbitMQ kaldırabilirsiniz. Ayrıca bize arayüz sağlayan bir plugin mevcut. İlgili bilgilere Docker Hub üzerinden ulaşabilirsiniz.
1 2 3 4 5 |
docker run -d --hostname my-rabbit --name myrabbit -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=123456 -p 5672:5672 -p 15672:15672 rabbitmq:3-management |
Şimdi aşağıdaki adrese gidip bu pluginin nasıl gözüktüğüne bakabiliriz. Burada belki şöyle bir bilgi vermek gerekir. Aşağıdaki adresteki port bilgisi RabbitMQ’nun değil, management plugin ile gelen uygulamasının port bilgisidir.
1 2 3 4 5 |
http://localhost:15672/ |
Java Kodu
Öncelikle dependency ekliyoruz.
1 2 3 4 5 6 7 8 9 10 11 12 |
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> Gradle için; implementation 'org.springframework.boot:spring-boot-starter-amqp' |
Burada şunu belirtmek faydalı olabilir ki görüldüğü üzere Rabbit’e özgü bir dependency eklemiyoruz. Çünkü dependency ismindeki AMQP(Advanced Message Queuing Protocol) bir protokol. Bu noktada ürünler değişebilir fakat protokol aynı kalacaktır.
RabbitMQ ayarlarının olacağı bir konfigürasyon class’ı oluşturuyoruz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
@Configuration @Data public class RabbitMQConfig { @Value("${rabbitmq.queue}") private String queueName; @Value("${rabbitmq.exchange}") private String exchange; @Value("${rabbitmq.routingkey}") private String routingkey; @Bean public Queue queue() { return new Queue(queueName, false); } @Bean public DirectExchange exchange() { return new DirectExchange(exchange); } @Bean public Binding binding(Queue queue, DirectExchange exchange) { return BindingBuilder.bind(queue).to(exchange).with(routingkey); } @Bean public MessageConverter jsonMessageConverter() { return new Jackson2JsonMessageConverter(); } @Bean public AmqpTemplate rabbitTemplate(ConnectionFactory connectionFactory) { final RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory); rabbitTemplate.setMessageConverter(jsonMessageConverter()); return rabbitTemplate; } } |
Bir servis katmanı oluşturup RabbitMQ ile yapılacak işlemleri buraya ekliyoruz.
1 2 3 4 5 6 7 |
public interface RabbitMQService { void send(Blog blog); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
@Service public class RabbitMQServiceImpl implements RabbitMQService { @Autowired private AmqpTemplate rabbitTemplate; @Autowired private RabbitMQConfig config; @Override public void send(Blog blog) { rabbitTemplate.convertAndSend(config.getExchange(), config.getRoutingkey(), blog); } } |
application.yml dosyamızda ayarlar da aşağıdaki gibi olmalıdır. Docker komutunda belirttiğimiz bilgilerin doğruluğundan emin olmak gerek. RabbitMQ’nun default portu 5672, plugin portu ise 15672.
1 2 3 4 5 6 7 8 9 10 11 12 |
spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=admin spring.rabbitmq.password=123456 rabbitmq.exchange=bilisimio.exchange rabbitmq.queue=bilisimio.queue rabbitmq.routingkey=bilisimio.routingkey spring.main.allow-bean-definition-overriding=true |
Şimdi tek kalan işlem Rabbit’e yazmak.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
@Autowired private BlogService service; @Autowired private RabbitMQService rabbit; public Blog getBlogById(Long id) { Blog blog = service.getBlogById(id); rabbit.send(blog); return blog; } |
Artık Rabbite yazıp yazmadığımızı kontrol edebiliriz. Ana sayfadan Queues tabına geçiyoruz. Burada oluşturduğumuz queue ismini görmemiz gerekiyor. Bu queue’nun içinde ilgili bilgiler mevcut. Get messages kısmından yazdığımız kaydı aşağıdaki gibi görebiliriz.
RabbitMQ ile ilgili diğer yazılarımız için;
- https://bilisim.io/2017/01/09/merhaba-rabbitmq/
- https://bilisim.io/2017/01/23/exchange-direct/
- https://bilisim.io/2017/01/23/exchange-direct/
- https://bilisim.io/2017/01/10/workqueue/
Bir sonraki yazımız gönderilen mesajın okunması üzerine olacak.
Faydalı olması dileğiyle.