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

io.bitsensor.plugins.java.blocking.BlockingConfig Maven / Gradle / Ivy

The newest version!
package io.bitsensor.plugins.java.blocking;

import io.bitsensor.lib.entity.util.ProtoUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import io.bitsensor.plugins.shaded.io.bitsensor.plugins.shaded.org.springframework.amqp.core.*;
import io.bitsensor.plugins.shaded.io.bitsensor.plugins.shaded.org.springframework.amqp.core.AnonymousQueue.Base64UrlNamingStrategy;
import io.bitsensor.plugins.shaded.io.bitsensor.plugins.shaded.org.springframework.amqp.rabbit.AsyncRabbitTemplate;
import io.bitsensor.plugins.shaded.io.bitsensor.plugins.shaded.org.springframework.amqp.rabbit.annotation.EnableRabbit;
import io.bitsensor.plugins.shaded.io.bitsensor.plugins.shaded.org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory;
import io.bitsensor.plugins.shaded.io.bitsensor.plugins.shaded.org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import io.bitsensor.plugins.shaded.io.bitsensor.plugins.shaded.org.springframework.amqp.rabbit.connection.ConnectionFactory;
import io.bitsensor.plugins.shaded.io.bitsensor.plugins.shaded.org.springframework.amqp.rabbit.core.RabbitAdmin;
import io.bitsensor.plugins.shaded.io.bitsensor.plugins.shaded.org.springframework.amqp.rabbit.core.RabbitTemplate;
import io.bitsensor.plugins.shaded.io.bitsensor.plugins.shaded.org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer;
import io.bitsensor.plugins.shaded.io.bitsensor.plugins.shaded.org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import io.bitsensor.plugins.shaded.io.bitsensor.plugins.shaded.org.springframework.amqp.support.converter.MessageConverter;
import io.bitsensor.plugins.shaded.org.springframework.beans.factory.annotation.Value;
import io.bitsensor.plugins.shaded.org.springframework.context.annotation.Bean;
import io.bitsensor.plugins.shaded.org.springframework.context.annotation.ComponentScan;
import io.bitsensor.plugins.shaded.org.springframework.context.annotation.Configuration;

/**
 * Bean configuration class contains RabbitMQ connection and function configuration as well as exchanges, queue and
 * binding used for getting and listening to blacklist update from bitbrain-es.
 */
@Configuration
@ComponentScan("io.bitsensor.plugins.java.blocking")
@EnableRabbit
public class BlockingConfig {
    private static final Logger LOGGER = LoggerFactory.getLogger(BlockingConfig.class);

    public static final String TOPIC_EXCHANGE = "blacklist.topic";
    public static final String ADD_QUEUE = "add";
    public static final String UPDATE_QUEUE = "update";
    public static final String DELETE_QUEUE = "delete";

    public static final String RPC_EXCHANGE = "blacklist.rpc";
    public static final String RPC_ROUTING_KEY = "rpc";

    public static final String RPC_REPLY_QUEUE_PREFIX = "blacklist.rpc.replies-";
    public static final String TOPIC_UPDATE_QUEUE_PREFIX = "blacklist.topic.updates-";

    /**
     * RabbitMQ configuration
     */
    public static class RabbitMqConfig {

        @Value("${bitsensor.blocking.host:${bitsensor.host:${bitsensor.username}.bitsensor.io}}")
        private String host;

        @Value("${bitsensor.blocking.port:5672}")
        private int port;

        @Value("${bitsensor.blocking.username:blocking}")
        private String username;

        /**
         * Default password is bitsensor.apikey. If bitsensor.apikey is not set, nor
         * bitsensor.blocking.password is set, defaults to guest.
         */
        @Value("${bitsensor.blocking.password:${bitsensor.apikey:guest}}")
        private String password;

        @Value("${bitsensor.blocking.virtual-host:/}")
        private String virtualHost;

        @Bean
        public ConnectionFactory connectionFactory() {
            CachingConnectionFactory connectionFactory = new CachingConnectionFactory(host, port);
            connectionFactory.setUsername(username);
            connectionFactory.setPassword(password);
            connectionFactory.setVirtualHost(virtualHost);

            LOGGER.info("BitSensor connects: {}@{}:{}/{}", username, host, port, virtualHost);

            return connectionFactory;
        }

        @Bean
        public RabbitAdmin rabbitAdmin(ConnectionFactory connectionFactory) {
            RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory);
            rabbitAdmin.afterPropertiesSet();

            return rabbitAdmin;
        }

        /**
         * Returns a {@code RabbitListenerContainerFactory} configured to have custom message converter {@link
         * #jsonMessageConverter()}. This bean declaration is necessary for converting incoming message.
         */
        @Bean
        public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(ConnectionFactory connectionFactory) {
            SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
            factory.setConnectionFactory(connectionFactory);
            factory.setMessageConverter(jsonMessageConverter());

            return factory;
        }

        /**
         * Returns a {@code MessageConverter} configured to be able to parse Protobuf message and json message.
         */
        @Bean
        public MessageConverter jsonMessageConverter() {
            return new Jackson2JsonMessageConverter(ProtoUtils.objectMapper());
        }

        @Bean
        public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
            RabbitTemplate template = new RabbitTemplate(connectionFactory);
            template.setMessageConverter(jsonMessageConverter());

            return template;
        }

        @Bean
        public AsyncRabbitTemplate asyncRabbitTemplate(ConnectionFactory connectionFactory, RabbitTemplate rabbitTemplate, Queue rpcReplyQueue) {
            SimpleMessageListenerContainer listenerContainer = new SimpleMessageListenerContainer(connectionFactory);
            listenerContainer.setQueueNames(rpcReplyQueue.getName());

            return new AsyncRabbitTemplate(rabbitTemplate, listenerContainer);
        }
    }

    /**
     * Client configuration for exchanges, queues and bindings. Note that exchanges, queues and bindings here will not
     * be automatically declared and appear in RabbitMq without RabbitAdmin bean declared.
     */
    public static class ClientConfig {

        public static Base64UrlNamingStrategy topicNamingStrategy() {
            return new Base64UrlNamingStrategy(TOPIC_UPDATE_QUEUE_PREFIX);
        }

        @Bean
        public Queue rpcReplyQueue() {
            return new AnonymousQueue(new Base64UrlNamingStrategy(RPC_REPLY_QUEUE_PREFIX));
        }

        @Bean
        public TopicExchange topicExchange() {
            return new TopicExchange(TOPIC_EXCHANGE);
        }

        @Bean
        public Queue blacklistAddQueue() {
            return new AnonymousQueue(topicNamingStrategy());
        }

        @Bean
        public Queue blacklistDeleteQueue() {
            return new AnonymousQueue(topicNamingStrategy());
        }

        @Bean
        public Queue blacklistUpdateQueue() {
            return new AnonymousQueue(topicNamingStrategy());
        }

        @Bean
        public Binding binding1(TopicExchange topicExchange, Queue blacklistAddQueue) {
            return BindingBuilder.bind(blacklistAddQueue).to(topicExchange).with(ADD_QUEUE);
        }

        @Bean
        public Binding binding2(TopicExchange topicExchange, Queue blacklistUpdateQueue) {
            return BindingBuilder.bind(blacklistUpdateQueue).to(topicExchange).with(UPDATE_QUEUE);
        }

        @Bean
        public Binding binding3(TopicExchange topicExchange, Queue blacklistDeleteQueue) {
            return BindingBuilder.bind(blacklistDeleteQueue).to(topicExchange).with(DELETE_QUEUE);
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy