001/*
002 * Copyright 2002-2018 the original author or authors.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *      https://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016
017package org.springframework.jms.config;
018
019import javax.jms.ConnectionFactory;
020
021import org.apache.commons.logging.Log;
022import org.apache.commons.logging.LogFactory;
023
024import org.springframework.jms.listener.AbstractMessageListenerContainer;
025import org.springframework.jms.support.converter.MessageConverter;
026import org.springframework.jms.support.destination.DestinationResolver;
027import org.springframework.util.ErrorHandler;
028
029/**
030 * Base {@link JmsListenerContainerFactory} for Spring's base container implementation.
031 *
032 * @author Stephane Nicoll
033 * @since 4.1
034 * @see AbstractMessageListenerContainer
035 */
036public abstract class AbstractJmsListenerContainerFactory<C extends AbstractMessageListenerContainer>
037                implements JmsListenerContainerFactory<C> {
038
039        protected final Log logger = LogFactory.getLog(getClass());
040
041        private ConnectionFactory connectionFactory;
042
043        private DestinationResolver destinationResolver;
044
045        private ErrorHandler errorHandler;
046
047        private MessageConverter messageConverter;
048
049        private Boolean sessionTransacted;
050
051        private Integer sessionAcknowledgeMode;
052
053        private Boolean pubSubDomain;
054
055        private Boolean replyPubSubDomain;
056
057        private Boolean subscriptionDurable;
058
059        private Boolean subscriptionShared;
060
061        private String clientId;
062
063        private Integer phase;
064
065        private Boolean autoStartup;
066
067
068        /**
069         * @see AbstractMessageListenerContainer#setConnectionFactory(ConnectionFactory)
070         */
071        public void setConnectionFactory(ConnectionFactory connectionFactory) {
072                this.connectionFactory = connectionFactory;
073        }
074
075        /**
076         * @see AbstractMessageListenerContainer#setDestinationResolver(DestinationResolver)
077         */
078        public void setDestinationResolver(DestinationResolver destinationResolver) {
079                this.destinationResolver = destinationResolver;
080        }
081
082        /**
083         * @see AbstractMessageListenerContainer#setErrorHandler(ErrorHandler)
084         */
085        public void setErrorHandler(ErrorHandler errorHandler) {
086                this.errorHandler = errorHandler;
087        }
088
089        /**
090         * @see AbstractMessageListenerContainer#setMessageConverter(MessageConverter)
091         */
092        public void setMessageConverter(MessageConverter messageConverter) {
093                this.messageConverter = messageConverter;
094        }
095
096        /**
097         * @see AbstractMessageListenerContainer#setSessionTransacted(boolean)
098         */
099        public void setSessionTransacted(Boolean sessionTransacted) {
100                this.sessionTransacted = sessionTransacted;
101        }
102
103        /**
104         * @see AbstractMessageListenerContainer#setSessionAcknowledgeMode(int)
105         */
106        public void setSessionAcknowledgeMode(Integer sessionAcknowledgeMode) {
107                this.sessionAcknowledgeMode = sessionAcknowledgeMode;
108        }
109
110        /**
111         * @see AbstractMessageListenerContainer#setPubSubDomain(boolean)
112         */
113        public void setPubSubDomain(Boolean pubSubDomain) {
114                this.pubSubDomain = pubSubDomain;
115        }
116
117        /**
118         * @see AbstractMessageListenerContainer#setReplyPubSubDomain(boolean)
119         */
120        public void setReplyPubSubDomain(Boolean replyPubSubDomain) {
121                this.replyPubSubDomain = replyPubSubDomain;
122        }
123
124        /**
125         * @see AbstractMessageListenerContainer#setSubscriptionDurable(boolean)
126         */
127        public void setSubscriptionDurable(Boolean subscriptionDurable) {
128                this.subscriptionDurable = subscriptionDurable;
129        }
130
131        /**
132         * @see AbstractMessageListenerContainer#setSubscriptionShared(boolean)
133         */
134        public void setSubscriptionShared(Boolean subscriptionShared) {
135                this.subscriptionShared = subscriptionShared;
136        }
137
138        /**
139         * @see AbstractMessageListenerContainer#setClientId(String)
140         */
141        public void setClientId(String clientId) {
142                this.clientId = clientId;
143        }
144
145        /**
146         * @see AbstractMessageListenerContainer#setPhase(int)
147         */
148        public void setPhase(int phase) {
149                this.phase = phase;
150        }
151
152        /**
153         * @see AbstractMessageListenerContainer#setAutoStartup(boolean)
154         */
155        public void setAutoStartup(boolean autoStartup) {
156                this.autoStartup = autoStartup;
157        }
158
159        @Override
160        public C createListenerContainer(JmsListenerEndpoint endpoint) {
161                C instance = createContainerInstance();
162
163                if (this.connectionFactory != null) {
164                        instance.setConnectionFactory(this.connectionFactory);
165                }
166                if (this.destinationResolver != null) {
167                        instance.setDestinationResolver(this.destinationResolver);
168                }
169                if (this.errorHandler != null) {
170                        instance.setErrorHandler(this.errorHandler);
171                }
172                if (this.messageConverter != null) {
173                        instance.setMessageConverter(this.messageConverter);
174                }
175                if (this.sessionTransacted != null) {
176                        instance.setSessionTransacted(this.sessionTransacted);
177                }
178                if (this.sessionAcknowledgeMode != null) {
179                        instance.setSessionAcknowledgeMode(this.sessionAcknowledgeMode);
180                }
181                if (this.pubSubDomain != null) {
182                        instance.setPubSubDomain(this.pubSubDomain);
183                }
184                if (this.replyPubSubDomain != null) {
185                        instance.setReplyPubSubDomain(this.replyPubSubDomain);
186                }
187                if (this.subscriptionDurable != null) {
188                        instance.setSubscriptionDurable(this.subscriptionDurable);
189                }
190                if (this.subscriptionShared != null) {
191                        instance.setSubscriptionShared(this.subscriptionShared);
192                }
193                if (this.clientId != null) {
194                        instance.setClientId(this.clientId);
195                }
196                if (this.phase != null) {
197                        instance.setPhase(this.phase);
198                }
199                if (this.autoStartup != null) {
200                        instance.setAutoStartup(this.autoStartup);
201                }
202
203                initializeContainer(instance);
204                endpoint.setupListenerContainer(instance);
205
206                return instance;
207        }
208
209        /**
210         * Create an empty container instance.
211         */
212        protected abstract C createContainerInstance();
213
214        /**
215         * Further initialize the specified container.
216         * <p>Subclasses can inherit from this method to apply extra
217         * configuration if necessary.
218         */
219        protected void initializeContainer(C instance) {
220        }
221
222}