Java RabbitMQ'da en basit kuyruk modu, bir üretici ve bir tüketici içerir.
Şu anda Javayla RabbitMQ işlemleri genellikle Spring Boot'un spring-boot-starter-amqp
paketini kullanmaktadır, bu da temelde Kuyruğu işletmek için Spring AMQP'yi kullanmaktadır.
1. Önkoşul Öğretici
Lütfen ilgili bilgileri anlamak için aşağıdaki bölümleri okuyun:
2. Bağımlılık Paketi
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
3. RabbitMQ Yapılandırma
application.yml
yapılandırmasını düzenleyin:
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
4. Kuyruğu Bildirme
Spring Boot yapılandırma sınıfı üzerinden kuyruğu yapılandırın:
package com.tizi365.rabbitmq.config;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class QueueConfig {
@Bean
public Queue helloQueue() {
// Kuyruğu bildirin ve kuyruk adı benzersiz olmalıdır
return new Queue("hello");
}
}
İpucu: İş gereksinimlerine göre birden fazla kuyruk tanımlayabilirsiniz. Kuyruk adı ve Kuyrukun bean id'si sadece farklı olmalıdır. Burada, yöntem adı bean id'si olacaktır.
5. Mesaj Gönderme
Mesaj göndermek için RabbitTemplate sınıfı kullanılır, Spring Boot zaten onun için başlatılmıştır. Sadece örneği enjekte edin:
package com.tizi365.rabbitmq.service;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
@Service
public class SendService {
// RabbitTemplate örneğini enjekte edin
@Autowired
private RabbitTemplate template;
// Önceden tanımlanmış kuyruğu enjekte edin
@Autowired
@Qualifier("helloQueue")
private Queue helloQueue;
// Gösterim için, mesajları düzenli olarak göndermek için Spring'in yerleşik zamanlanmış görevini kullanıyoruz (saniyede bir mesaj)
@Scheduled(fixedDelay = 1000, initialDelay = 1000)
public void send() {
// Mesaj içeriği
String message = "Merhaba Dünya!";
// Mesajı gönder
// İlk parametre yönlendirme anahtarıdır, burada kuyruk adını yönlendirme anahtarı olarak kullanıyoruz
// İkinci parametre mesaj içeriğidir, seri hale getirme desteği sağladığı sürece herhangi bir türü destekler
template.convertAndSend(helloQueue.getName(), message);
System.out.println("Mesaj gönderiliyor '" + message + "'");
}
}
İpucu: Burada doğrudan değişim kullanmıyoruz. Altta yatan varsayılan değişim (Doğrudan değişim) kullanılacaktır.
6. Mesajı Almak
Tüketicinin mesaj alması da basittir:
package com.tizi365.rabbitmq.listener;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
// Mesaj dinleyicisini, önceki kuyruk adıyla aynı olması gereken `queues` parametresi aracılığıyla dinlemek üzere belirtin
@RabbitListener(queues = "hello")
public class HelloListener {
// Mesaj işleyicisini işaretlemek için RabbitHandler'ı kullanın, mesaj işleme mantığını yürütmek için kullanılır
@RabbitHandler
public void receive(String msg) {
System.out.println("Tüketici - Alınan mesaj '" + msg + "'");
}
}
7. Özel Mesaj Türü
Daha önce string türünde bir mesaj gönderdik. Gerçek iş senaryolarında, doğrudan çeşitli özel Java nesnesi türlerini göndermeyi tercih ederiz.
Bir varlık nesnesi tanımlayın
package com.tizi365.rabbitmq.domain;
import java.io.Serializable;
import lombok.Data;
// Blog içeriği
@Data
public class Blog implements Serializable {
// id
private Integer id;
// başlık
private String title;
}
Özel türde mesaj gönderme
Blog blog = new Blog();
blog.setId(100);
blog.setTitle("Tizi365 RabbitMQ öğretici");
// Mesajı gönder
template.convertAndSend(helloQueue.getName(), blog);
Özel türdeki mesajları al
@RabbitHandler
// Yalnızca yöntem parametresini özel mesaj türüne değiştirin
public void receive(Blog msg) {
System.out.println("Tüketici - '" + msg.getTitle() + "' başlıklı mesaj alındı");
}
Mesaj içeriği için JSON serileştirmesini kullan
RabbitMQ, Java varlık nesnesi verilerini gönderdiğinde varsayılan olarak JDK'nın nesne serileştirme aracını kullanır. Bu, veri serileştirmesi için JSON biçimini kullanacak şekilde değiştirebiliriz. Bu, diğer dillerin Java tarafından gönderilen mesajları tüketmesine olanak tanır ve mesaj formatını daha okunabilir hale getirir.
Önceki yapılandırma sınıfını değiştirerek mesaj veri serileştirmesi ve serileştirmesi için Jackson JSON ayrıştırıcısını kullanacak şekilde aşağıdaki yapılandırmayı ekleyin.
@Bean
public Jackson2JsonMessageConverter messageConverter() {
// Varsayılan mesaj dönüştürücüsünü ayarlayın
return new Jackson2JsonMessageConverter();
}