From 391577162a722b21033e444ee579d4a9854e994d Mon Sep 17 00:00:00 2001 From: szymondembek Date: Mon, 17 Apr 2017 23:04:53 +0200 Subject: [PATCH 1/3] support for extending the visibility timeout on per-message basic by passing the new Visibility interface to the message handler method --- .../listener/QueueMessageHandler.java | 3 + .../listener/QueueMessageVisibility.java | 47 ++++++++++++++ .../SimpleMessageListenerContainer.java | 1 + .../aws/messaging/listener/Visibility.java | 40 ++++++++++++ ...isibilityHandlerMetodArgumentResolver.java | 49 ++++++++++++++ .../SimpleMessageListenerContainerTest.java | 65 +++++++++++++++++++ ...lityHandlerMethodArgumentResolverTest.java | 46 +++++++++++++ 7 files changed, 251 insertions(+) create mode 100644 spring-cloud-aws-messaging/src/main/java/org/springframework/cloud/aws/messaging/listener/QueueMessageVisibility.java create mode 100644 spring-cloud-aws-messaging/src/main/java/org/springframework/cloud/aws/messaging/listener/Visibility.java create mode 100644 spring-cloud-aws-messaging/src/main/java/org/springframework/cloud/aws/messaging/listener/support/VisibilityHandlerMetodArgumentResolver.java create mode 100644 spring-cloud-aws-messaging/src/test/java/org/springframework/cloud/aws/messaging/listener/support/VisibilityHandlerMethodArgumentResolverTest.java diff --git a/spring-cloud-aws-messaging/src/main/java/org/springframework/cloud/aws/messaging/listener/QueueMessageHandler.java b/spring-cloud-aws-messaging/src/main/java/org/springframework/cloud/aws/messaging/listener/QueueMessageHandler.java index 44726e304..ccdab886c 100644 --- a/spring-cloud-aws-messaging/src/main/java/org/springframework/cloud/aws/messaging/listener/QueueMessageHandler.java +++ b/spring-cloud-aws-messaging/src/main/java/org/springframework/cloud/aws/messaging/listener/QueueMessageHandler.java @@ -21,6 +21,7 @@ import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.cloud.aws.messaging.listener.annotation.SqsListener; import org.springframework.cloud.aws.messaging.listener.support.AcknowledgmentHandlerMethodArgumentResolver; +import org.springframework.cloud.aws.messaging.listener.support.VisibilityHandlerMetodArgumentResolver; import org.springframework.cloud.aws.messaging.support.NotificationMessageArgumentResolver; import org.springframework.cloud.aws.messaging.support.NotificationSubjectArgumentResolver; import org.springframework.cloud.aws.messaging.support.converter.ObjectMessageConverter; @@ -65,6 +66,7 @@ public class QueueMessageHandler extends AbstractMethodMessageHandler initArgumentResolvers() resolvers.add(new NotificationSubjectArgumentResolver()); resolvers.add(new AcknowledgmentHandlerMethodArgumentResolver(ACKNOWLEDGMENT)); + resolvers.add(new VisibilityHandlerMetodArgumentResolver(VISIBILITY)); CompositeMessageConverter compositeMessageConverter = createPayloadArgumentCompositeConverter(); resolvers.add(new NotificationMessageArgumentResolver(compositeMessageConverter)); diff --git a/spring-cloud-aws-messaging/src/main/java/org/springframework/cloud/aws/messaging/listener/QueueMessageVisibility.java b/spring-cloud-aws-messaging/src/main/java/org/springframework/cloud/aws/messaging/listener/QueueMessageVisibility.java new file mode 100644 index 000000000..5c8d6291b --- /dev/null +++ b/spring-cloud-aws-messaging/src/main/java/org/springframework/cloud/aws/messaging/listener/QueueMessageVisibility.java @@ -0,0 +1,47 @@ +/* + * Copyright 2013-2014 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.cloud.aws.messaging.listener; + +import com.amazonaws.services.sqs.AmazonSQSAsync; +import com.amazonaws.services.sqs.model.ChangeMessageVisibilityRequest; + +import java.util.concurrent.Future; + +/** + * @author Szymon Dembek + * @since 1.3 + */ +public class QueueMessageVisibility implements Visibility { + + private final AmazonSQSAsync amazonSqsAsync; + private final String queueUrl; + private final String receiptHandle; + + public QueueMessageVisibility(AmazonSQSAsync amazonSqsAsync, String queueUrl, String receiptHandle) { + this.amazonSqsAsync = amazonSqsAsync; + this.queueUrl = queueUrl; + this.receiptHandle = receiptHandle; + } + + @Override + public Future extend(int seconds) { + return amazonSqsAsync.changeMessageVisibilityAsync(new ChangeMessageVisibilityRequest() + .withQueueUrl(queueUrl) + .withReceiptHandle(receiptHandle) + .withVisibilityTimeout(seconds)); + } +} diff --git a/spring-cloud-aws-messaging/src/main/java/org/springframework/cloud/aws/messaging/listener/SimpleMessageListenerContainer.java b/spring-cloud-aws-messaging/src/main/java/org/springframework/cloud/aws/messaging/listener/SimpleMessageListenerContainer.java index 8dbcca938..cfe3f62a1 100644 --- a/spring-cloud-aws-messaging/src/main/java/org/springframework/cloud/aws/messaging/listener/SimpleMessageListenerContainer.java +++ b/spring-cloud-aws-messaging/src/main/java/org/springframework/cloud/aws/messaging/listener/SimpleMessageListenerContainer.java @@ -347,6 +347,7 @@ private org.springframework.messaging.Message getMessageForExecution() { QueueMessageAcknowledgment acknowledgment = new QueueMessageAcknowledgment(SimpleMessageListenerContainer.this.getAmazonSqs(), this.queueUrl, receiptHandle); additionalHeaders.put(QueueMessageHandler.ACKNOWLEDGMENT, acknowledgment); } + additionalHeaders.put(QueueMessageHandler.VISIBILITY, new QueueMessageVisibility(SimpleMessageListenerContainer.this.getAmazonSqs(), this.queueUrl, this.message.getReceiptHandle())); return createMessage(this.message, additionalHeaders); } diff --git a/spring-cloud-aws-messaging/src/main/java/org/springframework/cloud/aws/messaging/listener/Visibility.java b/spring-cloud-aws-messaging/src/main/java/org/springframework/cloud/aws/messaging/listener/Visibility.java new file mode 100644 index 000000000..cb588122b --- /dev/null +++ b/spring-cloud-aws-messaging/src/main/java/org/springframework/cloud/aws/messaging/listener/Visibility.java @@ -0,0 +1,40 @@ +/* + * Copyright 2013-2014 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.cloud.aws.messaging.listener; + +import java.util.concurrent.Future; + +/** + * Visibility interface that can be injected as parameter into a listener method. The purpose of this interface + * is to provide a way for the listener methods to extend the visibility timeout of the message being currently processed. + * + * @author Szymon Dembek + * @since 1.3 + */ +public interface Visibility { + + /** + * Allows extending the visibility timeout of a message that was already fetched from the queue, in case when + * the configured visibility timeout turns out to be to short + * + * @param seconds number of seconds to extend the visibility timeout by + * + * @return a {@link Future} as the extension can involve some asynchronous request (i.e. request to an AWS API). + */ + Future extend(int seconds); + +} diff --git a/spring-cloud-aws-messaging/src/main/java/org/springframework/cloud/aws/messaging/listener/support/VisibilityHandlerMetodArgumentResolver.java b/spring-cloud-aws-messaging/src/main/java/org/springframework/cloud/aws/messaging/listener/support/VisibilityHandlerMetodArgumentResolver.java new file mode 100644 index 000000000..99bdde940 --- /dev/null +++ b/spring-cloud-aws-messaging/src/main/java/org/springframework/cloud/aws/messaging/listener/support/VisibilityHandlerMetodArgumentResolver.java @@ -0,0 +1,49 @@ +/* + * Copyright 2013-2014 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.cloud.aws.messaging.listener.support; + +import org.springframework.cloud.aws.messaging.listener.Visibility; +import org.springframework.core.MethodParameter; +import org.springframework.messaging.Message; +import org.springframework.messaging.handler.invocation.HandlerMethodArgumentResolver; +import org.springframework.util.ClassUtils; + +/** + * @author Szymon Dembek + * @since 1.3 + */ +public class VisibilityHandlerMetodArgumentResolver implements HandlerMethodArgumentResolver { + private final String visibilityHeaderName; + + public VisibilityHandlerMetodArgumentResolver(String visibilityHeaderName) { + this.visibilityHeaderName = visibilityHeaderName; + } + + @Override + public boolean supportsParameter(MethodParameter parameter) { + return ClassUtils.isAssignable(Visibility.class, parameter.getParameterType()); + } + + @Override + public Object resolveArgument(MethodParameter parameter, Message message) throws Exception { + if (!message.getHeaders().containsKey(this.visibilityHeaderName) || + message.getHeaders().get(this.visibilityHeaderName) == null) { + throw new IllegalArgumentException("No visibility object found for message header: '" + this.visibilityHeaderName + "'"); + } + return message.getHeaders().get(this.visibilityHeaderName); + } +} diff --git a/spring-cloud-aws-messaging/src/test/java/org/springframework/cloud/aws/messaging/listener/SimpleMessageListenerContainerTest.java b/spring-cloud-aws-messaging/src/test/java/org/springframework/cloud/aws/messaging/listener/SimpleMessageListenerContainerTest.java index 3d5107020..d3ba04ec3 100644 --- a/spring-cloud-aws-messaging/src/test/java/org/springframework/cloud/aws/messaging/listener/SimpleMessageListenerContainerTest.java +++ b/spring-cloud-aws-messaging/src/test/java/org/springframework/cloud/aws/messaging/listener/SimpleMessageListenerContainerTest.java @@ -19,6 +19,7 @@ import com.amazonaws.AmazonClientException; import com.amazonaws.services.sqs.AmazonSQSAsync; import com.amazonaws.services.sqs.buffered.AmazonSQSBufferedAsyncClient; +import com.amazonaws.services.sqs.model.ChangeMessageVisibilityRequest; import com.amazonaws.services.sqs.model.DeleteMessageRequest; import com.amazonaws.services.sqs.model.GetQueueAttributesRequest; import com.amazonaws.services.sqs.model.GetQueueAttributesResult; @@ -638,6 +639,50 @@ protected void executeMessage(org.springframework.messaging.Message stri container.stop(); } + @Test + public void receiveMessage_withMessageListenerMethodAndVisibilityProlonging_callsChangeMessageVisibility() throws Exception { + // Arrange + final CountDownLatch countDownLatch = new CountDownLatch(1); + SimpleMessageListenerContainer container = new SimpleMessageListenerContainer() { + + @Override + protected void executeMessage(org.springframework.messaging.Message stringMessage) { + countDownLatch.countDown(); + super.executeMessage(stringMessage); + } + }; + + AmazonSQSAsync sqs = mock(AmazonSQSAsync.class); + container.setAmazonSqs(sqs); + + QueueMessageHandler messageHandler = new QueueMessageHandler(); + container.setMessageHandler(messageHandler); + + StaticApplicationContext applicationContext = new StaticApplicationContext(); + applicationContext.registerSingleton("testListener", TestMessageListenerWithVisibilityProlong.class); + + mockGetQueueUrl(sqs, "testQueue", "http://receiveMessage_withMessageListenerMethodAndVisibilityProlonging_callsChangeMessageVisibility.amazonaws.com"); + mockGetQueueAttributesWithEmptyResult(sqs, "http://receiveMessage_withMessageListenerMethodAndVisibilityProlonging_callsChangeMessageVisibility.amazonaws.com"); + + messageHandler.setApplicationContext(applicationContext); + messageHandler.afterPropertiesSet(); + container.afterPropertiesSet(); + + mockReceiveMessage(sqs, "http://receiveMessage_withMessageListenerMethodAndVisibilityProlonging_callsChangeMessageVisibility.amazonaws.com", "messageContent", "ReceiptHandle"); + + // Act + container.start(); + + // Assert + countDownLatch.await(1L, TimeUnit.SECONDS); + verify(sqs, never()).changeMessageVisibilityAsync(any(ChangeMessageVisibilityRequest.class)); + TestMessageListenerWithVisibilityProlong testMessageListenerWithVisibilityProlong = applicationContext.getBean(TestMessageListenerWithVisibilityProlong.class); + testMessageListenerWithVisibilityProlong.getCountDownLatch().await(1L, TimeUnit.SECONDS); + testMessageListenerWithVisibilityProlong.extend(5); + verify(sqs, times(1)).changeMessageVisibilityAsync(eq(new ChangeMessageVisibilityRequest("http://receiveMessage_withMessageListenerMethodAndVisibilityProlonging_callsChangeMessageVisibility.amazonaws.com", "ReceiptHandle", 5))); + container.stop(); + } + @Test public void executeMessage_withDifferentDeletionPolicies_shouldActAccordingly() throws Exception { // Arrange @@ -1077,6 +1122,26 @@ public AmazonSQSAsync amazonSQS() { } + private static class TestMessageListenerWithVisibilityProlong { + private Visibility visibility; + private final CountDownLatch countDownLatch = new CountDownLatch(1); + + @RuntimeUse + @SqsListener(value = "testQueue", deletionPolicy = SqsMessageDeletionPolicy.ON_SUCCESS) + private void manualSuccess(String message, Visibility visibility) { + this.visibility = visibility; + this.countDownLatch.countDown(); + } + + public void extend(int seconds) { + this.visibility.extend(seconds); + } + + public CountDownLatch getCountDownLatch() { + return this.countDownLatch; + } + } + private static class TestMessageListenerWithManualDeletionPolicy { private Acknowledgment acknowledgment; diff --git a/spring-cloud-aws-messaging/src/test/java/org/springframework/cloud/aws/messaging/listener/support/VisibilityHandlerMethodArgumentResolverTest.java b/spring-cloud-aws-messaging/src/test/java/org/springframework/cloud/aws/messaging/listener/support/VisibilityHandlerMethodArgumentResolverTest.java new file mode 100644 index 000000000..c40aff3f0 --- /dev/null +++ b/spring-cloud-aws-messaging/src/test/java/org/springframework/cloud/aws/messaging/listener/support/VisibilityHandlerMethodArgumentResolverTest.java @@ -0,0 +1,46 @@ +/* + * Copyright 2013-2014 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.cloud.aws.messaging.listener.support; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; +import org.springframework.messaging.Message; +import org.springframework.messaging.support.MessageBuilder; + +/** + * @author Alain Sahli + * @since 1.1 + */ +public class VisibilityHandlerMethodArgumentResolverTest { + + @Rule + public final ExpectedException expectedException = ExpectedException.none(); + + @Test + public void resolveArgument_messageWithNoVisibilityHeader_throwIllegalArgumentException() throws Exception { + // Arrange + VisibilityHandlerMetodArgumentResolver visibilityHandlerMethodArgumentResolver = new VisibilityHandlerMetodArgumentResolver("Visibility"); + Message message = MessageBuilder.withPayload("no content").build(); + + this.expectedException.expect(IllegalArgumentException.class); + this.expectedException.expectMessage("Visibility"); + + // Act + visibilityHandlerMethodArgumentResolver.resolveArgument(null, message); + } +} \ No newline at end of file From e411a9c48598d37767ac6a3fe9fa41f7720a4078 Mon Sep 17 00:00:00 2001 From: szymondembek Date: Mon, 24 Apr 2017 13:30:06 +0200 Subject: [PATCH 2/3] spelling fix in class name --- .../cloud/aws/messaging/listener/QueueMessageHandler.java | 4 ++-- ...lver.java => VisibilityHandlerMethodArgumentResolver.java} | 4 ++-- .../support/VisibilityHandlerMethodArgumentResolverTest.java | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) rename spring-cloud-aws-messaging/src/main/java/org/springframework/cloud/aws/messaging/listener/support/{VisibilityHandlerMetodArgumentResolver.java => VisibilityHandlerMethodArgumentResolver.java} (90%) diff --git a/spring-cloud-aws-messaging/src/main/java/org/springframework/cloud/aws/messaging/listener/QueueMessageHandler.java b/spring-cloud-aws-messaging/src/main/java/org/springframework/cloud/aws/messaging/listener/QueueMessageHandler.java index ccdab886c..dbcf1d546 100644 --- a/spring-cloud-aws-messaging/src/main/java/org/springframework/cloud/aws/messaging/listener/QueueMessageHandler.java +++ b/spring-cloud-aws-messaging/src/main/java/org/springframework/cloud/aws/messaging/listener/QueueMessageHandler.java @@ -21,7 +21,7 @@ import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.cloud.aws.messaging.listener.annotation.SqsListener; import org.springframework.cloud.aws.messaging.listener.support.AcknowledgmentHandlerMethodArgumentResolver; -import org.springframework.cloud.aws.messaging.listener.support.VisibilityHandlerMetodArgumentResolver; +import org.springframework.cloud.aws.messaging.listener.support.VisibilityHandlerMethodArgumentResolver; import org.springframework.cloud.aws.messaging.support.NotificationMessageArgumentResolver; import org.springframework.cloud.aws.messaging.support.NotificationSubjectArgumentResolver; import org.springframework.cloud.aws.messaging.support.converter.ObjectMessageConverter; @@ -80,7 +80,7 @@ protected List initArgumentResolvers() resolvers.add(new NotificationSubjectArgumentResolver()); resolvers.add(new AcknowledgmentHandlerMethodArgumentResolver(ACKNOWLEDGMENT)); - resolvers.add(new VisibilityHandlerMetodArgumentResolver(VISIBILITY)); + resolvers.add(new VisibilityHandlerMethodArgumentResolver(VISIBILITY)); CompositeMessageConverter compositeMessageConverter = createPayloadArgumentCompositeConverter(); resolvers.add(new NotificationMessageArgumentResolver(compositeMessageConverter)); diff --git a/spring-cloud-aws-messaging/src/main/java/org/springframework/cloud/aws/messaging/listener/support/VisibilityHandlerMetodArgumentResolver.java b/spring-cloud-aws-messaging/src/main/java/org/springframework/cloud/aws/messaging/listener/support/VisibilityHandlerMethodArgumentResolver.java similarity index 90% rename from spring-cloud-aws-messaging/src/main/java/org/springframework/cloud/aws/messaging/listener/support/VisibilityHandlerMetodArgumentResolver.java rename to spring-cloud-aws-messaging/src/main/java/org/springframework/cloud/aws/messaging/listener/support/VisibilityHandlerMethodArgumentResolver.java index 99bdde940..2d79f74df 100644 --- a/spring-cloud-aws-messaging/src/main/java/org/springframework/cloud/aws/messaging/listener/support/VisibilityHandlerMetodArgumentResolver.java +++ b/spring-cloud-aws-messaging/src/main/java/org/springframework/cloud/aws/messaging/listener/support/VisibilityHandlerMethodArgumentResolver.java @@ -26,10 +26,10 @@ * @author Szymon Dembek * @since 1.3 */ -public class VisibilityHandlerMetodArgumentResolver implements HandlerMethodArgumentResolver { +public class VisibilityHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver { private final String visibilityHeaderName; - public VisibilityHandlerMetodArgumentResolver(String visibilityHeaderName) { + public VisibilityHandlerMethodArgumentResolver(String visibilityHeaderName) { this.visibilityHeaderName = visibilityHeaderName; } diff --git a/spring-cloud-aws-messaging/src/test/java/org/springframework/cloud/aws/messaging/listener/support/VisibilityHandlerMethodArgumentResolverTest.java b/spring-cloud-aws-messaging/src/test/java/org/springframework/cloud/aws/messaging/listener/support/VisibilityHandlerMethodArgumentResolverTest.java index c40aff3f0..ab20f7e4c 100644 --- a/spring-cloud-aws-messaging/src/test/java/org/springframework/cloud/aws/messaging/listener/support/VisibilityHandlerMethodArgumentResolverTest.java +++ b/spring-cloud-aws-messaging/src/test/java/org/springframework/cloud/aws/messaging/listener/support/VisibilityHandlerMethodArgumentResolverTest.java @@ -34,7 +34,7 @@ public class VisibilityHandlerMethodArgumentResolverTest { @Test public void resolveArgument_messageWithNoVisibilityHeader_throwIllegalArgumentException() throws Exception { // Arrange - VisibilityHandlerMetodArgumentResolver visibilityHandlerMethodArgumentResolver = new VisibilityHandlerMetodArgumentResolver("Visibility"); + VisibilityHandlerMethodArgumentResolver visibilityHandlerMethodArgumentResolver = new VisibilityHandlerMethodArgumentResolver("Visibility"); Message message = MessageBuilder.withPayload("no content").build(); this.expectedException.expect(IllegalArgumentException.class); From ecd4cabb0b62cbb8671f41fcfd059e69037d2df3 Mon Sep 17 00:00:00 2001 From: szymondembek Date: Sat, 29 Apr 2017 21:54:01 +0200 Subject: [PATCH 3/3] minor copyright fixes --- .../aws/messaging/listener/QueueMessageVisibility.java | 2 +- .../support/VisibilityHandlerMethodArgumentResolver.java | 2 +- .../VisibilityHandlerMethodArgumentResolverTest.java | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/spring-cloud-aws-messaging/src/main/java/org/springframework/cloud/aws/messaging/listener/QueueMessageVisibility.java b/spring-cloud-aws-messaging/src/main/java/org/springframework/cloud/aws/messaging/listener/QueueMessageVisibility.java index 5c8d6291b..337ba6952 100644 --- a/spring-cloud-aws-messaging/src/main/java/org/springframework/cloud/aws/messaging/listener/QueueMessageVisibility.java +++ b/spring-cloud-aws-messaging/src/main/java/org/springframework/cloud/aws/messaging/listener/QueueMessageVisibility.java @@ -1,5 +1,5 @@ /* - * Copyright 2013-2014 the original author or authors. + * Copyright 2013-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. diff --git a/spring-cloud-aws-messaging/src/main/java/org/springframework/cloud/aws/messaging/listener/support/VisibilityHandlerMethodArgumentResolver.java b/spring-cloud-aws-messaging/src/main/java/org/springframework/cloud/aws/messaging/listener/support/VisibilityHandlerMethodArgumentResolver.java index 2d79f74df..2dda2146c 100644 --- a/spring-cloud-aws-messaging/src/main/java/org/springframework/cloud/aws/messaging/listener/support/VisibilityHandlerMethodArgumentResolver.java +++ b/spring-cloud-aws-messaging/src/main/java/org/springframework/cloud/aws/messaging/listener/support/VisibilityHandlerMethodArgumentResolver.java @@ -1,5 +1,5 @@ /* - * Copyright 2013-2014 the original author or authors. + * Copyright 2013-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. diff --git a/spring-cloud-aws-messaging/src/test/java/org/springframework/cloud/aws/messaging/listener/support/VisibilityHandlerMethodArgumentResolverTest.java b/spring-cloud-aws-messaging/src/test/java/org/springframework/cloud/aws/messaging/listener/support/VisibilityHandlerMethodArgumentResolverTest.java index ab20f7e4c..9694f4732 100644 --- a/spring-cloud-aws-messaging/src/test/java/org/springframework/cloud/aws/messaging/listener/support/VisibilityHandlerMethodArgumentResolverTest.java +++ b/spring-cloud-aws-messaging/src/test/java/org/springframework/cloud/aws/messaging/listener/support/VisibilityHandlerMethodArgumentResolverTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2013-2014 the original author or authors. + * Copyright 2013-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. @@ -23,8 +23,8 @@ import org.springframework.messaging.support.MessageBuilder; /** - * @author Alain Sahli - * @since 1.1 + * @author Szymon Dembek + * @since 1.3 */ public class VisibilityHandlerMethodArgumentResolverTest {