Giriş
Şu satırı dahil ederiz
import org.springframework.amqp.core.QueuBuilder;
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 metoduBir 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
@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.