INT-3435: Make JmsChannelFB More Friendly

JIRA: https://jira.spring.io/browse/INT-3435

INT-3435: Polishing according test failures

https://build.spring.io/browse/INT-B41-29
This commit is contained in:
Artem Bilan
2014-07-07 18:10:18 +03:00
committed by Gary Russell
parent 62dfc99844
commit 92975262d7
3 changed files with 48 additions and 9 deletions

View File

@@ -49,9 +49,11 @@ import org.springframework.util.StringUtils;
* @author Mark Fisher
* @author Oleg Zhurakousky
* @author Gary Russell
* @author Artem Bilan
* @since 2.0
*/
public class JmsChannelFactoryBean extends AbstractFactoryBean<AbstractJmsChannel> implements SmartLifecycle, DisposableBean, BeanNameAware {
public class JmsChannelFactoryBean extends AbstractFactoryBean<AbstractJmsChannel>
implements SmartLifecycle, DisposableBean, BeanNameAware {
private volatile AbstractJmsChannel channel;
@@ -71,6 +73,8 @@ public class JmsChannelFactoryBean extends AbstractFactoryBean<AbstractJmsChanne
private volatile String cacheLevelName;
private volatile Integer cacheLevel;
private volatile String clientId;
private volatile String concurrency;
@@ -186,6 +190,8 @@ public class JmsChannelFactoryBean extends AbstractFactoryBean<AbstractJmsChanne
*/
public void setAcceptMessagesWhileStopping(boolean acceptMessagesWhileStopping) {
Assert.isTrue(this.messageDriven,
"'acceptMessagesWhileStopping' is allowed only in case of 'messageDriven = true'");
this.acceptMessagesWhileStopping = acceptMessagesWhileStopping;
}
@@ -194,18 +200,31 @@ public class JmsChannelFactoryBean extends AbstractFactoryBean<AbstractJmsChanne
}
public void setCacheLevelName(String cacheLevelName) {
Assert.isTrue(this.messageDriven, "'cacheLevelName' is allowed only in case of 'messageDriven = true'");
Assert.state(this.cacheLevel == null,
"'cacheLevelName' and 'cacheLevel' are mutually exclusive");
this.cacheLevelName = cacheLevelName;
}
public void setCacheLevel(Integer cacheLevel) {
Assert.isTrue(this.messageDriven, "'cacheLevel' is allowed only in case of 'messageDriven = true'");
Assert.state(!StringUtils.hasText(this.cacheLevelName),
"'cacheLevelName' and 'cacheLevel' are mutually exclusive");
this.cacheLevel = cacheLevel;
}
public void setClientId(String clientId) {
Assert.isTrue(this.messageDriven, "'clientId' is allowed only in case of 'messageDriven = true'");
this.clientId = clientId;
}
public void setConcurrency(String concurrency) {
Assert.isTrue(this.messageDriven, "'concurrency' is allowed only in case of 'messageDriven = true'");
this.concurrency = concurrency;
}
public void setConcurrentConsumers(int concurrentConsumers) {
Assert.isTrue(this.messageDriven, "'concurrentConsumers' is allowed only in case of 'messageDriven = true'");
this.concurrentConsumers = concurrentConsumers;
}
@@ -215,6 +234,7 @@ public class JmsChannelFactoryBean extends AbstractFactoryBean<AbstractJmsChanne
}
public void setContainerType(Class<? extends AbstractMessageListenerContainer> containerType) {
Assert.isTrue(this.messageDriven, "'containerType' is allowed only in case of 'messageDriven = true'");
this.containerType = containerType;
}
@@ -232,30 +252,37 @@ public class JmsChannelFactoryBean extends AbstractFactoryBean<AbstractJmsChanne
}
public void setDurableSubscriptionName(String durableSubscriptionName) {
Assert.isTrue(this.messageDriven, "'durableSubscriptionName' is allowed only in case of 'messageDriven = true'");
this.durableSubscriptionName = durableSubscriptionName;
}
public void setErrorHandler(ErrorHandler errorHandler) {
Assert.isTrue(this.messageDriven, "'errorHandler' is allowed only in case of 'messageDriven = true'");
this.errorHandler = errorHandler;
}
public void setExceptionListener(ExceptionListener exceptionListener) {
Assert.isTrue(this.messageDriven, "'exceptionListener' is allowed only in case of 'messageDriven = true'");
this.exceptionListener = exceptionListener;
}
public void setExposeListenerSession(boolean exposeListenerSession) {
Assert.isTrue(this.messageDriven, "'exposeListenerSession' is allowed only in case of 'messageDriven = true'");
this.exposeListenerSession = exposeListenerSession;
}
public void setIdleTaskExecutionLimit(int idleTaskExecutionLimit) {
Assert.isTrue(this.messageDriven, "'idleTaskExecutionLimit' is allowed only in case of 'messageDriven = true'");
this.idleTaskExecutionLimit = idleTaskExecutionLimit;
}
public void setMaxConcurrentConsumers(int maxConcurrentConsumers) {
Assert.isTrue(this.messageDriven, "'maxConcurrentConsumers' is allowed only in case of 'messageDriven = true'");
this.maxConcurrentConsumers = maxConcurrentConsumers;
}
public void setMaxMessagesPerTask(int maxMessagesPerTask) {
Assert.isTrue(this.messageDriven, "'maxMessagesPerTask' is allowed only in case of 'messageDriven = true'");
this.maxMessagesPerTask = maxMessagesPerTask;
}
@@ -283,6 +310,7 @@ public class JmsChannelFactoryBean extends AbstractFactoryBean<AbstractJmsChanne
}
public void setRecoveryInterval(long recoveryInterval) {
Assert.isTrue(this.messageDriven, "'recoveryInterval' is allowed only in case of 'messageDriven = true'");
this.recoveryInterval = recoveryInterval;
}
@@ -297,26 +325,32 @@ public class JmsChannelFactoryBean extends AbstractFactoryBean<AbstractJmsChanne
}
public void setSubscriptionDurable(boolean subscriptionDurable) {
Assert.isTrue(this.messageDriven, "'subscriptionDurable' is allowed only in case of 'messageDriven = true'");
this.subscriptionDurable = subscriptionDurable;
}
public void setTaskExecutor(Executor taskExecutor) {
Assert.isTrue(this.messageDriven, "'taskExecutor' is allowed only in case of 'messageDriven = true'");
this.taskExecutor = taskExecutor;
}
public void setTransactionManager(PlatformTransactionManager transactionManager) {
Assert.isTrue(this.messageDriven, "'transactionManager' is allowed only in case of 'messageDriven = true'");
this.transactionManager = transactionManager;
}
public void setTransactionName(String transactionName) {
Assert.isTrue(this.messageDriven, "'transactionName' is allowed only in case of 'messageDriven = true'");
this.transactionName = transactionName;
}
public void setTransactionTimeout(int transactionTimeout) {
Assert.isTrue(this.messageDriven, "'transactionTimeout' is allowed only in case of 'messageDriven = true'");
this.transactionTimeout = transactionTimeout;
}
public void setMaxSubscribers(int maxSubscribers) {
Assert.isTrue(this.messageDriven, "'maxSubscribers' is allowed only in case of 'messageDriven = true'");
this.maxSubscribers = maxSubscribers;
}
@@ -413,6 +447,10 @@ public class JmsChannelFactoryBean extends AbstractFactoryBean<AbstractJmsChanne
dmlc.setCacheLevelName(this.cacheLevelName);
}
if (this.cacheLevel != null) {
dmlc.setCacheLevel(this.cacheLevel);
}
if (StringUtils.hasText(this.concurrency)){
dmlc.setConcurrency(this.concurrency);
}
@@ -470,8 +508,7 @@ public class JmsChannelFactoryBean extends AbstractFactoryBean<AbstractJmsChanne
@Override
public boolean isAutoStartup() {
return (this.channel instanceof SubscribableJmsChannel) ?
((SubscribableJmsChannel) this.channel).isAutoStartup() : false;
return this.channel instanceof SubscribableJmsChannel && ((SubscribableJmsChannel) this.channel).isAutoStartup();
}
@Override
@@ -482,8 +519,7 @@ public class JmsChannelFactoryBean extends AbstractFactoryBean<AbstractJmsChanne
@Override
public boolean isRunning() {
return (this.channel instanceof SubscribableJmsChannel) ?
((SubscribableJmsChannel) this.channel).isRunning() : false;
return this.channel instanceof SubscribableJmsChannel && ((SubscribableJmsChannel) this.channel).isRunning();
}
@Override
@@ -513,4 +549,5 @@ public class JmsChannelFactoryBean extends AbstractFactoryBean<AbstractJmsChanne
((SubscribableJmsChannel) this.channel).destroy();
}
}
}

