package org.springframework.cloud.service.messaging; import org.springframework.amqp.rabbit.connection.CachingConnectionFactory; import org.springframework.amqp.rabbit.connection.ConnectionFactory; import org.springframework.cloud.service.AbstractServiceConnectorCreator; import org.springframework.cloud.service.ServiceConnectorConfig; import org.springframework.cloud.service.common.AmqpServiceInfo; import java.net.URI; import java.net.URISyntaxException; /** * Simplified access to creating RabbitMQ service objects. * * @author Ramnivas Laddad * @author Dave Syer * @author Thomas Risberg * @author Mark Fisher * @author Scott Frederick */ public class RabbitConnectionFactoryCreator extends AbstractServiceConnectorCreator<ConnectionFactory, AmqpServiceInfo> { private RabbitConnectionFactoryConfigurer configurer = new RabbitConnectionFactoryConfigurer(); @Override public ConnectionFactory create(AmqpServiceInfo serviceInfo, ServiceConnectorConfig serviceConnectorConfiguration) { com.rabbitmq.client.ConnectionFactory connectionFactory = createRabbitConnectionFactory(serviceInfo); configurer.configure(connectionFactory, (RabbitConnectionFactoryConfig) serviceConnectorConfiguration); return createSpringConnectionFactory(serviceInfo, serviceConnectorConfiguration, connectionFactory); } private com.rabbitmq.client.ConnectionFactory createRabbitConnectionFactory(AmqpServiceInfo serviceInfo) { com.rabbitmq.client.ConnectionFactory connectionFactory = new com.rabbitmq.client.ConnectionFactory(); if (serviceInfo.getUris() != null && serviceInfo.getUris().size() > 0) { setConnectionFactoryUri(connectionFactory, serviceInfo.getUris().get(0)); } else { setConnectionFactoryUri(connectionFactory, serviceInfo.getUri()); } return connectionFactory; } private void setConnectionFactoryUri(com.rabbitmq.client.ConnectionFactory connectionFactory, String uri) { try { connectionFactory.setUri(uri); } catch (Exception e) { throw new IllegalArgumentException("Invalid AMQP URI", e); } } private CachingConnectionFactory createSpringConnectionFactory(AmqpServiceInfo serviceInfo, ServiceConnectorConfig serviceConnectorConfiguration, com.rabbitmq.client.ConnectionFactory connectionFactory) { CachingConnectionFactory cachingConnectionFactory = new CachingConnectionFactory(connectionFactory); if (serviceInfo.getUris() != null) { cachingConnectionFactory.setAddresses(getAddresses(serviceInfo)); } if (serviceConnectorConfiguration != null) { Integer channelCacheSize = ((RabbitConnectionFactoryConfig) serviceConnectorConfiguration).getChannelCacheSize(); if (channelCacheSize != null) { cachingConnectionFactory.setChannelCacheSize(channelCacheSize); } } return cachingConnectionFactory; } private String getAddresses(AmqpServiceInfo serviceInfo) { try { StringBuilder addresses = new StringBuilder(); for (String uriString : serviceInfo.getUris()) { URI uri = new URI(uriString); if (addresses.length() > 0) { addresses.append(','); } addresses.append(uri.getHost()).append(':').append(uri.getPort()); } return addresses.toString(); } catch (URISyntaxException e) { throw new IllegalArgumentException("Invalid AMQP URI", e); } } }