27 Mayıs 2020 Çarşamba

Spring Amqp QueueBuilder Sınıfı

Giriş
Şu satırı dahil ederiz
import org.springframework.amqp.core.QueuBuilder;
RabbitMQ yazısına bakabilirsiniz.

Kullanım
- durable() veya nonDurable() metodu ile kuyruk ismi belirtilir.
- Kuyruk ayarları withArgument() metodu ile tek tek belirtilir, veya withArguments() metodu ile topluca belirtilir.
- build() metodu çağrılarak kuyruk yaratılır.
- Daha sonra yaratılan kuyruk AmqpAdmin veya RabbitAdmin sınıfının declaredQueue() metoduna parametre olarak geçilir.

build metodu
Şöyle yaparız.
@Bean
public Queue demoDeadLetterQueue(RabbitAdmin rabbitAdmin) {
  Queue queue = QueueBuilder.durable("demo.queue.dead-letter")
    .build();
    rabbitAdmin.declareQueue(queue)
    return queue;
}
deadLetterExchange metodu
Bir kuyruk ile Dead Letter Exchange bağlanır. Exchange mantığı sadece RabbitMQ'da vardır.

Örnek
Şöyle yaparız.  Bu yöntem yerine withArguments() çağrıları ile de aynı şey yapılabilir.
@Configuration
public class RMQConfiguration implements Serializable {

  String DEAD_LETTER_EXCHANGE_NAME;

  String INCOMING_QUEUE_NAME;

  @Bean
  Queue queue() {
    return QueueBuilder.durable(INCOMING_QUEUE_NAME)
      .deadLetterExchange(DEAD_LETTER_EXCHANGE_NAME)
      .build();
  }
}
Örnek
deadLetterExchange() aslında altta bazı string sabitleri kullanıyor. Aynı şeyi istersek şöyle de yaparız
@Bean
Queue delayQueuePerMessageTTL() {
  return QueueBuilder.durable(DELAY_QUEUE_PER_MESSAGE_TTL_NAME)
    .withArgument("x-dead-letter-exchange", DELAY_EXCHANGE_NAME)
    .withArgument("x-dead-letter-routing-key", DELAY_PROCESS_QUEUE_NAME)
    .build();
}
DLX exchange + queue ikilisini yaratmak için şöyle yaparız
@Bean
Queue delayProcessQueue() {
  return QueueBuilder.durable(DELAY_PROCESS_QUEUE_NAME)
                       .build();
}

@Bean
DirectExchange delayExchange() {
  return new DirectExchange(DELAY_EXCHANGE_NAME);
}

@Bean
Binding dlxBinding(Queue delayProcessQueue, DirectExchange delayExchange) {
  return BindingBuilder.bind(delayProcessQueue)
    .to(delayExchange)
    .with(DELAY_PROCESS_QUEUE_NAME);
}
durable metodu
Parametre olarak kuyruk ismini alır.
Örnek
Şöyle yaparız.
@Bean
public Queue demoQueue(RabbitAdmin rabbitAdmin) {
  Queue queue = QueueBuilder.durable("demo.queue")
    .withArgument("x-dead-letter-exchange", StringUtils.EMPTY)
    .withArgument("x-dead-letter-routing-key", "demo.queue.dead-letter")
    .build();
    queue.setAdminsThatShouldDeclare(rabbitAdmin);
    return queue;
}
Örnek
Şöyle yaparız
@Bean
public Queue createDelayedMessageQueue(RabbitAdmin rabbitAdmin) {
  Queue delayedMessageQueue = QueueBuilder.durable("...")
    .withArgument("x-dead-letter-exchange", "")
    .withArgument("x-dead-letter-routing-key", "...")
    .withArgument("x-queue-mode", "lazy")
    .build();
    delayedMessageQueue.setAdminsThatShouldDeclare(rabbitAdmin);
    return delayedMessageQueue;
}
nonDurable metodu
Parametre olarak kuyruk ismini alır.
Örnek
Şöyle yaparız.
@Bean
public Queue outgoingQueue() {
  Map<String, Object> args = new HashMap<>();
  // The default exchange
  args.put("x-dead-letter-exchange", "");
  // Route to the dead letter queue when the TTL occurs
  args.put("x-dead-letter-routing-key", Constants.DEAD_LETTER_QUEUE);
  // TTL 10 seconds
  args.put("x-message-ttl", 10000);
  args.put("x-max-priority", 10);

  Queue queue =   QueueBuilder.nonDurable(Constants.LIVE_QUEUE)
    .withArguments(args).build();

  amqpAdmin.declareQueue(queue);


  RabbitMqUtil.createShovel(props, appProperties,
     queue.getName(), Constants.MASTER_LIVE_QUEUE);

  return queue;
}
Diğer
"x-dead-letter-exchange" : Dead letter kuyruğuna yazmak için kullanılacak exchange ismi. 
 -Default exchange ise boş string verilir, "x-dead-letter-routing-key" kuyruk ismine sahiptir. Açıklaması şöyle
.. we are using the default exchange (no-name) as the dead letter exchange and using the dead letter queue name as the new routing key. This will work since any queue is bound to the default exchange with the binding key equal to the queue name.
- Direct exchange kullanıyorsak, "x-dead-letter-exchange" kuyruk ismini alır, "x-dead-letter-routing-key" boş string verilir.

"x-dead-letter-routing-key" : Yukarıdaki açıklamaya bakınız

"x-message-ttl" : Mesajın TTL değeri. TTL süresi içinde işlenmezse dead-letter kuyruğuna gönderilir.

"x-max-priority" : Kuyruğa yazılabilecek mesajların alabileceği en yüksek öncelik değeri

"x-queue-mode" : lazy ise mesajlar bellekte tutulmaz, diske yazılır.



Hiç yorum yok:

Yorum Gönder