View File

@@ -68,7 +68,7 @@ public class JmsChannelParser extends AbstractChannelParser {
String containerType = element.getAttribute(CONTAINER_TYPE_ATTRIBUTE);
String containerClass = element.getAttribute(CONTAINER_CLASS_ATTRIBUTE);
if (!StringUtils.hasText(containerClass)) {
if (!StringUtils.hasText(containerClass) && StringUtils.hasText(containerType)) {
if ("default".equals(containerType)) {
containerClass = "org.springframework.jms.listener.DefaultMessageListenerContainer";
}
@@ -84,7 +84,9 @@ public class JmsChannelParser extends AbstractChannelParser {
*
* We cannot reliably infer it here.
*/
builder.addPropertyValue("containerType", containerClass);
if (StringUtils.hasText(containerClass)) {
builder.addPropertyValue("containerType", containerClass);
}
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "receive-timeout");
IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "task-executor");
IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "transaction-manager");

View File

@@ -162,7 +162,7 @@
</xsd:appinfo>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="container-type" default="default">
<xsd:attribute name="container-type">
<xsd:annotation>
<xsd:documentation><![CDATA[
The type of this listener container: "default" or "simple", choosing
@@ -253,7 +253,7 @@
]]></xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="cache" default="auto">
<xsd:attribute name="cache">
<xsd:annotation>
<xsd:documentation><![CDATA[
The cache level for JMS resources: "none", "connection", "session", "consumer"