/* * Copyright 2014-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.integration.amqp.dsl; import java.util.Arrays; import java.util.LinkedList; import java.util.List; import java.util.concurrent.Executor; import org.aopalliance.aop.Advice; import org.springframework.amqp.core.AcknowledgeMode; import org.springframework.amqp.rabbit.connection.ConnectionFactory; import org.springframework.integration.amqp.channel.AbstractAmqpChannel; import org.springframework.integration.amqp.config.AmqpChannelFactoryBean; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.interceptor.TransactionAttribute; import org.springframework.util.ErrorHandler; /** * An {@link AmqpPollableMessageChannelSpec} for a message-driven * {@link org.springframework.integration.amqp.channel.PointToPointSubscribableAmqpChannel}. * * @param <S> the target {@link AmqpMessageChannelSpec} implementation type. * * @author Artem Bilan * @author Gary Russell * @since 5.0 */ public class AmqpMessageChannelSpec<S extends AmqpMessageChannelSpec<S>> extends AmqpPollableMessageChannelSpec<S> { private final List<Advice> adviceChain = new LinkedList<Advice>(); AmqpMessageChannelSpec(ConnectionFactory connectionFactory) { super(new AmqpChannelFactoryBean(true), connectionFactory); } /** * @param maxSubscribers the maxSubscribers. * @return the spec. * @see org.springframework.integration.amqp.channel.PointToPointSubscribableAmqpChannel#setMaxSubscribers(int) */ public S maxSubscribers(int maxSubscribers) { this.amqpChannelFactoryBean.setMaxSubscribers(maxSubscribers); return _this(); } /** * @param acknowledgeMode the acknowledgeMode. * @return the spec. * @see org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer#setAcknowledgeMode(AcknowledgeMode) */ public S acknowledgeMode(AcknowledgeMode acknowledgeMode) { this.amqpChannelFactoryBean.setAcknowledgeMode(acknowledgeMode); return _this(); } /** * @param advice the advice. * @return the spec. * @see org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer#setAdviceChain(Advice[]) */ public S advice(Advice... advice) { this.adviceChain.addAll(Arrays.asList(advice)); return _this(); } /** * @param autoStartup the autoStartup. * @return the spec. * @see org.springframework.context.SmartLifecycle */ public S autoStartup(boolean autoStartup) { this.amqpChannelFactoryBean.setAutoStartup(autoStartup); return _this(); } /** * @param concurrentConsumers the concurrentConsumers * @return the spec. * @see org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer#setConcurrentConsumers(int) */ public S concurrentConsumers(int concurrentConsumers) { this.amqpChannelFactoryBean.setConcurrentConsumers(concurrentConsumers); return _this(); } /** * @param errorHandler the errorHandler. * @return the spec. * @see org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer#setErrorHandler(ErrorHandler) */ public S errorHandler(ErrorHandler errorHandler) { this.amqpChannelFactoryBean.setErrorHandler(errorHandler); return _this(); } /** * @param exposeListenerChannel the exposeListenerChannel. * @return the spec. * @see org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer#setExposeListenerChannel(boolean) */ public S exposeListenerChannel(boolean exposeListenerChannel) { this.amqpChannelFactoryBean.setExposeListenerChannel(exposeListenerChannel); return _this(); } /** * @param phase the phase. * @return the spec. * @see org.springframework.context.SmartLifecycle */ public S phase(int phase) { this.amqpChannelFactoryBean.setPhase(phase); return _this(); } /** * @param prefetchCount the prefetchCount. * @return the spec. * @see org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer#setPrefetchCount(int) */ public S prefetchCount(int prefetchCount) { this.amqpChannelFactoryBean.setPrefetchCount(prefetchCount); return _this(); } /** * @param receiveTimeout the receiveTimeout * @return the spec. * @see org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer#setReceiveTimeout(long) */ public S receiveTimeout(long receiveTimeout) { this.amqpChannelFactoryBean.setReceiveTimeout(receiveTimeout); return _this(); } /** * @param recoveryInterval the recoveryInterval * @return the spec. * @see org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer#setRecoveryInterval(long) */ public S recoveryInterval(long recoveryInterval) { this.amqpChannelFactoryBean.setRecoveryInterval(recoveryInterval); return _this(); } /** * @param shutdownTimeout the shutdownTimeout. * @return the spec. * @see org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer#setShutdownTimeout(long) */ public S shutdownTimeout(long shutdownTimeout) { this.amqpChannelFactoryBean.setShutdownTimeout(shutdownTimeout); return _this(); } /** * Configure an {@link Executor} used to invoke the message listener. * @param taskExecutor the taskExecutor. * @return the spec. */ public S taskExecutor(Executor taskExecutor) { this.amqpChannelFactoryBean.setTaskExecutor(taskExecutor); return _this(); } /** * Configure a {@link TransactionAttribute} to be used with the * {@link #transactionManager(PlatformTransactionManager)}. * @param transactionAttribute the transactionAttribute. * @return the spec. */ public S transactionAttribute(TransactionAttribute transactionAttribute) { this.amqpChannelFactoryBean.setTransactionAttribute(transactionAttribute); return _this(); } /** * Configure a {@link PlatformTransactionManager}; used to synchronize the rabbit transaction * with some other transaction(s). * @param transactionManager the transactionManager. * @return the spec. */ public S transactionManager(PlatformTransactionManager transactionManager) { this.amqpChannelFactoryBean.setTransactionManager(transactionManager); return _this(); } /** * Configure the txSize. * @param txSize the txSize. * @return the spec. * @see org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer#setTxSize(int) */ public S txSize(int txSize) { this.amqpChannelFactoryBean.setTxSize(txSize); return _this(); } @Override protected AbstractAmqpChannel doGet() { this.amqpChannelFactoryBean.setAdviceChain(this.adviceChain.toArray(new Advice[this.adviceChain.size()])); return super.doGet(); } }