Skip to content

Commit 63ad156

Browse files
authored
Improve handling of missing message attribute (#59)
* Improve handling of missing message attribute on virtual queue receive and delete the message
1 parent c105771 commit 63ad156

File tree

2 files changed

+43
-7
lines changed

2 files changed

+43
-7
lines changed

src/main/java/com/amazonaws/services/sqs/AmazonSQSVirtualQueuesClient.java

+7-1
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,13 @@ public HostQueue(String queueUrl) {
288288
}
289289

290290
private void dispatchMessage(Message message) {
291-
String queueName = message.getMessageAttributes().get(VIRTUAL_QUEUE_NAME_ATTRIBUTE).getStringValue();
291+
MessageAttributeValue messageAttributeValue = message.getMessageAttributes().get(VIRTUAL_QUEUE_NAME_ATTRIBUTE);
292+
// Case where a message was sent with missing attribute __AmazonSQSVirtualQueuesClient.QueueName
293+
if (messageAttributeValue == null) {
294+
orphanedMessageHandler.accept(queueUrl, message);
295+
return;
296+
}
297+
String queueName = messageAttributeValue.getStringValue();
292298
VirtualQueue virtualQueue = virtualQueues.get(queueName);
293299
if (virtualQueue != null) {
294300
messageHandlerOptional.map(messageHandler -> {

src/test/java/com/amazonaws/services/sqs/AmazonSQSVirtualQueuesClientIT.java

+36-6
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,35 @@
22

33
import static org.junit.Assert.assertEquals;
44
import static org.junit.Assert.fail;
5+
import static org.mockito.ArgumentMatchers.any;
6+
import static org.mockito.Mockito.mock;
7+
import static org.mockito.Mockito.verify;
58

6-
import java.util.Optional;
79
import java.util.concurrent.TimeUnit;
10+
import java.util.function.BiConsumer;
811

12+
import com.amazonaws.services.sqs.model.CreateQueueRequest;
13+
import com.amazonaws.services.sqs.model.Message;
14+
import com.amazonaws.services.sqs.model.QueueDoesNotExistException;
15+
import com.amazonaws.services.sqs.model.ReceiveMessageRequest;
16+
import com.amazonaws.services.sqs.model.SendMessageRequest;
917
import org.junit.After;
1018
import org.junit.Before;
1119
import org.junit.Test;
1220

13-
import com.amazonaws.services.sqs.model.CreateQueueRequest;
14-
import com.amazonaws.services.sqs.model.QueueDoesNotExistException;
15-
import com.amazonaws.services.sqs.model.ReceiveMessageRequest;
1621
import com.amazonaws.services.sqs.util.IntegrationTest;
1722

1823
public class AmazonSQSVirtualQueuesClientIT extends IntegrationTest {
1924

2025
private static String hostQueueUrl;
2126
private static AmazonSQS client;
2227

28+
BiConsumer<String, Message> orphanedMessageHandlerMock;
29+
2330
@Before
2431
public void setup() {
25-
client = AmazonSQSVirtualQueuesClientBuilder.standard().withAmazonSQS(sqs).build();
32+
orphanedMessageHandlerMock = mock(BiConsumer.class);
33+
client = AmazonSQSVirtualQueuesClientBuilder.standard().withAmazonSQS(sqs).withOrphanedMessageHandler(orphanedMessageHandlerMock).build();
2634
hostQueueUrl = client.createQueue(queueNamePrefix + "-HostQueue").getQueueUrl();
2735
}
2836

@@ -43,7 +51,7 @@ public void expiringVirtualQueue() throws InterruptedException {
4351
.addAttributesEntry(AmazonSQSVirtualQueuesClient.VIRTUAL_QUEUE_HOST_QUEUE_ATTRIBUTE, hostQueueUrl)
4452
.addAttributesEntry(AmazonSQSIdleQueueDeletingClient.IDLE_QUEUE_RETENTION_PERIOD, "10");
4553
String virtualQueueUrl = client.createQueue(request).getQueueUrl();
46-
54+
4755
// Do a few long poll receives and validate the queue stays alive.
4856
// We expect empty receives but not errors.
4957
ReceiveMessageRequest receiveRequest = new ReceiveMessageRequest()
@@ -108,4 +116,26 @@ public void virtualQueueShouldNotExpireDuringLongReceive() throws InterruptedExc
108116
// Delete the queue so we don't get a spurious message about it expiring during the test shutdown
109117
client.deleteQueue(virtualQueueUrl);
110118
}
119+
120+
@Test
121+
public void missingMessageAttributeIsReceivedAndDeleted() throws InterruptedException {
122+
CreateQueueRequest request = new CreateQueueRequest()
123+
.withQueueName("ShortLived")
124+
.addAttributesEntry(AmazonSQSVirtualQueuesClient.VIRTUAL_QUEUE_HOST_QUEUE_ATTRIBUTE, hostQueueUrl)
125+
.addAttributesEntry(AmazonSQSIdleQueueDeletingClient.IDLE_QUEUE_RETENTION_PERIOD, "10");
126+
String virtualQueueUrl = client.createQueue(request).getQueueUrl();
127+
128+
ReceiveMessageRequest receiveRequest = new ReceiveMessageRequest()
129+
.withQueueUrl(virtualQueueUrl)
130+
.withWaitTimeSeconds(20);
131+
SendMessageRequest sendMessageRequest = new SendMessageRequest()
132+
.withQueueUrl(hostQueueUrl)
133+
.withMessageBody("Missing Message attributes!")
134+
.withDelaySeconds(5);
135+
136+
client.sendMessage(sendMessageRequest);
137+
// Message sent with missing attribute is deleted
138+
assertEquals(0, client.receiveMessage(receiveRequest).getMessages().size());
139+
verify(orphanedMessageHandlerMock).accept(any(), any());
140+
}
111141
}

0 commit comments

Comments
 (0)