Skip to content

Commit 289fa90

Browse files
sergijSergii Kozlovmicossow
authored
Pass sourceQueueName via System Message Attribute for DeadLetterQueueSourceArn (#1086)
* Pass sourceQueueName via System Message Attribute for DeadLetterQueueSourceArn * use dedicated field in Message instead of system attributes --------- Co-authored-by: Sergii Kozlov <[email protected]> Co-authored-by: Michał Ossowski <[email protected]>
1 parent 5918d86 commit 289fa90

File tree

17 files changed

+96
-66
lines changed

17 files changed

+96
-66
lines changed

core/src/main/scala/org/elasticmq/MessageData.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,6 @@ case class MessageData(
1313
messageGroupId: Option[String],
1414
messageDeduplicationId: Option[DeduplicationId],
1515
tracingId: Option[TracingId],
16-
sequenceNumber: Option[String]
16+
sequenceNumber: Option[String],
17+
deadLetterSourceQueueName: Option[String]
1718
)

core/src/main/scala/org/elasticmq/NewMessageData.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@ case class NewMessageData(
44
id: Option[MessageId],
55
content: String,
66
messageAttributes: Map[String, MessageAttribute],
7-
messageSystemAttributes: Map[String, MessageAttribute],
87
nextDelivery: NextDelivery,
98
messageGroupId: Option[String],
109
messageDeduplicationId: Option[DeduplicationId],
1110
orderIndex: Int,
1211
tracingId: Option[TracingId],
13-
sequenceNumber: Option[String]
12+
sequenceNumber: Option[String],
13+
deadLetterSourceQueueName: Option[String]
1414
)

core/src/main/scala/org/elasticmq/actor/queue/InternalMessage.scala

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ case class InternalMessage(
1313
var nextDelivery: Long,
1414
content: String,
1515
messageAttributes: Map[String, MessageAttribute],
16-
messageSystemAttributes: Map[String, MessageAttribute],
1716
created: OffsetDateTime,
1817
orderIndex: Int,
1918
var firstReceive: Received,
@@ -22,7 +21,8 @@ case class InternalMessage(
2221
messageGroupId: Option[String],
2322
messageDeduplicationId: Option[DeduplicationId],
2423
tracingId: Option[TracingId],
25-
sequenceNumber: Option[String]
24+
sequenceNumber: Option[String],
25+
deadLetterSourceQueueName: Option[String]
2626
) extends Comparable[InternalMessage] {
2727

2828
// Priority queues have biggest elements first
@@ -67,21 +67,22 @@ case class InternalMessage(
6767
messageGroupId,
6868
messageDeduplicationId,
6969
tracingId,
70-
sequenceNumber
70+
sequenceNumber,
71+
deadLetterSourceQueueName
7172
)
7273

7374
def toNewMessageData =
7475
NewMessageData(
7576
Some(MessageId(id)),
7677
content,
7778
messageAttributes,
78-
messageSystemAttributes,
7979
MillisNextDelivery(nextDelivery),
8080
messageGroupId,
8181
messageDeduplicationId,
8282
orderIndex,
8383
tracingId,
84-
sequenceNumber
84+
sequenceNumber,
85+
deadLetterSourceQueueName
8586
)
8687

8788
def deliverable(deliveryTime: Long): Boolean = nextDelivery <= deliveryTime
@@ -97,7 +98,6 @@ object InternalMessage {
9798
newMessageData.nextDelivery.toMillis(now, queueData.delay.toMillis).millis,
9899
newMessageData.content,
99100
newMessageData.messageAttributes,
100-
newMessageData.messageSystemAttributes,
101101
OffsetDateTime.now(),
102102
newMessageData.orderIndex,
103103
NeverReceived,
@@ -106,7 +106,8 @@ object InternalMessage {
106106
newMessageData.messageGroupId,
107107
newMessageData.messageDeduplicationId,
108108
newMessageData.tracingId,
109-
newMessageData.sequenceNumber
109+
newMessageData.sequenceNumber,
110+
newMessageData.deadLetterSourceQueueName
110111
)
111112
}
112113

core/src/main/scala/org/elasticmq/actor/queue/QueueActorMessageOps.scala

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,9 @@ trait QueueActorMessageOps
3333
receiveMessages(visibilityTimeout, count, receiveRequestAttemptId).send()
3434
case DeleteMessage(deliveryReceipt) =>
3535
deleteMessage(deliveryReceipt).send()
36-
case LookupMessage(messageId) => messageQueue.getById(messageId.id).map(_.toMessageData)
37-
case MoveMessage(message, destination) => moveMessage(message, destination).send()
36+
case LookupMessage(messageId) => messageQueue.getById(messageId.id).map(_.toMessageData)
37+
case MoveMessage(message, destination, sourceQueueName) =>
38+
moveMessage(message, destination, sourceQueueName).send()
3839
case DeduplicationIdsCleanup =>
3940
fifoMessagesHistory = fifoMessagesHistory.cleanOutdatedMessages(nowProvider)
4041
DoNotReply()

core/src/main/scala/org/elasticmq/actor/queue/operations/MoveMessageOps.scala

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,27 @@ import org.elasticmq.{DeduplicationId, MoveDestination, MoveToDLQ}
88
trait MoveMessageOps extends Logging {
99
this: QueueActorStorage =>
1010

11-
def moveMessage(message: InternalMessage, destination: MoveDestination): ResultWithEvents[Unit] = {
11+
def moveMessage(
12+
message: InternalMessage,
13+
destination: MoveDestination,
14+
sourceQueueName: String
15+
): ResultWithEvents[Unit] = {
1216

13-
copyMessagesToActorRef.foreach { _ ! SendMessage(message.toNewMessageData) }
17+
val messageWithSourceQueueName = message.copy(deadLetterSourceQueueName = Some(sourceQueueName))
18+
copyMessagesToActorRef.foreach { _ ! SendMessage(messageWithSourceQueueName.toNewMessageData) }
1419

1520
destination match {
1621
case MoveToDLQ =>
1722
if (queueData.isFifo) {
18-
CommonOperations.wasRegistered(message.toNewMessageData, fifoMessagesHistory) match {
23+
CommonOperations.wasRegistered(messageWithSourceQueueName.toNewMessageData, fifoMessagesHistory) match {
1924
case Some(_) => ResultWithEvents.empty
2025
case None =>
21-
logger.debug(s"Moved message (${message.id}) from FIFO queue to ${queueData.name}")
22-
moveMessageToQueue(regenerateDeduplicationId(message))
26+
logger.debug(s"Moved message (${messageWithSourceQueueName.id}) from FIFO queue to ${queueData.name}")
27+
moveMessageToQueue(regenerateDeduplicationId(messageWithSourceQueueName))
2328
}
2429
} else {
25-
logger.debug(s"Moved message (${message.id}) to ${queueData.name}")
26-
moveMessageToQueue(message)
30+
logger.debug(s"Moved message (${messageWithSourceQueueName.id}) to ${queueData.name}")
31+
moveMessageToQueue(messageWithSourceQueueName)
2732
}
2833
}
2934
}

core/src/main/scala/org/elasticmq/actor/queue/operations/ReceiveMessageOps.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ trait ReceiveMessageOps extends Logging {
8585
messageQueue.dequeue(count, deliveryTime).map { internalMessage =>
8686
if (queueData.deadLettersQueue.map(_.maxReceiveCount).exists(_ <= internalMessage.receiveCount)) {
8787
logger.debug(s"${queueData.name}: send message $internalMessage to dead letters actor $deadLettersActorRef")
88-
deadLettersActorRef.foreach(_ ! MoveMessage(internalMessage, MoveToDLQ))
88+
deadLettersActorRef.foreach(_ ! MoveMessage(internalMessage, MoveToDLQ, queueData.name))
8989
MessageToDelete(internalMessage)
9090
} else {
9191
MessageToReturn(internalMessage)

core/src/main/scala/org/elasticmq/msg/QueueMsg.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ case class GetQueueStatistics(deliveryTime: Long) extends QueueQueueMsg[QueueSta
4242
case class ClearQueue() extends QueueQueueMsg[Unit]
4343

4444
case class SendMessage(message: NewMessageData) extends QueueMessageMsg[MessageData]
45-
case class MoveMessage(message: InternalMessage, moveDestination: MoveDestination) extends QueueMessageMsg[Unit]
45+
case class MoveMessage(message: InternalMessage, moveDestination: MoveDestination, sourceQueueName: String) extends QueueMessageMsg[Unit]
4646
case class UpdateVisibilityTimeout(deliveryReceipt: DeliveryReceipt, visibilityTimeout: VisibilityTimeout)
4747
extends QueueMessageMsg[Either[InvalidReceiptHandle, Unit]]
4848
case class ReceiveMessages(

core/src/test/scala/org/elasticmq/FifoDeduplicationIdsHistoryTest.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,6 @@ class FifoDeduplicationIdsHistoryTest extends AnyFunSuite with Matchers {
107107
nextDelivery = 100L,
108108
content = "",
109109
messageAttributes = Map.empty,
110-
messageSystemAttributes = Map.empty,
111110
created = created,
112111
orderIndex = 0,
113112
firstReceive = NeverReceived,
@@ -116,7 +115,8 @@ class FifoDeduplicationIdsHistoryTest extends AnyFunSuite with Matchers {
116115
messageGroupId = None,
117116
messageDeduplicationId = maybeDeduplicationId,
118117
tracingId = None,
119-
sequenceNumber = None
118+
sequenceNumber = None,
119+
deadLetterSourceQueueName = None
120120
)
121121

122122
}

core/src/test/scala/org/elasticmq/actor/queue/InternalMessageSpec.scala

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ class InternalMessageSpec extends AnyFunSuite with Matchers {
1818
nextDelivery = 0L,
1919
content = "content",
2020
messageAttributes = Map.empty,
21-
messageSystemAttributes = Map.empty,
2221
created = freezedDateTime,
2322
orderIndex = 100,
2423
firstReceive = NeverReceived,
@@ -27,7 +26,8 @@ class InternalMessageSpec extends AnyFunSuite with Matchers {
2726
messageGroupId = None,
2827
messageDeduplicationId = None,
2928
tracingId = None,
30-
sequenceNumber = None
29+
sequenceNumber = None,
30+
deadLetterSourceQueueName = None
3131
)
3232

3333
val second = first.copy(
@@ -46,7 +46,6 @@ class InternalMessageSpec extends AnyFunSuite with Matchers {
4646
nextDelivery = 0L,
4747
content = "content",
4848
messageAttributes = Map.empty,
49-
messageSystemAttributes = Map.empty,
5049
created = freezedDateTime,
5150
orderIndex = 100,
5251
firstReceive = NeverReceived,
@@ -55,7 +54,8 @@ class InternalMessageSpec extends AnyFunSuite with Matchers {
5554
messageGroupId = None,
5655
messageDeduplicationId = None,
5756
tracingId = None,
58-
sequenceNumber = None
57+
sequenceNumber = None,
58+
deadLetterSourceQueueName = None
5959
)
6060

6161
val second = first.copy(

core/src/test/scala/org/elasticmq/actor/queue/ReceiveRequestAttemptCacheTest.scala

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ class ReceiveRequestAttemptCacheTest extends AnyFunSuite with Matchers {
2323
1L,
2424
"content",
2525
Map.empty,
26-
Map.empty,
2726
nowProvider.now,
2827
orderIndex = 0,
2928
NeverReceived,
@@ -32,7 +31,8 @@ class ReceiveRequestAttemptCacheTest extends AnyFunSuite with Matchers {
3231
messageGroupId = None,
3332
messageDeduplicationId = None,
3433
tracingId = None,
35-
sequenceNumber = None
34+
sequenceNumber = None,
35+
deadLetterSourceQueueName = None
3636
)
3737
val msg2 = msg1.copy(id = "id-2")
3838
val msg3 = msg1.copy(id = "id-3")
@@ -74,7 +74,6 @@ class ReceiveRequestAttemptCacheTest extends AnyFunSuite with Matchers {
7474
1L,
7575
"content",
7676
Map.empty,
77-
Map.empty,
7877
nowProvider.now,
7978
orderIndex = 0,
8079
NeverReceived,
@@ -83,7 +82,8 @@ class ReceiveRequestAttemptCacheTest extends AnyFunSuite with Matchers {
8382
messageGroupId = None,
8483
messageDeduplicationId = None,
8584
tracingId = None,
86-
sequenceNumber = None
85+
sequenceNumber = None,
86+
deadLetterSourceQueueName = None
8787
)
8888
val msg2 = msg1.copy(id = "id-2")
8989
val messageQueue = MessageQueue(isFifo = false)

0 commit comments

Comments
 (0)