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}