Skip to content

Commit 742b436

Browse files
committed
use dedicated field in Message instead of system attributes
1 parent c2aa609 commit 742b436

File tree

15 files changed

+80
-72
lines changed

15 files changed

+80
-72
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@ case class MessageData(
77
deliveryReceipt: Option[DeliveryReceipt],
88
content: String,
99
messageAttributes: Map[String, MessageAttribute],
10-
messageSystemAttributes: Map[String, MessageAttribute],
1110
nextDelivery: MillisNextDelivery,
1211
created: OffsetDateTime,
1312
statistics: MessageStatistics,
1413
messageGroupId: Option[String],
1514
messageDeduplicationId: Option[DeduplicationId],
1615
tracingId: Option[TracingId],
17-
sequenceNumber: Option[String]
16+
sequenceNumber: Option[String],
17+
deadLetterSourceQueueName: Option[String]
1818
)
Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
11
package org.elasticmq
22

3-
import scala.collection.mutable
4-
53
case class NewMessageData(
64
id: Option[MessageId],
75
content: String,
86
messageAttributes: Map[String, MessageAttribute],
9-
messageSystemAttributes: Map[String, MessageAttribute],
107
nextDelivery: NextDelivery,
118
messageGroupId: Option[String],
129
messageDeduplicationId: Option[DeduplicationId],
1310
orderIndex: Int,
1411
tracingId: Option[TracingId],
15-
sequenceNumber: Option[String]
12+
sequenceNumber: Option[String],
13+
deadLetterSourceQueueName: Option[String]
1614
)

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

Lines changed: 8 additions & 8 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: mutable.HashMap[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
@@ -61,28 +61,28 @@ case class InternalMessage(
6161
deliveryReceipts.lastOption.map(DeliveryReceipt(_)),
6262
content,
6363
messageAttributes,
64-
messageSystemAttributes.to(Map),
6564
MillisNextDelivery(nextDelivery),
6665
created,
6766
MessageStatistics(firstReceive, receiveCount),
6867
messageGroupId,
6968
messageDeduplicationId,
7069
tracingId,
71-
sequenceNumber
70+
sequenceNumber,
71+
deadLetterSourceQueueName
7272
)
7373

7474
def toNewMessageData =
7575
NewMessageData(
7676
Some(MessageId(id)),
7777
content,
7878
messageAttributes,
79-
messageSystemAttributes.to(Map),
8079
MillisNextDelivery(nextDelivery),
8180
messageGroupId,
8281
messageDeduplicationId,
8382
orderIndex,
8483
tracingId,
85-
sequenceNumber
84+
sequenceNumber,
85+
deadLetterSourceQueueName
8686
)
8787

8888
def deliverable(deliveryTime: Long): Boolean = nextDelivery <= deliveryTime
@@ -98,7 +98,6 @@ object InternalMessage {
9898
newMessageData.nextDelivery.toMillis(now, queueData.delay.toMillis).millis,
9999
newMessageData.content,
100100
newMessageData.messageAttributes,
101-
newMessageData.messageSystemAttributes.to(mutable.HashMap),
102101
OffsetDateTime.now(),
103102
newMessageData.orderIndex,
104103
NeverReceived,
@@ -107,7 +106,8 @@ object InternalMessage {
107106
newMessageData.messageGroupId,
108107
newMessageData.messageDeduplicationId,
109108
newMessageData.tracingId,
110-
newMessageData.sequenceNumber
109+
newMessageData.sequenceNumber,
110+
newMessageData.deadLetterSourceQueueName
111111
)
112112
}
113113

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, sourceQueueName) => moveMessage(message, destination, sourceQueueName).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: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,28 +3,32 @@ package org.elasticmq.actor.queue.operations
33
import org.elasticmq.actor.queue.{InternalMessage, QueueActorStorage, QueueEvent}
44
import org.elasticmq.msg.SendMessage
55
import org.elasticmq.util.Logging
6-
import org.elasticmq.{DeduplicationId, MoveDestination, MoveToDLQ, StringMessageAttribute}
6+
import org.elasticmq.{DeduplicationId, MoveDestination, MoveToDLQ}
77

88
trait MoveMessageOps extends Logging {
99
this: QueueActorStorage =>
1010

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

13-
message.messageSystemAttributes.put("sourceQueueName", StringMessageAttribute(sourceQueueName))
14-
copyMessagesToActorRef.foreach { _ ! SendMessage(message.toNewMessageData) }
17+
val messageWithSourceQueueName = message.copy(deadLetterSourceQueueName = Some(sourceQueueName))
18+
copyMessagesToActorRef.foreach { _ ! SendMessage(messageWithSourceQueueName.toNewMessageData) }
1519

1620
destination match {
1721
case MoveToDLQ =>
1822
if (queueData.isFifo) {
19-
CommonOperations.wasRegistered(message.toNewMessageData, fifoMessagesHistory) match {
23+
CommonOperations.wasRegistered(messageWithSourceQueueName.toNewMessageData, fifoMessagesHistory) match {
2024
case Some(_) => ResultWithEvents.empty
2125
case None =>
22-
logger.debug(s"Moved message (${message.id}) from FIFO queue to ${queueData.name}")
23-
moveMessageToQueue(regenerateDeduplicationId(message))
26+
logger.debug(s"Moved message (${messageWithSourceQueueName.id}) from FIFO queue to ${queueData.name}")
27+
moveMessageToQueue(regenerateDeduplicationId(messageWithSourceQueueName))
2428
}
2529
} else {
26-
logger.debug(s"Moved message (${message.id}) to ${queueData.name}")
27-
moveMessageToQueue(message)
30+
logger.debug(s"Moved message (${messageWithSourceQueueName.id}) to ${queueData.name}")
31+
moveMessageToQueue(messageWithSourceQueueName)
2832
}
2933
}
3034
}

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 = mutable.HashMap.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 = mutable.HashMap.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 = mutable.HashMap.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-
mutable.HashMap.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-
mutable.HashMap.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)

core/src/test/scala/org/elasticmq/actor/test/DataCreationHelpers.scala

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ trait DataCreationHelpers {
3535
id: String,
3636
content: String,
3737
messageAttributes: Map[String, MessageAttribute],
38-
messageSystemAttributes: Map[String, MessageAttribute],
3938
nextDelivery: MillisNextDelivery,
4039
deliveryReceipt: Option[DeliveryReceipt] = None,
4140
messageGroupId: Option[String] = None,
@@ -47,14 +46,14 @@ trait DataCreationHelpers {
4746
deliveryReceipt,
4847
content,
4948
messageAttributes,
50-
messageSystemAttributes,
5149
nextDelivery,
5250
OffsetDateTimeUtil.ofEpochMilli(0),
5351
MessageStatistics(NeverReceived, 0),
5452
messageGroupId,
5553
messageDeduplicationId,
5654
tracingId,
57-
None
55+
sequenceNumber = None,
56+
deadLetterSourceQueueName = None
5857
)
5958

6059
def createNewMessageData(
@@ -70,26 +69,26 @@ trait DataCreationHelpers {
7069
Some(MessageId(id)),
7170
content,
7271
messageAttributes,
73-
Map.empty,
7472
nextDelivery,
7573
messageGroupId,
7674
messageDeduplicationId,
7775
orderIndex = 0,
7876
tracingId,
79-
None
77+
sequenceNumber = None,
78+
deadLetterSourceQueueName = None
8079
)
8180

8281
def createNewMessageData(messageData: MessageData) =
8382
NewMessageData(
8483
Some(messageData.id),
8584
messageData.content,
8685
messageData.messageAttributes,
87-
Map.empty,
8886
messageData.nextDelivery,
8987
messageData.messageGroupId,
9088
messageData.messageDeduplicationId,
9189
orderIndex = 0,
9290
messageData.tracingId,
93-
messageData.sequenceNumber
91+
messageData.sequenceNumber,
92+
messageData.deadLetterSourceQueueName
9493
)
9594
}

persistence/persistence-sql/src/main/scala/org/elasticmq/persistence/sql/DBMessage.scala

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@ import org.elasticmq.util.OffsetDateTimeUtil
77
import scalikejdbc.WrappedResultSet
88
import spray.json._
99

10-
import scala.collection.mutable
11-
1210
case class DBMessage(
1311
messageId: String,
1412
deliveryReceipts: Array[Byte],
@@ -21,7 +19,8 @@ case class DBMessage(
2119
groupId: Option[String],
2220
deduplicationId: Option[String],
2321
tracingId: Option[String],
24-
sequenceNumber: Option[String]
22+
sequenceNumber: Option[String],
23+
deadLetterSourceQueueName: Option[String]
2524
) {
2625

2726
def toInternalMessage: InternalMessage = {
@@ -50,7 +49,6 @@ case class DBMessage(
5049
nextDelivery,
5150
new String(content),
5251
serializedAttrs,
53-
mutable.HashMap.empty,
5452
OffsetDateTimeUtil.ofEpochMilli(created),
5553
orderIndex = 0,
5654
firstReceive,
@@ -59,7 +57,8 @@ case class DBMessage(
5957
groupId,
6058
deduplicationId.map(id => DeduplicationId(id)),
6159
tracingId.map(TracingId.apply),
62-
sequenceNumber
60+
sequenceNumber,
61+
deadLetterSourceQueueName
6362
)
6463
}
6564
}
@@ -78,7 +77,8 @@ object DBMessage {
7877
rs.stringOpt("group_id"),
7978
rs.stringOpt("deduplication_id"),
8079
rs.stringOpt("tracing_id"),
81-
rs.stringOpt("sequence_number")
80+
rs.stringOpt("sequence_number"),
81+
rs.stringOpt("dead_letter_source_queue_name")
8282
)
8383

8484
def from(message: InternalMessage): DBMessage = {
@@ -113,7 +113,8 @@ object DBMessage {
113113
message.messageGroupId,
114114
deduplicationId,
115115
message.tracingId.map(_.id),
116-
message.sequenceNumber
116+
message.sequenceNumber,
117+
message.deadLetterSourceQueueName
117118
)
118119
}
119120
}

persistence/persistence-sql/src/main/scala/org/elasticmq/persistence/sql/MessageRepository.scala

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ class MessageRepository(queueName: String, db: DB) extends Logging {
3030
group_id varchar,
3131
deduplication_id varchar,
3232
tracing_id varchar,
33-
sequence_number varchar
33+
sequence_number varchar,
34+
dead_letter_source_queue_name varchar
3435
)""".execute.apply()
3536

3637
def drop(): Unit = {
@@ -50,7 +51,7 @@ class MessageRepository(queueName: String, db: DB) extends Logging {
5051
def add(internalMessage: InternalMessage): Int = {
5152
val message = DBMessage.from(internalMessage)
5253
sql"""insert into $tableName
53-
(message_id, delivery_receipts, next_delivery, content, attributes, created, received, receive_count, group_id, deduplication_id, tracing_id, sequence_number)
54+
(message_id, delivery_receipts, next_delivery, content, attributes, created, received, receive_count, group_id, deduplication_id, tracing_id, sequence_number, dead_letter_source_queue_name)
5455
values (${message.messageId},
5556
${message.deliveryReceipts},
5657
${message.nextDelivery},
@@ -62,7 +63,8 @@ class MessageRepository(queueName: String, db: DB) extends Logging {
6263
${message.groupId},
6364
${message.deduplicationId},
6465
${message.tracingId},
65-
${message.sequenceNumber})""".update.apply()
66+
${message.sequenceNumber},
67+
${message.deadLetterSourceQueueName})""".update.apply()
6668
}
6769

6870
def update(internalMessage: InternalMessage): Int = {
@@ -74,7 +76,8 @@ class MessageRepository(queueName: String, db: DB) extends Logging {
7476
received = ${message.received},
7577
receive_count = ${message.receiveCount},
7678
tracing_id = ${message.tracingId},
77-
sequence_number = ${message.sequenceNumber}
79+
sequence_number = ${message.sequenceNumber},
80+
dead_letter_source_queue_name = ${message.deadLetterSourceQueueName}
7881
where message_id = ${message.messageId}""".update.apply()
7982
}
8083

0 commit comments

Comments
 (0)