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

io.quarkiverse.rabbitmqclient.RabbitMQReadyCheck Maven / Gradle / Ivy

package io.quarkiverse.rabbitmqclient;

import java.net.Socket;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;

import org.eclipse.microprofile.health.HealthCheck;
import org.eclipse.microprofile.health.HealthCheckResponse;
import org.eclipse.microprofile.health.HealthCheckResponseBuilder;
import org.eclipse.microprofile.health.Readiness;

import com.rabbitmq.client.Address;

/**
 * RabbitMQ ready check which checks if at least one of the configured brokers is available.
 *
 * @author b.passon
 */
@Readiness
@ApplicationScoped
public class RabbitMQReadyCheck implements HealthCheck {

    public static final String HEALTH_CHECK_NAME = "quarkus-rabbitmq-client";
    @Inject
    RabbitMQClientsConfig config;

    @Override
    public HealthCheckResponse call() {
        return checkAllBrokers();
    }

    private HealthCheckResponse checkAllBrokers() {
        // We can report UP if all brokers are UP.
        // A broker is considered UP if one or more of its associated
        //   addresses is reachable.

        Map> data = new HashMap<>();
        if (config.defaultClient != null) {
            appendClientState(data, null, config.defaultClient);
        }
        config.namedClients.forEach((n, c) -> appendClientState(data, n, c));

        HealthCheckResponseBuilder builder = HealthCheckResponse.builder();
        builder.name(HEALTH_CHECK_NAME);
        builder.status(data.values().stream()
                .allMatch(clientStatuses -> clientStatuses.stream().anyMatch(ClientStatus::isUp)));
        data.forEach((name, clientStatuses) -> {
            String prefix = name.length() > 0 ? name + "|" : name;
            clientStatuses.forEach(cs -> {
                builder.withData(prefix + cs.getAddress(), cs.getStatus());
            });
        });
        return builder.build();
    }

    private void appendClientState(Map> data, String name, RabbitMQClientConfig config) {
        String clientName = name == null ? "" : name;
        data.putIfAbsent(clientName, new ArrayList<>());
        RabbitMQHelper.resolveBrokerAddresses(config)
                .forEach((a) -> {
                    if (isBrokerAvailable(a)) {
                        data.get(clientName).add(new ClientStatus(a, true));
                    } else {
                        data.get(clientName).add(new ClientStatus(a, false));
                    }
                });
    }

    private boolean isBrokerAvailable(Address address) {
        try {
            new Socket(address.getHost(), address.getPort());
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    private static final class ClientStatus {
        private final Address address;
        private final boolean isUp;

        public ClientStatus(Address address, boolean isUp) {
            this.address = address;
            this.isUp = isUp;
        }

        public boolean isUp() {
            return isUp;
        }

        public Address getAddress() {
            return address;
        }

        public String getStatus() {
            return isUp ? HealthCheckResponse.Status.UP.name() : HealthCheckResponse.Status.DOWN.name();
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy