Browse Source
Previously, if one wants to create a custom `JmsListenerContainerFactory` or `RabbitListenerContainerFactory`, a bunch of code from the auto- configuration must be duplicated. This commit introduces two services to configure such factory for JMS and AMQP with the same sensible defaults that were applied by the auto-configufrations. Closes gh-5138pull/5146/head
6 changed files with 327 additions and 57 deletions
@ -0,0 +1,87 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2012-2016 the original author or authors. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package org.springframework.boot.autoconfigure.amqp; |
||||||
|
|
||||||
|
import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory; |
||||||
|
import org.springframework.amqp.rabbit.connection.ConnectionFactory; |
||||||
|
import org.springframework.amqp.rabbit.listener.RabbitListenerContainerFactory; |
||||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||||
|
import org.springframework.util.Assert; |
||||||
|
|
||||||
|
/** |
||||||
|
* Configure {@link RabbitListenerContainerFactory} with sensible defaults. |
||||||
|
* |
||||||
|
* @author Stephane Nicoll |
||||||
|
* @since 1.3.3 |
||||||
|
*/ |
||||||
|
public final class RabbitListenerContainerFactoryConfigurer { |
||||||
|
|
||||||
|
private RabbitProperties rabbitProperties; |
||||||
|
|
||||||
|
/** |
||||||
|
* Set the {@link RabbitProperties} to use. |
||||||
|
* @param rabbitProperties the {@link RabbitProperties} |
||||||
|
*/ |
||||||
|
@Autowired |
||||||
|
public void setRabbitProperties(RabbitProperties rabbitProperties) { |
||||||
|
this.rabbitProperties = rabbitProperties; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Create a new and pre-configured {@link SimpleRabbitListenerContainerFactory} instance |
||||||
|
* for the specified {@link ConnectionFactory}. |
||||||
|
* @param connectionFactory the {@link ConnectionFactory} to use. |
||||||
|
* @return a pre-configured {@link SimpleRabbitListenerContainerFactory} |
||||||
|
*/ |
||||||
|
public SimpleRabbitListenerContainerFactory createRabbitListenerContainerFactory( |
||||||
|
ConnectionFactory connectionFactory) { |
||||||
|
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); |
||||||
|
configure(factory, connectionFactory); |
||||||
|
return factory; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Apply the default settings for the specified jms listener container factory. The |
||||||
|
* factory can be further tuned and default settings can be overridden. |
||||||
|
* @param factory the {@link SimpleRabbitListenerContainerFactory} instance to configure |
||||||
|
* @param connectionFactory the {@link ConnectionFactory} to use |
||||||
|
*/ |
||||||
|
public void configure(SimpleRabbitListenerContainerFactory factory, |
||||||
|
ConnectionFactory connectionFactory) { |
||||||
|
Assert.notNull(factory, "Factory must not be null"); |
||||||
|
Assert.notNull(connectionFactory, "ConnectionFactory must not be null"); |
||||||
|
factory.setConnectionFactory(connectionFactory); |
||||||
|
RabbitProperties.Listener listenerConfig = this.rabbitProperties.getListener(); |
||||||
|
factory.setAutoStartup(listenerConfig.isAutoStartup()); |
||||||
|
if (listenerConfig.getAcknowledgeMode() != null) { |
||||||
|
factory.setAcknowledgeMode(listenerConfig.getAcknowledgeMode()); |
||||||
|
} |
||||||
|
if (listenerConfig.getConcurrency() != null) { |
||||||
|
factory.setConcurrentConsumers(listenerConfig.getConcurrency()); |
||||||
|
} |
||||||
|
if (listenerConfig.getMaxConcurrency() != null) { |
||||||
|
factory.setMaxConcurrentConsumers(listenerConfig.getMaxConcurrency()); |
||||||
|
} |
||||||
|
if (listenerConfig.getPrefetch() != null) { |
||||||
|
factory.setPrefetchCount(listenerConfig.getPrefetch()); |
||||||
|
} |
||||||
|
if (listenerConfig.getTransactionSize() != null) { |
||||||
|
factory.setTxSize(listenerConfig.getTransactionSize()); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,116 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2012-2016 the original author or authors. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package org.springframework.boot.autoconfigure.jms; |
||||||
|
|
||||||
|
import javax.jms.ConnectionFactory; |
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||||
|
import org.springframework.jms.config.DefaultJmsListenerContainerFactory; |
||||||
|
import org.springframework.jms.config.JmsListenerContainerFactory; |
||||||
|
import org.springframework.jms.support.destination.DestinationResolver; |
||||||
|
import org.springframework.transaction.jta.JtaTransactionManager; |
||||||
|
import org.springframework.util.Assert; |
||||||
|
|
||||||
|
/** |
||||||
|
* Configure {@link JmsListenerContainerFactory} with sensible defaults. |
||||||
|
* |
||||||
|
* @author Stephane Nicoll |
||||||
|
* @since 1.3.3 |
||||||
|
*/ |
||||||
|
public final class JmsListenerContainerFactoryConfigurer { |
||||||
|
|
||||||
|
private DestinationResolver destinationResolver; |
||||||
|
|
||||||
|
private JtaTransactionManager transactionManager; |
||||||
|
|
||||||
|
private JmsProperties jmsProperties; |
||||||
|
|
||||||
|
/** |
||||||
|
* Set the {@link DestinationResolver} to use or {@code null} if no destination |
||||||
|
* resolver should be associated with the factory by default. |
||||||
|
* @param destinationResolver the {@link DestinationResolver} |
||||||
|
*/ |
||||||
|
@Autowired(required = false) |
||||||
|
public void setDestinationResolver(DestinationResolver destinationResolver) { |
||||||
|
this.destinationResolver = destinationResolver; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Set the {@link JtaTransactionManager} to use or {@code null} if the JTA |
||||||
|
* support should not be used. |
||||||
|
* @param transactionManager the {@link JtaTransactionManager} |
||||||
|
*/ |
||||||
|
@Autowired(required = false) |
||||||
|
public void setTransactionManager(JtaTransactionManager transactionManager) { |
||||||
|
this.transactionManager = transactionManager; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Set the {@link JmsProperties to use}. |
||||||
|
* @param jmsProperties the {@link JmsProperties} |
||||||
|
*/ |
||||||
|
@Autowired |
||||||
|
public void setJmsProperties(JmsProperties jmsProperties) { |
||||||
|
this.jmsProperties = jmsProperties; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Create a new and pre-configured {@link DefaultJmsListenerContainerFactory} instance |
||||||
|
* for the specified {@link ConnectionFactory}. |
||||||
|
* @param connectionFactory the {@link ConnectionFactory} to use. |
||||||
|
* @return a pre-configured {@link DefaultJmsListenerContainerFactory} |
||||||
|
*/ |
||||||
|
public DefaultJmsListenerContainerFactory createJmsListenerContainerFactory( |
||||||
|
ConnectionFactory connectionFactory) { |
||||||
|
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); |
||||||
|
configure(factory, connectionFactory); |
||||||
|
return factory; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Apply the default settings for the specified jms listener container factory. The |
||||||
|
* factory can be further tuned and default settings can be overridden. |
||||||
|
* @param factory the {@link DefaultJmsListenerContainerFactory} instance to configure |
||||||
|
* @param connectionFactory the {@link ConnectionFactory} to use |
||||||
|
*/ |
||||||
|
public void configure(DefaultJmsListenerContainerFactory factory, |
||||||
|
ConnectionFactory connectionFactory) { |
||||||
|
Assert.notNull(factory, "Factory must not be null"); |
||||||
|
Assert.notNull(connectionFactory, "ConnectionFactory must not be null"); |
||||||
|
factory.setConnectionFactory(connectionFactory); |
||||||
|
factory.setPubSubDomain(this.jmsProperties.isPubSubDomain()); |
||||||
|
if (this.transactionManager != null) { |
||||||
|
factory.setTransactionManager(this.transactionManager); |
||||||
|
} |
||||||
|
else { |
||||||
|
factory.setSessionTransacted(true); |
||||||
|
} |
||||||
|
if (this.destinationResolver != null) { |
||||||
|
factory.setDestinationResolver(this.destinationResolver); |
||||||
|
} |
||||||
|
JmsProperties.Listener listener = this.jmsProperties.getListener(); |
||||||
|
factory.setAutoStartup(listener.isAutoStartup()); |
||||||
|
if (listener.getAcknowledgeMode() != null) { |
||||||
|
factory.setSessionAcknowledgeMode(listener.getAcknowledgeMode().getMode()); |
||||||
|
} |
||||||
|
String concurrency = listener.formatConcurrency(); |
||||||
|
if (concurrency != null) { |
||||||
|
factory.setConcurrency(concurrency); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
Loading…
Reference in new issue