Java tutorial
/* * Copyright 2012-2019 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 * * https://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 java.time.Duration; import org.springframework.boot.context.properties.ConfigurationProperties; /** * Configuration properties for JMS. * * @author Greg Turnquist * @author Phillip Webb * @author Stephane Nicoll * @since 1.0.0 */ @ConfigurationProperties(prefix = "spring.jms") public class JmsProperties { /** * Whether the default destination type is topic. */ private boolean pubSubDomain = false; /** * Connection factory JNDI name. When set, takes precedence to others connection * factory auto-configurations. */ private String jndiName; private final Cache cache = new Cache(); private final Listener listener = new Listener(); private final Template template = new Template(); public boolean isPubSubDomain() { return this.pubSubDomain; } public void setPubSubDomain(boolean pubSubDomain) { this.pubSubDomain = pubSubDomain; } public String getJndiName() { return this.jndiName; } public void setJndiName(String jndiName) { this.jndiName = jndiName; } public Cache getCache() { return this.cache; } public Listener getListener() { return this.listener; } public Template getTemplate() { return this.template; } public static class Cache { /** * Whether to cache sessions. */ private boolean enabled = true; /** * Whether to cache message consumers. */ private boolean consumers = false; /** * Whether to cache message producers. */ private boolean producers = true; /** * Size of the session cache (per JMS Session type). */ private int sessionCacheSize = 1; public boolean isEnabled() { return this.enabled; } public void setEnabled(boolean enabled) { this.enabled = enabled; } public boolean isConsumers() { return this.consumers; } public void setConsumers(boolean consumers) { this.consumers = consumers; } public boolean isProducers() { return this.producers; } public void setProducers(boolean producers) { this.producers = producers; } public int getSessionCacheSize() { return this.sessionCacheSize; } public void setSessionCacheSize(int sessionCacheSize) { this.sessionCacheSize = sessionCacheSize; } } public static class Listener { /** * Start the container automatically on startup. */ private boolean autoStartup = true; /** * Acknowledge mode of the container. By default, the listener is transacted with * automatic acknowledgment. */ private AcknowledgeMode acknowledgeMode; /** * Minimum number of concurrent consumers. */ private Integer concurrency; /** * Maximum number of concurrent consumers. */ private Integer maxConcurrency; public boolean isAutoStartup() { return this.autoStartup; } public void setAutoStartup(boolean autoStartup) { this.autoStartup = autoStartup; } public AcknowledgeMode getAcknowledgeMode() { return this.acknowledgeMode; } public void setAcknowledgeMode(AcknowledgeMode acknowledgeMode) { this.acknowledgeMode = acknowledgeMode; } public Integer getConcurrency() { return this.concurrency; } public void setConcurrency(Integer concurrency) { this.concurrency = concurrency; } public Integer getMaxConcurrency() { return this.maxConcurrency; } public void setMaxConcurrency(Integer maxConcurrency) { this.maxConcurrency = maxConcurrency; } public String formatConcurrency() { if (this.concurrency == null) { return (this.maxConcurrency != null) ? "1-" + this.maxConcurrency : null; } return ((this.maxConcurrency != null) ? this.concurrency + "-" + this.maxConcurrency : String.valueOf(this.concurrency)); } } public static class Template { /** * Default destination to use on send and receive operations that do not have a * destination parameter. */ private String defaultDestination; /** * Delivery delay to use for send calls. */ private Duration deliveryDelay; /** * Delivery mode. Enables QoS (Quality of Service) when set. */ private DeliveryMode deliveryMode; /** * Priority of a message when sending. Enables QoS (Quality of Service) when set. */ private Integer priority; /** * Time-to-live of a message when sending. Enables QoS (Quality of Service) when * set. */ private Duration timeToLive; /** * Whether to enable explicit QoS (Quality of Service) when sending a message. * When enabled, the delivery mode, priority and time-to-live properties will be * used when sending a message. QoS is automatically enabled when at least one of * those settings is customized. */ private Boolean qosEnabled; /** * Timeout to use for receive calls. */ private Duration receiveTimeout; public String getDefaultDestination() { return this.defaultDestination; } public void setDefaultDestination(String defaultDestination) { this.defaultDestination = defaultDestination; } public Duration getDeliveryDelay() { return this.deliveryDelay; } public void setDeliveryDelay(Duration deliveryDelay) { this.deliveryDelay = deliveryDelay; } public DeliveryMode getDeliveryMode() { return this.deliveryMode; } public void setDeliveryMode(DeliveryMode deliveryMode) { this.deliveryMode = deliveryMode; } public Integer getPriority() { return this.priority; } public void setPriority(Integer priority) { this.priority = priority; } public Duration getTimeToLive() { return this.timeToLive; } public void setTimeToLive(Duration timeToLive) { this.timeToLive = timeToLive; } public boolean determineQosEnabled() { if (this.qosEnabled != null) { return this.qosEnabled; } return (getDeliveryMode() != null || getPriority() != null || getTimeToLive() != null); } public Boolean getQosEnabled() { return this.qosEnabled; } public void setQosEnabled(Boolean qosEnabled) { this.qosEnabled = qosEnabled; } public Duration getReceiveTimeout() { return this.receiveTimeout; } public void setReceiveTimeout(Duration receiveTimeout) { this.receiveTimeout = receiveTimeout; } } /** * Translate the acknowledge modes defined on the {@link javax.jms.Session}. * * <p> * {@link javax.jms.Session#SESSION_TRANSACTED} is not defined as we take care of this * already via a call to {@code setSessionTransacted}. */ public enum AcknowledgeMode { /** * Messages sent or received from the session are automatically acknowledged. This * is the simplest mode and enables once-only message delivery guarantee. */ AUTO(1), /** * Messages are acknowledged once the message listener implementation has called * {@link javax.jms.Message#acknowledge()}. This mode gives the application * (rather than the JMS provider) complete control over message acknowledgement. */ CLIENT(2), /** * Similar to auto acknowledgment except that said acknowledgment is lazy. As a * consequence, the messages might be delivered more than once. This mode enables * at-least-once message delivery guarantee. */ DUPS_OK(3); private final int mode; AcknowledgeMode(int mode) { this.mode = mode; } public int getMode() { return this.mode; } } public enum DeliveryMode { /** * Does not require that the message be logged to stable storage. This is the * lowest-overhead delivery mode but can lead to lost of message if the broker * goes down. */ NON_PERSISTENT(1), /* * Instructs the JMS provider to log the message to stable storage as part of the * client's send operation. */ PERSISTENT(2); private final int value; DeliveryMode(int value) { this.value = value; } public int getValue() { return this.value; } } }