Java RabbitMQ'da en basit kuyruk modu, bir üretici ve bir tüketici içerir.

RabbitMQ Basit Kuyruk

Ş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();
}