All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.reactivecommons.async.rabbit.communications.TopologyCreator Maven / Gradle / Ivy

package org.reactivecommons.async.rabbit.communications;

import com.rabbitmq.client.AMQP;
import lombok.extern.java.Log;
import reactor.core.publisher.Mono;
import reactor.rabbitmq.BindingSpecification;
import reactor.rabbitmq.ExchangeSpecification;
import reactor.rabbitmq.QueueSpecification;
import reactor.rabbitmq.Sender;

import java.util.HashMap;
import java.util.Map;
import java.util.Optional;

@Log
/*
 Direct use of channel is temporal, remove when https://github.com/reactor/reactor-rabbitmq/issues/37 is fixed in 1.0.0.RC2
 */
public class TopologyCreator {

    private final Sender sender;

    public TopologyCreator(Sender sender) {
        this.sender = sender;
    }

    public Mono declare(ExchangeSpecification exchange) {
        return sender.declare(exchange)
                .onErrorMap(TopologyDefException::new);
    }

    public Mono declare(QueueSpecification queue) {
        return sender.declare(queue)
                .onErrorMap(TopologyDefException::new);
    }

    public Mono bind(BindingSpecification binding) {
        return sender.bind(binding)
                .onErrorMap(TopologyDefException::new);
    }

    public Mono unbind(BindingSpecification binding) {
        return sender.unbind(binding)
                .onErrorMap(TopologyDefException::new);
    }

    public Mono declareDLQ(String originQueue, String retryTarget, int retryTime, Optional maxLengthBytesOpt) {
        final Map args = new HashMap<>();
        args.put("x-dead-letter-exchange", retryTarget);
        args.put("x-message-ttl", retryTime);
        maxLengthBytesOpt.ifPresent(maxLengthBytes -> args.put("x-max-length-bytes", maxLengthBytes));
        QueueSpecification specification = QueueSpecification.queue(originQueue + ".DLQ")
                .durable(true)
                .arguments(args);
        return declare(specification);
    }

    public Mono declareQueue(String name, String dlqExchange, Optional maxLengthBytesOpt) {
        return declareQueue(name, dlqExchange, maxLengthBytesOpt, Optional.empty());
    }

    public Mono declareQueue(String name, String dlqExchange, Optional maxLengthBytesOpt,
                                                   Optional dlRoutingKey) {
        final Map args = new HashMap<>();
        args.put("x-dead-letter-exchange", dlqExchange);
        maxLengthBytesOpt.ifPresent(maxLengthBytes -> args.put("x-max-length-bytes", maxLengthBytes));
        dlRoutingKey.ifPresent(routingKey -> args.put("x-dead-letter-routing-key", routingKey));
        QueueSpecification specification = QueueSpecification.queue(name)
                .durable(true)
                .arguments(args);
        return declare(specification);
    }

    public Mono declareQueue(String name, Optional maxLengthBytesOpt) {
        QueueSpecification specification = QueueSpecification.queue(name)
                .durable(true);
        if (maxLengthBytesOpt.isPresent()) {
            final Map args = new HashMap<>();
            args.put("x-max-length-bytes", maxLengthBytesOpt.orElse(0));
            specification = specification.arguments(args);
        }

        return declare(specification);
    }

    public static class TopologyDefException extends RuntimeException {
        public TopologyDefException(Throwable cause) {
            super(cause);
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy