From d361eefa0ce2b82c66843bfa8d5dae02f903c92a Mon Sep 17 00:00:00 2001 From: Artem Bilan Date: Fri, 9 Feb 2018 16:20:48 -0500 Subject: [PATCH] Add missed options and JavaDocs to AMQP Java DSL --- .../AmqpBaseInboundChannelAdapterSpec.java | 29 ++- .../amqp/dsl/AmqpBaseInboundGatewaySpec.java | 34 +++- .../dsl/AmqpBaseOutboundEndpointSpec.java | 184 +++++++++++++++++- .../AbstractAmqpOutboundEndpoint.java | 20 +- .../integration/dsl/MessageProducerSpec.java | 48 ++++- .../integration/dsl/MessagingGatewaySpec.java | 14 +- .../endpoint/MessageProducerSupport.java | 8 +- 7 files changed, 318 insertions(+), 19 deletions(-) diff --git a/spring-integration-amqp/src/main/java/org/springframework/integration/amqp/dsl/AmqpBaseInboundChannelAdapterSpec.java b/spring-integration-amqp/src/main/java/org/springframework/integration/amqp/dsl/AmqpBaseInboundChannelAdapterSpec.java index c31aba430a..cf6bec9b6a 100644 --- a/spring-integration-amqp/src/main/java/org/springframework/integration/amqp/dsl/AmqpBaseInboundChannelAdapterSpec.java +++ b/spring-integration-amqp/src/main/java/org/springframework/integration/amqp/dsl/AmqpBaseInboundChannelAdapterSpec.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2016 the original author or authors. + * Copyright 2014-2018 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. @@ -21,6 +21,8 @@ import org.springframework.integration.amqp.inbound.AmqpInboundChannelAdapter; import org.springframework.integration.amqp.support.AmqpHeaderMapper; import org.springframework.integration.amqp.support.DefaultAmqpHeaderMapper; import org.springframework.integration.dsl.MessageProducerSpec; +import org.springframework.retry.RecoveryCallback; +import org.springframework.retry.support.RetryTemplate; /** * The base {@link MessageProducerSpec} implementation for a {@link AmqpInboundChannelAdapter}. @@ -28,6 +30,7 @@ import org.springframework.integration.dsl.MessageProducerSpec; * @param the target {@link AmqpBaseInboundChannelAdapterSpec} implementation type. * * @author Artem Bilan + * * @since 5.0 */ public class AmqpBaseInboundChannelAdapterSpec> @@ -74,4 +77,28 @@ public class AmqpBaseInboundChannelAdapterSpec recoveryCallback) { + this.target.setRecoveryCallback(recoveryCallback); + return _this(); + } + } diff --git a/spring-integration-amqp/src/main/java/org/springframework/integration/amqp/dsl/AmqpBaseInboundGatewaySpec.java b/spring-integration-amqp/src/main/java/org/springframework/integration/amqp/dsl/AmqpBaseInboundGatewaySpec.java index 969df785d8..6c3af53159 100644 --- a/spring-integration-amqp/src/main/java/org/springframework/integration/amqp/dsl/AmqpBaseInboundGatewaySpec.java +++ b/spring-integration-amqp/src/main/java/org/springframework/integration/amqp/dsl/AmqpBaseInboundGatewaySpec.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2016 the original author or authors. + * Copyright 2014-2018 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. @@ -21,6 +21,8 @@ import org.springframework.integration.amqp.inbound.AmqpInboundGateway; import org.springframework.integration.amqp.support.AmqpHeaderMapper; import org.springframework.integration.amqp.support.DefaultAmqpHeaderMapper; import org.springframework.integration.dsl.MessagingGatewaySpec; +import org.springframework.retry.RecoveryCallback; +import org.springframework.retry.support.RetryTemplate; /** * A base {@link MessagingGatewaySpec} implementation for {@link AmqpInboundGateway} endpoint options. @@ -29,6 +31,7 @@ import org.springframework.integration.dsl.MessagingGatewaySpec; * @param the target {@link AmqpBaseInboundGatewaySpec} implementation type. * * @author Artem Bilan + * * @since 5.0 * * @see AmqpInboundGateway @@ -60,6 +63,7 @@ public class AmqpBaseInboundGatewaySpec> * {@link org.springframework.integration.amqp.support.DefaultAmqpHeaderMapper}. * @param headerMapper the headerMapper. * @return the spec. + * @see AmqpInboundGateway#setHeaderMapper(AmqpHeaderMapper) */ public S headerMapper(AmqpHeaderMapper headerMapper) { this.target.setHeaderMapper(headerMapper); @@ -70,7 +74,7 @@ public class AmqpBaseInboundGatewaySpec> * Only applies if the default header mapper is used. * @param headers the headers. * @return the spec. - * @see org.springframework.integration.amqp.support.DefaultAmqpHeaderMapper#setRequestHeaderNames(String[]) + * @see DefaultAmqpHeaderMapper#setRequestHeaderNames(String[]) */ public S mappedRequestHeaders(String... headers) { this.headerMapper.setRequestHeaderNames(headers); @@ -81,7 +85,7 @@ public class AmqpBaseInboundGatewaySpec> * Only applies if the default header mapper is used. * @param headers the headers. * @return the spec. - * @see org.springframework.integration.amqp.support.DefaultAmqpHeaderMapper#setReplyHeaderNames(String[]) + * @see DefaultAmqpHeaderMapper#setReplyHeaderNames(String[]) */ public S mappedReplyHeaders(String... headers) { this.headerMapper.setReplyHeaderNames(headers); @@ -109,4 +113,28 @@ public class AmqpBaseInboundGatewaySpec> return _this(); } + /** + * Set a {@link RetryTemplate} to use for retrying a message delivery within the + * adapter. + * @param retryTemplate the template. + * @return the spec. + * @since 5.0.2 + * @see AmqpInboundGateway#setRetryTemplate(RetryTemplate) + */ + public S retryTemplate(RetryTemplate retryTemplate) { + this.target.setRetryTemplate(retryTemplate); + return _this(); + } + + /** + * Set a {@link RecoveryCallback} when using retry within the adapter. + * @param recoveryCallback the callback. + * @since 5.0.2 + * @see AmqpInboundGateway#setRecoveryCallback(RecoveryCallback) + */ + public S recoveryCallback(RecoveryCallback recoveryCallback) { + this.target.setRecoveryCallback(recoveryCallback); + return _this(); + } + } diff --git a/spring-integration-amqp/src/main/java/org/springframework/integration/amqp/dsl/AmqpBaseOutboundEndpointSpec.java b/spring-integration-amqp/src/main/java/org/springframework/integration/amqp/dsl/AmqpBaseOutboundEndpointSpec.java index e300d7b9dc..32f294458b 100644 --- a/spring-integration-amqp/src/main/java/org/springframework/integration/amqp/dsl/AmqpBaseOutboundEndpointSpec.java +++ b/spring-integration-amqp/src/main/java/org/springframework/integration/amqp/dsl/AmqpBaseOutboundEndpointSpec.java @@ -1,5 +1,5 @@ /* - * Copyright 2016 the original author or authors. + * Copyright 2016-2018 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. @@ -25,8 +25,10 @@ import org.springframework.integration.amqp.support.AmqpHeaderMapper; import org.springframework.integration.amqp.support.DefaultAmqpHeaderMapper; import org.springframework.integration.dsl.MessageHandlerSpec; import org.springframework.integration.expression.FunctionExpression; +import org.springframework.integration.support.ErrorMessageStrategy; import org.springframework.messaging.Message; import org.springframework.messaging.MessageChannel; +import org.springframework.messaging.MessageHeaders; /** * The base {@link MessageHandlerSpec} for {@link AbstractAmqpOutboundEndpoint}s. @@ -35,100 +37,193 @@ import org.springframework.messaging.MessageChannel; * @param the target {@link AbstractAmqpOutboundEndpoint} implementation type. * * @author Artem Bilan + * * @since 5.0 */ public abstract class - AmqpBaseOutboundEndpointSpec, E extends AbstractAmqpOutboundEndpoint> +AmqpBaseOutboundEndpointSpec, E extends AbstractAmqpOutboundEndpoint> extends MessageHandlerSpec { protected final DefaultAmqpHeaderMapper headerMapper = DefaultAmqpHeaderMapper.outboundMapper(); + /** + * Set a custom {@link AmqpHeaderMapper} for mapping request and reply headers. + * @param headerMapper the {@link AmqpHeaderMapper} to use. + * @return the spec + */ public S headerMapper(AmqpHeaderMapper headerMapper) { this.target.setHeaderMapper(headerMapper); return _this(); } + /** + * Set the default delivery mode. + * @param defaultDeliveryMode the delivery mode. + * @return the spec + */ public S defaultDeliveryMode(MessageDeliveryMode defaultDeliveryMode) { this.target.setDefaultDeliveryMode(defaultDeliveryMode); return _this(); } + /** + * Configure an AMQP routing key for sending messages. + * @param routingKey the routing key to use + * @return the spec + */ public S routingKey(String routingKey) { this.target.setRoutingKey(routingKey); return _this(); } + /** + * A SpEL expression to evaluate routing key at runtime. + * @param routingKeyExpression the expression to use. + * @return the spec + */ public S routingKeyExpression(String routingKeyExpression) { return routingKeyExpression(PARSER.parseExpression(routingKeyExpression)); } + /** + * A function to evaluate routing key at runtime. + * @param routingKeyFunction the {@link Function} to use. + * @return the spec + */ public S routingKeyFunction(Function, String> routingKeyFunction) { - return routingKeyExpression(new FunctionExpression>(routingKeyFunction)); + return routingKeyExpression(new FunctionExpression<>(routingKeyFunction)); } + /** + * A SpEL expression to evaluate routing key at runtime. + * @param routingKeyExpression the expression to use. + * @return the spec + */ public S routingKeyExpression(Expression routingKeyExpression) { this.target.setRoutingKeyExpression(routingKeyExpression); return _this(); } + /** + * Set the channel to which returned messages are sent. + * @param returnChannel the channel. + * @return the spec + */ public S returnChannel(MessageChannel returnChannel) { this.target.setReturnChannel(returnChannel); return _this(); } + /** + * Set the channel to which acks are send (publisher confirms). + * @param ackChannel the channel. + * @return the spec + */ public S confirmAckChannel(MessageChannel ackChannel) { this.target.setConfirmAckChannel(ackChannel); return _this(); } + /** + * Configure an AMQP exchange name for sending messages. + * @param exchangeName the exchange name for sending messages. + * @return the spec + */ public S exchangeName(String exchangeName) { this.target.setExchangeName(exchangeName); return _this(); } + /** + * Configure a SpEL expression to evaluate an exchange name at runtime. + * @param exchangeNameExpression the expression to use. + * @return the spec + */ public S exchangeNameExpression(String exchangeNameExpression) { return exchangeNameExpression(PARSER.parseExpression(exchangeNameExpression)); } + /** + * Configure a {@link Function} to evaluate an exchange name at runtime. + * @param exchangeNameFunction the function to use. + * @return the spec + */ public S exchangeNameFunction(Function, String> exchangeNameFunction) { - return exchangeNameExpression(new FunctionExpression>(exchangeNameFunction)); + return exchangeNameExpression(new FunctionExpression<>(exchangeNameFunction)); } + /** + * Configure a SpEL expression to evaluate an exchange name at runtime. + * @param exchangeNameExpression the expression to use. + * @return the spec + */ public S exchangeNameExpression(Expression exchangeNameExpression) { this.target.setExchangeNameExpression(exchangeNameExpression); return _this(); } + /** + * Set the channel to which nacks are send (publisher confirms). + * @param nackChannel the channel. + * @return the spec + */ public S confirmNackChannel(MessageChannel nackChannel) { this.target.setConfirmNackChannel(nackChannel); return _this(); } + /** + * Set a SpEL expression to evaluate confirm correlation at runtime. + * @param confirmCorrelationExpression the expression to use. + * @return the spec + */ public S confirmCorrelationExpression(String confirmCorrelationExpression) { return confirmCorrelationExpression(PARSER.parseExpression(confirmCorrelationExpression)); } + /** + * Set a {@link Function} to evaluate confirm correlation at runtime. + * @param confirmCorrelationFunction the function to use. + * @return the spec + */ public S confirmCorrelationFunction(Function, Object> confirmCorrelationFunction) { - return confirmCorrelationExpression(new FunctionExpression>(confirmCorrelationFunction)); + return confirmCorrelationExpression(new FunctionExpression<>(confirmCorrelationFunction)); } - + /** + * Set a SpEL expression to evaluate confirm correlation at runtime. + * @param confirmCorrelationExpression the expression to use. + * @return the spec + */ public S confirmCorrelationExpression(Expression confirmCorrelationExpression) { this.target.setConfirmCorrelationExpression(confirmCorrelationExpression); return _this(); } + /** + * Provide the header names that should be mapped from a request to a {@link MessageHeaders}. + * @param headers The request header names. + * @return the spec + */ public S mappedRequestHeaders(String... headers) { this.headerMapper.setRequestHeaderNames(headers); return _this(); } + /** + * Provide the header names that should be mapped to a response + * from a {@link MessageHeaders}. + * @param headers The reply header names. + * @return the spec + */ public S mappedReplyHeaders(String... headers) { this.headerMapper.setReplyHeaderNames(headers); return _this(); } /** + * Determine whether the headers are + * mapped before the message is converted, or afterwards. * @param headersLast true to map headers last. * @return the spec. * @see AbstractAmqpOutboundEndpoint#setHeadersMappedLast(boolean) @@ -138,4 +233,81 @@ public abstract class return _this(); } + /** + * Set to {@code false} to attempt to connect during endpoint start. + * @param lazyConnect the lazyConnect to set. + * @return the spec. + * @since 5.0.2 + * @see AbstractAmqpOutboundEndpoint#setLazyConnect(boolean) + */ + public S lazyConnect(boolean lazyConnect) { + this.target.setLazyConnect(lazyConnect); + return _this(); + } + + /** + * Set the value to set in the {@code x-delay} header when using the + * RabbitMQ delayed message exchange plugin. + * @param delay the delay. + * @return the spec. + * @since 5.0.2 + * @see AbstractAmqpOutboundEndpoint#setDelay(int) + */ + public S delay(int delay) { + this.target.setDelay(delay); + return _this(); + } + + /** + * Set the function to calculate the {@code x-delay} header when using the + * RabbitMQ delayed message exchange plugin. + * @param delayFunction the function to evaluate the value for the {@code x-delay} header. + * @return the spec. + * @since 5.0.2 + * @see #delayExpression(Expression) + */ + public S delayFunction(Function, Integer> delayFunction) { + return delayExpression(new FunctionExpression<>(delayFunction)); + } + + + /** + * Set the SpEL expression to calculate the {@code x-delay} header when using the + * RabbitMQ delayed message exchange plugin. + * @param delayExpression the expression. + * @return the spec. + * @since 5.0.2 + * @see AbstractAmqpOutboundEndpoint#setDelayExpression(Expression) + */ + public S delayExpression(Expression delayExpression) { + this.target.setDelayExpression(delayExpression); + return _this(); + } + + /** + * Set the SpEL expression to calculate the {@code x-delay} header when using the + * RabbitMQ delayed message exchange plugin. + * @param delayExpression the expression. + * @return the spec. + * @since 5.0.2 + * @see AbstractAmqpOutboundEndpoint#setDelayExpressionString(String) + */ + public S delayExpression(String delayExpression) { + this.target.setDelayExpressionString(delayExpression); + return _this(); + } + + /** + Set the error message strategy to use for returned (or negatively confirmed) + * messages. + * @param errorMessageStrategy the strategy. + * @return the spec. + * @since 5.0.2 + * @see AbstractAmqpOutboundEndpoint#setErrorMessageStrategy(ErrorMessageStrategy) + */ + public S errorMessageStrategy(ErrorMessageStrategy errorMessageStrategy) { + this.target.setErrorMessageStrategy(errorMessageStrategy); + return _this(); + } + } diff --git a/spring-integration-amqp/src/main/java/org/springframework/integration/amqp/outbound/AbstractAmqpOutboundEndpoint.java b/spring-integration-amqp/src/main/java/org/springframework/integration/amqp/outbound/AbstractAmqpOutboundEndpoint.java index 965e048c92..bd145d5d4c 100644 --- a/spring-integration-amqp/src/main/java/org/springframework/integration/amqp/outbound/AbstractAmqpOutboundEndpoint.java +++ b/spring-integration-amqp/src/main/java/org/springframework/integration/amqp/outbound/AbstractAmqpOutboundEndpoint.java @@ -1,5 +1,5 @@ /* - * Copyright 2016-2017 the original author or authors. + * Copyright 2016-2018 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. @@ -52,7 +52,7 @@ import org.springframework.util.StringUtils; * */ public abstract class AbstractAmqpOutboundEndpoint extends AbstractReplyProducingMessageHandler - implements Lifecycle { + implements Lifecycle { private String exchangeName; @@ -98,6 +98,11 @@ public abstract class AbstractAmqpOutboundEndpoint extends AbstractReplyProducin private volatile boolean running; + /** + * Set a custom {@link AmqpHeaderMapper} for mapping request and reply headers. + * Defaults to {@link DefaultAmqpHeaderMapper#outboundMapper()}. + * @param headerMapper the {@link AmqpHeaderMapper} to use. + */ public void setHeaderMapper(AmqpHeaderMapper headerMapper) { Assert.notNull(headerMapper, "headerMapper must not be null"); this.headerMapper = headerMapper; @@ -121,12 +126,17 @@ public abstract class AbstractAmqpOutboundEndpoint extends AbstractReplyProducin this.headersMappedLast = headersMappedLast; } + /** + * Configure an AMQP exchange name for sending messages. + * @param exchangeName the exchange name for sending messages. + */ public void setExchangeName(String exchangeName) { Assert.notNull(exchangeName, "exchangeName must not be null"); this.exchangeName = exchangeName; } /** + * Configure a SpEL expression to evaluate an exchange name at runtime. * @param exchangeNameExpression the expression to use. * @since 4.3 */ @@ -143,6 +153,10 @@ public abstract class AbstractAmqpOutboundEndpoint extends AbstractReplyProducin this.exchangeNameExpression = EXPRESSION_PARSER.parseExpression(exchangeNameExpression); } + /** + * Configure an AMQP routing key for sending messages. + * @param routingKey the routing key to use + */ public void setRoutingKey(String routingKey) { Assert.notNull(routingKey, "routingKey must not be null"); this.routingKey = routingKey; @@ -166,6 +180,7 @@ public abstract class AbstractAmqpOutboundEndpoint extends AbstractReplyProducin } /** + * Set a SpEL expression to evaluate confirm correlation at runtime. * @param confirmCorrelationExpression the expression to use. * @since 4.3 */ @@ -174,6 +189,7 @@ public abstract class AbstractAmqpOutboundEndpoint extends AbstractReplyProducin } /** + * Set a SpEL expression to evaluate confirm correlation at runtime. * @param confirmCorrelationExpression the String in SpEL syntax. * @since 4.3 */ diff --git a/spring-integration-core/src/main/java/org/springframework/integration/dsl/MessageProducerSpec.java b/spring-integration-core/src/main/java/org/springframework/integration/dsl/MessageProducerSpec.java index 98d2feb56c..6bcd21c238 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/dsl/MessageProducerSpec.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/dsl/MessageProducerSpec.java @@ -1,5 +1,5 @@ /* - * Copyright 2016 the original author or authors. + * Copyright 2016-2018 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. @@ -17,6 +17,7 @@ package org.springframework.integration.dsl; import org.springframework.integration.endpoint.MessageProducerSupport; +import org.springframework.integration.support.ErrorMessageStrategy; import org.springframework.messaging.MessageChannel; /** @@ -75,7 +76,7 @@ public abstract class MessageProducerSpec, P * @see MessageProducerSupport#setOutputChannel(MessageChannel) */ public S outputChannel(MessageChannel outputChannel) { - target.setOutputChannel(outputChannel); + this.target.setOutputChannel(outputChannel); return _this(); } @@ -87,7 +88,7 @@ public abstract class MessageProducerSpec, P * @see MessageProducerSupport#setOutputChannelName(String) */ public S outputChannel(String outputChannel) { - target.setOutputChannelName(outputChannel); + this.target.setOutputChannelName(outputChannel); return _this(); } @@ -98,7 +99,7 @@ public abstract class MessageProducerSpec, P * @see MessageProducerSupport#setErrorChannel(MessageChannel) */ public S errorChannel(MessageChannel errorChannel) { - target.setErrorChannel(errorChannel); + this.target.setErrorChannel(errorChannel); return _this(); } @@ -109,7 +110,44 @@ public abstract class MessageProducerSpec, P * @see MessageProducerSupport#setErrorChannelName(String) */ public S errorChannel(String errorChannel) { - target.setErrorChannelName(errorChannel); + this.target.setErrorChannelName(errorChannel); + return _this(); + } + + /** + * Configure the default timeout value to use for send operations. + * May be overridden for individual messages. + * @param sendTimeout the send timeout in milliseconds + * @return the spec. + * @since 5.0.2 + * @see MessageProducerSupport#setSendTimeout + */ + public S sendTimeout(long sendTimeout) { + this.target.setSendTimeout(sendTimeout); + return _this(); + } + + /** + * Whether component should be tracked or not by message history. + * @param shouldTrack the tracking flag + * @return the spec. + * @since 5.0.2 + * @see MessageProducerSupport#setShouldTrack(boolean) + */ + public S shouldTrack(boolean shouldTrack) { + this.target.setShouldTrack(shouldTrack); + return _this(); + } + + /** + * Set an {@link ErrorMessageStrategy} to use to build an error message when a exception occurs. + * @param errorMessageStrategy the {@link ErrorMessageStrategy}. + * @return the spec. + * @since 5.0.2 + * @see MessageProducerSupport#setErrorMessageStrategy(ErrorMessageStrategy) + */ + public S errorMessageStrategy(ErrorMessageStrategy errorMessageStrategy) { + this.target.setErrorMessageStrategy(errorMessageStrategy); return _this(); } diff --git a/spring-integration-core/src/main/java/org/springframework/integration/dsl/MessagingGatewaySpec.java b/spring-integration-core/src/main/java/org/springframework/integration/dsl/MessagingGatewaySpec.java index 8854728756..09b146124c 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/dsl/MessagingGatewaySpec.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/dsl/MessagingGatewaySpec.java @@ -1,5 +1,5 @@ /* - * Copyright 2016 the original author or authors. + * Copyright 2016-2018 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. @@ -176,4 +176,16 @@ public abstract class MessagingGatewaySpec, return _this(); } + /** + * Whether component should be tracked or not by message history. + * @param shouldTrack the tracking flag + * @return the spec. + * @since 5.0.2 + * @see MessagingGatewaySupport#setShouldTrack(boolean) + */ + public S shouldTrack(boolean shouldTrack) { + this.target.setShouldTrack(shouldTrack); + return _this(); + } + } diff --git a/spring-integration-core/src/main/java/org/springframework/integration/endpoint/MessageProducerSupport.java b/spring-integration-core/src/main/java/org/springframework/integration/endpoint/MessageProducerSupport.java index fad396dcf9..d920a31c14 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/endpoint/MessageProducerSupport.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/endpoint/MessageProducerSupport.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 the original author or authors. + * Copyright 2002-2018 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. @@ -125,6 +125,12 @@ public abstract class MessageProducerSupport extends AbstractEndpoint implements return this.errorChannel; } + /** + * Configure the default timeout value to use for send operations. + * May be overridden for individual messages. + * @param sendTimeout the send timeout in milliseconds + * @see MessagingTemplate#setSendTimeout + */ public void setSendTimeout(long sendTimeout) { this.messagingTemplate.setSendTimeout(sendTimeout); }