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

io.dropwizard.redis.RedisClientFactory Maven / Gradle / Ivy

package io.dropwizard.redis;

import brave.Tracing;
import com.codahale.metrics.MetricRegistry;
import com.codahale.metrics.health.HealthCheckRegistry;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonTypeName;
import io.dropwizard.lifecycle.setup.LifecycleEnvironment;
import io.dropwizard.redis.clientoptions.ClientOptionsFactory;
import io.dropwizard.redis.health.RedisHealthCheck;
import io.dropwizard.redis.managed.RedisClientManager;
import io.dropwizard.redis.metrics.event.visitor.EventVisitor;
import io.dropwizard.redis.metrics.event.wrapper.EventWrapperFactory;
import io.dropwizard.redis.metrics.event.wrapper.VisitableEventWrapper;
import io.dropwizard.redis.uri.RedisURIFactory;
import io.lettuce.core.RedisClient;
import io.lettuce.core.RedisURI;
import io.lettuce.core.api.StatefulRedisConnection;
import io.lettuce.core.codec.RedisCodec;
import io.lettuce.core.resource.ClientResources;

import java.util.List;
import java.util.Optional;

import javax.validation.Valid;
import javax.validation.constraints.NotNull;

@JsonTypeName("basic")
public class RedisClientFactory extends AbstractRedisClientFactory {
    @Valid
    @NotNull
    @JsonProperty
    private RedisURIFactory node;

    @Valid
    @NotNull
    @JsonProperty
    private ClientOptionsFactory clientOptions = new ClientOptionsFactory();

    @Override
    public StatefulRedisConnection build(final HealthCheckRegistry healthChecks, final LifecycleEnvironment lifecycle,
                                               final MetricRegistry metrics) {
        return build(healthChecks, lifecycle, metrics, null);
    }

    @Override
    public StatefulRedisConnection build(final HealthCheckRegistry healthChecks, final LifecycleEnvironment lifecycle,
                                               final MetricRegistry metrics, final Tracing tracing) {
        final RedisURI uri = node.build();

        final ClientResources resources = clientResources.build(name, metrics, tracing);

        final RedisClient redisClient = RedisClient.create(resources, uri);

        redisClient.setOptions(clientOptions.build());

        final RedisCodec codec = redisCodec.build();

        final StatefulRedisConnection connection = redisClient.connect(codec);

        // manage client and connection
        lifecycle.manage(new RedisClientManager(redisClient, connection, name));

        // health check
        healthChecks.register(name, new RedisHealthCheck(() -> connection.sync().ping()));

        // metrics (latency and other connection events) integration
        final List eventVisitors = buildEventVisitors(metrics);
        redisClient.getResources()
                .eventBus()
                .get()
                .subscribe(event -> {
                    final Optional eventWrapperOpt = EventWrapperFactory.build(event);
                    eventWrapperOpt.ifPresent(eventWrapper -> eventVisitors.forEach(eventWrapper::accept));
                });

        return connection;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy