io.bitsensor.plugins.java.blocking.BlockingConfig Maven / Gradle / Ivy
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);
}
}
}