reactor.rabbitmq.docs.ApiGuideSender.java Source code

Java tutorial

Introduction

Here is the source code for reactor.rabbitmq.docs.ApiGuideSender.java

Source

/*
 * Copyright (c) 2018 Pivotal Software Inc, All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *       https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package reactor.rabbitmq.docs;

import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Address;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Delivery;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.core.scheduler.Schedulers;
import reactor.rabbitmq.*;

import java.time.Duration;
import java.util.UUID;
import java.util.function.Supplier;
import static reactor.rabbitmq.RabbitFlux.createSender;

// tag::static-import[]
import static reactor.rabbitmq.ResourcesSpecification.*;
// end::static-import[]

/**
 *
 */
@SuppressWarnings("unused")
public class ApiGuideSender {

    void optionsSimple() {
        // tag::options-simple[]
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.useNio();

        SenderOptions senderOptions = new SenderOptions().connectionFactory(connectionFactory) // <1>
                .resourceManagementScheduler(Schedulers.elastic()); // <2>
        // end::options-simple[]
        // tag::instanciation[]
        Sender sender = RabbitFlux.createSender(senderOptions);
        // end::instanciation[]
        // tag::outbound-message-flux[]
        Flux<OutboundMessage> outboundFlux = Flux.range(1, 10)
                .map(i -> new OutboundMessage("amq.direct", "routing.key", ("Message " + i).getBytes()));
        // end::outbound-message-flux[]
        Logger log = LoggerFactory.getLogger(ApiGuideSender.class);
        // tag::send-flux[]
        sender.send(outboundFlux) // <1>
                .doOnError(e -> log.error("Send failed", e)) // <2>
                .subscribe(); // <3>
        // end::send-flux[]
        // tag::resource-declaration[]
        Mono<AMQP.Exchange.DeclareOk> exchange = sender
                .declareExchange(ExchangeSpecification.exchange("my.exchange"));
        Mono<AMQP.Queue.DeclareOk> queue = sender.declareQueue(QueueSpecification.queue("my.queue"));
        Mono<AMQP.Queue.BindOk> binding = sender
                .bind(BindingSpecification.binding().exchange("my.exchange").queue("my.queue").routingKey("a.b"));
        // end::resource-declaration[]
        // tag::resource-declaration-static-import[]
        sender.declare(exchange("my.exchange")).then(sender.declare(queue("my.queue")))
                .then(sender.bind(binding("my.exchange", "a.b", "my.queue")))
                .subscribe(r -> System.out.println("Exchange and queue declared and bound"));
        // end::resource-declaration-static-import[]
        // tag::resource-deletion[]
        sender.unbind(binding("my.exchange", "a.b", "my.queue")).then(sender.delete(exchange("my.exchange")))
                .then(sender.delete(queue("my.queue")))
                .subscribe(r -> System.out.println("Exchange and queue unbound and deleted"));
        // end::resource-deletion[]
        // tag::closing[]
        sender.close();
        // end::closing[]
    }

    void optionsConnectionSupplier() {
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.useNio();
        // tag::options-connection-supplier[]
        SenderOptions senderOptions = new SenderOptions().connectionFactory(connectionFactory)
                .connectionSupplier(cf -> cf.newConnection( // <1>
                        new Address[] { new Address("192.168.0.1"), new Address("192.168.0.2") },
                        "reactive-sender"))
                .resourceManagementScheduler(Schedulers.elastic());
        // end::options-connection-supplier[]
    }

    void publisherConfirms() {
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.useNio();

        SenderOptions senderOptions = new SenderOptions().connectionFactory(connectionFactory)
                .resourceManagementScheduler(Schedulers.elastic());
        Sender sender = RabbitFlux.createSender(senderOptions);
        // tag::publisher-confirms[]
        Flux<OutboundMessage> outboundFlux = Flux.range(1, 10)
                .map(i -> new OutboundMessage("amq.direct", "routing.key", "hello".getBytes()));
        sender.sendWithPublishConfirms(outboundFlux).subscribe(outboundMessageResult -> {
            // outbound message has reached the broker
        });
        // end::publisher-confirms[]
    }

    void rpc() {
        // tag::rpc[]
        String queue = "rpc.server.queue";
        Sender sender = RabbitFlux.createSender();
        RpcClient rpcClient = sender.rpcClient("", queue); // <1>
        Mono<Delivery> reply = rpcClient.rpc(Mono.just(new RpcClient.RpcRequest("hello".getBytes()) // <2>
        ));
        rpcClient.close(); // <3>
        // end::rpc[]
    }

    void rpcCorrelationIdProvider() {
        // tag::rpc-supplier[]
        String queue = "rpc.server.queue";
        Supplier<String> correlationIdSupplier = () -> UUID.randomUUID().toString(); // <1>
        Sender sender = RabbitFlux.createSender();
        RpcClient rpcClient = sender.rpcClient("", queue, correlationIdSupplier // <2>
        );
        Mono<Delivery> reply = rpcClient.rpc(Mono.just(new RpcClient.RpcRequest("hello".getBytes())));
        rpcClient.close();
        // end::rpc-supplier[]
    }

    void retryExceptionHandler() {
        Flux<OutboundMessage> outboundFlux = null;
        // tag::retry-settings[]
        Sender sender = RabbitFlux.createSender();
        sender.send(outboundFlux,
                new SendOptions()
                        .exceptionHandler(new ExceptionHandlers.RetrySendingExceptionHandler(Duration.ofSeconds(20),
                                Duration.ofMillis(500), ExceptionHandlers.CONNECTION_RECOVERY_PREDICATE)));
        // end::retry-settings[]
    }

    void resourceManagementOptions() {
        Mono<Connection> connectionMono = null;
        Sender sender = createSender();

        // tag::resource-management-options[]
        Mono<Channel> channelMono = connectionMono.map(c -> {
            try {
                return c.createChannel();
            } catch (Exception e) {
                throw new RabbitFluxException(e);
            }
        }).cache(); // <1>

        ResourceManagementOptions options = new ResourceManagementOptions().channelMono(channelMono); // <2>

        sender.declare(exchange("my.exchange"), options) // <3>
                .then(sender.declare(queue("my.queue"), options)) // <3>
                .then(sender.bind(binding("my.exchange", "a.b", "my.queue"), options)) // <3>
                .subscribe(r -> System.out.println("Exchange and queue declared and bound"));
        // end::resource-management-options[]
    }

    void channelPool() {
        Mono<Connection> connectionMono = null;
        Flux<OutboundMessage> outboundFlux = null;
        Sender sender = createSender();

        // tag::channel-pool[]
        ChannelPool channelPool = ChannelPoolFactory.createChannelPool( // <1>
                connectionMono, new ChannelPoolOptions().maxCacheSize(5) // <2>
        );
        sender.send(outboundFlux, new SendOptions().channelPool(channelPool)); // <3>
        // ...
        channelPool.close(); // <4>
        // end::channel-pool[]
    }

}