/*
* Copyright 2016-2017 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.jms.dsl;
import java.util.concurrent.Executor;
import java.util.function.Consumer;
import java.util.function.Function;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import org.springframework.integration.dsl.IntegrationComponentSpec;
import org.springframework.integration.dsl.MessageHandlerSpec;
import org.springframework.integration.expression.FunctionExpression;
import org.springframework.integration.jms.JmsHeaderMapper;
import org.springframework.integration.jms.JmsOutboundGateway;
import org.springframework.jms.support.converter.MessageConverter;
import org.springframework.jms.support.destination.DestinationResolver;
import org.springframework.messaging.Message;
import org.springframework.util.Assert;
/**
* A {@link MessageHandlerSpec} for a {@link JmsOutboundGateway}.
*
* @author Artem Bilan
* @since 5.0
*/
public class JmsOutboundGatewaySpec extends MessageHandlerSpec<JmsOutboundGatewaySpec, JmsOutboundGateway> {
JmsOutboundGatewaySpec(ConnectionFactory connectionFactory) {
this.target = new JmsOutboundGateway();
this.target.setConnectionFactory(connectionFactory);
this.target.setRequiresReply(true);
}
/**
* @param extractPayload the extractPayload.
* @return the current {@link JmsOutboundGatewaySpec}.
* @see JmsOutboundGateway#setExtractRequestPayload(boolean)
*/
public JmsOutboundGatewaySpec extractRequestPayload(boolean extractPayload) {
this.target.setExtractRequestPayload(extractPayload);
return _this();
}
/**
* @param extractPayload the extractPayload.
* @return the current {@link JmsOutboundGatewaySpec}.
* @see JmsOutboundGateway#setExtractReplyPayload(boolean)
*/
public JmsOutboundGatewaySpec extractReplyPayload(boolean extractPayload) {
this.target.setExtractReplyPayload(extractPayload);
return _this();
}
/**
* @param headerMapper the headerMapper.
* @return the current {@link JmsOutboundGatewaySpec}.
* @see JmsOutboundGateway#setHeaderMapper(JmsHeaderMapper)
*/
public JmsOutboundGatewaySpec headerMapper(JmsHeaderMapper headerMapper) {
this.target.setHeaderMapper(headerMapper);
return _this();
}
/**
* @param destination the destination.
* @return the current {@link JmsOutboundGatewaySpec}.
* @see JmsOutboundGateway#setRequestDestination(Destination)
*/
public JmsOutboundGatewaySpec requestDestination(Destination destination) {
this.target.setRequestDestination(destination);
return _this();
}
/**
* @param destination the destination name.
* @return the current {@link JmsOutboundGatewaySpec}.
* @see JmsOutboundGateway#setRequestDestinationName(String)
*/
public JmsOutboundGatewaySpec requestDestination(String destination) {
this.target.setRequestDestinationName(destination);
return _this();
}
/**
* @param destination the destination expression.
* @return the current {@link JmsOutboundGatewaySpec}.
* @see JmsOutboundGateway#setRequestDestinationExpression(org.springframework.expression.Expression)
*/
public JmsOutboundGatewaySpec requestDestinationExpression(String destination) {
this.target.setRequestDestinationExpression(PARSER.parseExpression(destination));
return _this();
}
/**
* Configure a {@link Function} that will be invoked at runtime to determine the destination to
* which a message will be sent. Typically used with a Java 8 Lambda expression:
* <pre class="code">
* {@code
* .<Foo>destination(m -> m.getPayload().getState())
* }
* </pre>
* @param destinationFunction the destination function.
* @param <P> the expected payload type.
* @return the current {@link JmsOutboundGatewaySpec}.
* @see JmsOutboundGateway#setRequestDestinationExpression(org.springframework.expression.Expression)
* @see FunctionExpression
*/
public <P> JmsOutboundGatewaySpec requestDestination(Function<Message<P>, ?> destinationFunction) {
this.target.setRequestDestinationExpression(new FunctionExpression<Message<P>>(destinationFunction));
return _this();
}
/**
* @param destination the destination.
* @return the current {@link JmsOutboundGatewaySpec}.
* @see JmsOutboundGateway#setReplyDestination(Destination)
*/
public JmsOutboundGatewaySpec replyDestination(Destination destination) {
this.target.setReplyDestination(destination);
return _this();
}
/**
* @param destination the destination name.
* @return the current {@link JmsOutboundGatewaySpec}.
* @see JmsOutboundGateway#setReplyDestinationName(String)
*/
public JmsOutboundGatewaySpec replyDestination(String destination) {
this.target.setReplyDestinationName(destination);
return _this();
}
/**
* @param destination the destination expression.
* @return the current {@link JmsOutboundGatewaySpec}.
* @see JmsOutboundGateway#setReplyDestinationExpression(org.springframework.expression.Expression)
*/
public JmsOutboundGatewaySpec replyDestinationExpression(String destination) {
this.target.setReplyDestinationExpression(PARSER.parseExpression(destination));
return _this();
}
/**
* Configure a {@link Function} that will be invoked at run time to determine the destination from
* which a reply will be received. Typically used with a Java 8 Lambda expression:
* <pre class="code">
* {@code
* .<Foo>replyDestination(m -> m.getPayload().getState())
* }
* </pre>
* @param destinationFunction the destination function.
* @param <P> the expected payload type.
* @return the current {@link JmsOutboundGatewaySpec}.
* @see JmsOutboundGateway#setReplyDestinationExpression(org.springframework.expression.Expression)
* @see FunctionExpression
*/
public <P> JmsOutboundGatewaySpec replyDestination(Function<Message<P>, ?> destinationFunction) {
this.target.setReplyDestinationExpression(new FunctionExpression<Message<P>>(destinationFunction));
return _this();
}
/**
* @param destinationResolver the destinationResolver.
* @return the current {@link JmsOutboundGatewaySpec}.
* @see JmsOutboundGateway#setDestinationResolver(DestinationResolver)
*/
public JmsOutboundGatewaySpec destinationResolver(DestinationResolver destinationResolver) {
this.target.setDestinationResolver(destinationResolver);
return _this();
}
/**
* @param messageConverter the messageConverter.
* @return the current {@link JmsOutboundGatewaySpec}.
* @see JmsOutboundGateway#setMessageConverter(MessageConverter)
*/
public JmsOutboundGatewaySpec jmsMessageConverter(MessageConverter messageConverter) {
this.target.setMessageConverter(messageConverter);
return _this();
}
/**
* @param correlationKey the correlationKey
* @return the current {@link JmsOutboundGatewaySpec}.
* @see JmsOutboundGateway#setCorrelationKey(String)
*/
public JmsOutboundGatewaySpec correlationKey(String correlationKey) {
this.target.setCorrelationKey(correlationKey);
return _this();
}
/**
* @param pubSubDomain the pubSubDomain
* @return the current {@link JmsOutboundGatewaySpec}.
* @see JmsOutboundGateway#setReplyPubSubDomain(boolean)
*/
public JmsOutboundGatewaySpec requestPubSubDomain(boolean pubSubDomain) {
this.target.setRequestPubSubDomain(pubSubDomain);
return _this();
}
/**
* @param pubSubDomain the pubSubDomain
* @return the current {@link JmsOutboundGatewaySpec}.
* @see JmsOutboundGateway#setRequestPubSubDomain(boolean)
*/
public JmsOutboundGatewaySpec replyPubSubDomain(boolean pubSubDomain) {
this.target.setReplyPubSubDomain(pubSubDomain);
return _this();
}
/**
* @param deliveryPersistent the deliveryPersistent.
* @return the current {@link JmsOutboundGatewaySpec}.
* @see JmsOutboundGateway#setDeliveryPersistent(boolean)
*/
public JmsOutboundGatewaySpec deliveryPersistent(boolean deliveryPersistent) {
this.target.setDeliveryPersistent(deliveryPersistent);
return _this();
}
/**
* Default priority. May be overridden at run time with a message
* priority header.
* @param priority the priority.
* @return the current {@link JmsOutboundGatewaySpec}.
* @see JmsOutboundGateway#setPriority(int)
*/
public JmsOutboundGatewaySpec priority(int priority) {
this.target.setPriority(priority);
return _this();
}
/**
* @param timeToLive the timeToLive.
* @return the current {@link JmsOutboundGatewaySpec}.
* @see JmsOutboundGateway#setTimeToLive(long)
*/
public JmsOutboundGatewaySpec timeToLive(long timeToLive) {
this.target.setTimeToLive(timeToLive);
return _this();
}
/**
* @param receiveTimeout the receiveTimeout.
* @return the current {@link JmsOutboundGatewaySpec}.
* @see JmsOutboundGateway#setReceiveTimeout(long)
*/
public JmsOutboundGatewaySpec receiveTimeout(long receiveTimeout) {
this.target.setReceiveTimeout(receiveTimeout);
return _this();
}
/**
* @param explicitQosEnabled the explicitQosEnabled.
* @return the current {@link JmsOutboundGatewaySpec}.
* @see JmsOutboundGateway#setExplicitQosEnabled(boolean)
*/
public JmsOutboundGatewaySpec explicitQosEnabled(boolean explicitQosEnabled) {
this.target.setExplicitQosEnabled(explicitQosEnabled);
return _this();
}
/**
* Configure a reply container with default properties.
* @return the current {@link JmsOutboundGatewaySpec}.
*/
public JmsOutboundGatewaySpec replyContainer() {
this.target.setReplyContainerProperties(new JmsOutboundGateway.ReplyContainerProperties());
return _this();
}
/**
* Configure a reply container with a reply container specification determined by
* invoking the {@link Consumer} callback with a {@link ReplyContainerSpec}.
* @param configurer the configurer.
* @return the current {@link JmsOutboundGatewaySpec}.
*/
public JmsOutboundGatewaySpec replyContainer(Consumer<ReplyContainerSpec> configurer) {
Assert.notNull(configurer, "'configurer' must not be null");
ReplyContainerSpec spec = new ReplyContainerSpec();
configurer.accept(spec);
this.target.setReplyContainerProperties(spec.get());
return _this();
}
/**
* An {@link IntegrationComponentSpec} for {@link JmsOutboundGateway.ReplyContainerProperties}.
*
*/
public class ReplyContainerSpec
extends IntegrationComponentSpec<ReplyContainerSpec, JmsOutboundGateway.ReplyContainerProperties> {
ReplyContainerSpec() {
this.target = new JmsOutboundGateway.ReplyContainerProperties();
}
/**
* @param sessionTransacted the sessionTransacted.
* @return the current {@link ReplyContainerSpec}.
* @see org.springframework.jms.listener.DefaultMessageListenerContainer#setSessionTransacted(boolean)
*/
public ReplyContainerSpec sessionTransacted(Boolean sessionTransacted) {
this.target.setSessionTransacted(sessionTransacted);
return _this();
}
/**
* @param sessionAcknowledgeMode the acknowledgement mode constant
* @return the current {@link ReplyContainerSpec}.
* @see javax.jms.Session#AUTO_ACKNOWLEDGE etc.
*/
public ReplyContainerSpec sessionAcknowledgeMode(Integer sessionAcknowledgeMode) {
this.target.setSessionAcknowledgeMode(sessionAcknowledgeMode);
return _this();
}
/**
* @param receiveTimeout the receiveTimeout.
* @return the current {@link ReplyContainerSpec}.
* @see org.springframework.jms.listener.DefaultMessageListenerContainer#setReceiveTimeout(long)
*/
public ReplyContainerSpec receiveTimeout(Long receiveTimeout) {
this.target.setReceiveTimeout(receiveTimeout);
return _this();
}
/**
* @param recoveryInterval the recoveryInterval.
* @return the current {ReplyContainerSpec}.
* @see org.springframework.jms.listener.DefaultMessageListenerContainer#setRecoveryInterval(long)
*/
public ReplyContainerSpec recoveryInterval(Long recoveryInterval) {
this.target.setRecoveryInterval(recoveryInterval);
return _this();
}
/**
* @param cacheLevel the value for
* {@code org.springframework.jms.listener.DefaultMessageListenerContainer.cacheLevel}.
* @return the current {ReplyContainerSpec}.
* @see org.springframework.jms.listener.DefaultMessageListenerContainer#setCacheLevel(int)
*/
public ReplyContainerSpec cacheLevel(Integer cacheLevel) {
this.target.setCacheLevel(cacheLevel);
return _this();
}
/**
* @param concurrentConsumers the concurrentConsumers.
* @return the current {ReplyContainerSpec}.
* @see org.springframework.jms.listener.DefaultMessageListenerContainer#setConcurrentConsumers(int)
*/
public ReplyContainerSpec concurrentConsumers(Integer concurrentConsumers) {
this.target.setConcurrentConsumers(concurrentConsumers);
return _this();
}
/**
* @param maxConcurrentConsumers the maxConcurrentConsumers.
* @return the current {ReplyContainerSpec}.
* @see org.springframework.jms.listener.DefaultMessageListenerContainer#setMaxConcurrentConsumers(int)
*/
public ReplyContainerSpec maxConcurrentConsumers(Integer maxConcurrentConsumers) {
this.target.setMaxConcurrentConsumers(maxConcurrentConsumers);
return _this();
}
/**
* @param maxMessagesPerTask the maxMessagesPerTask.
* @return the current {ReplyContainerSpec}.
* @see org.springframework.jms.listener.DefaultMessageListenerContainer#setMaxMessagesPerTask(int)
*/
public ReplyContainerSpec maxMessagesPerTask(Integer maxMessagesPerTask) {
this.target.setMaxMessagesPerTask(maxMessagesPerTask);
return _this();
}
/**
* @param idleConsumerLimit the idleConsumerLimit.
* @return the current {ReplyContainerSpec}.
* @see org.springframework.jms.listener.DefaultMessageListenerContainer#setIdleConsumerLimit(int)
*/
public ReplyContainerSpec idleConsumerLimit(Integer idleConsumerLimit) {
this.target.setIdleConsumerLimit(idleConsumerLimit);
return _this();
}
/**
* @param idleTaskExecutionLimit the idleTaskExecutionLimit.
* @return the current {ReplyContainerSpec}.
* @see org.springframework.jms.listener.DefaultMessageListenerContainer#setIdleTaskExecutionLimit(int)
*/
public ReplyContainerSpec idleTaskExecutionLimit(Integer idleTaskExecutionLimit) {
this.target.setIdleTaskExecutionLimit(idleTaskExecutionLimit);
return _this();
}
/**
* @param taskExecutor the taskExecutor.
* @return the current {ReplyContainerSpec}.
* @see org.springframework.jms.listener.DefaultMessageListenerContainer#setTaskExecutor(Executor)
*/
public ReplyContainerSpec taskExecutor(Executor taskExecutor) {
this.target.setTaskExecutor(taskExecutor);
return _this();
}
/**
* @param idleReplyContainerTimeout the timeout in seconds.
* @return the current {ReplyContainerSpec}.
* @see JmsOutboundGateway#setIdleReplyContainerTimeout
*/
public ReplyContainerSpec idleReplyContainerTimeout(long idleReplyContainerTimeout) {
JmsOutboundGatewaySpec.this.target.setIdleReplyContainerTimeout(idleReplyContainerTimeout);
return this;
}
}
}