Skip to content

Commit

Permalink
#2: Embedding the id in the delivery receipt
Browse files Browse the repository at this point in the history
  • Loading branch information
adamw committed Dec 6, 2012
1 parent 4e567d8 commit 8355ed0
Show file tree
Hide file tree
Showing 5 changed files with 27 additions and 5 deletions.
6 changes: 5 additions & 1 deletion api/src/main/scala/org/elasticmq/Message.scala
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,15 @@ sealed case class MessageId(id: String) {
}

sealed case class DeliveryReceipt(receipt: String) {
def extractId: MessageId = MessageId(receipt.split(DeliveryReceipt.Separator)(0))

override def toString = receipt
}

object DeliveryReceipt {
def generate = new DeliveryReceipt(UUID.randomUUID().toString)
private val Separator = "#"

def generate(id: MessageId) = new DeliveryReceipt(id + Separator + UUID.randomUUID().toString)
}

case class MessageBuilder private (content: String, id: Option[MessageId], nextDelivery: NextDelivery) {
Expand Down
17 changes: 17 additions & 0 deletions api/src/test/scala/org/elasticmq/DeliveryReceiptTest.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package org.elasticmq

import org.scalatest.matchers.MustMatchers
import org.scalatest.FunSuite

class DeliveryReceiptTest extends FunSuite with MustMatchers {
test("should extract id") {
// Given
val id = MessageId("123-781-abc-def")

// When
val receipt = DeliveryReceipt.generate(id)

// Then
receipt.extractId must be (id)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -73,13 +73,14 @@ class InMemoryMessagesStorage(queueName: String, statistics: InMemoryMessageStat
receiveMessage(deliveryTime, newNextDelivery)
}
case NextDeliveryUnchanged => {
val id = MessageId(message.id)
if (message.nextDelivery.get() > deliveryTime) {
// Putting the message back. That's the youngest message, so there is no message that can be received.
messageQueue.add(message)
None
} else if (messagesById.contains(MessageId(message.id))) {
} else if (messagesById.contains(id)) {
// Putting the message again into the queue, with a new next delivery
message.deliveryReceipt.set(Some(DeliveryReceipt.generate.receipt))
message.deliveryReceipt.set(Some(DeliveryReceipt.generate(id).receipt))
message.nextDelivery.set(newNextDelivery.millis)
messageQueue.add(message)

Expand Down
2 changes: 1 addition & 1 deletion project/Build.scala
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ object ElasticMQBuild extends Build {
"elasticmq-api",
file("api"),
settings = buildSettings ++ Seq(libraryDependencies ++= Seq(jodaTime, jodaConvert))
)
) dependsOn(commonTest % "test")

lazy val spi: Project = Project(
"elasticmq-spi",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ trait SquerylMessagesStorageModule {

private def updateNextDelivery(message: MessageData, nextDelivery: MillisNextDelivery) = {
inTransaction {
val deliveryReceipt = DeliveryReceipt.generate
val deliveryReceipt = DeliveryReceipt.generate(message.id)

val updatedCount = update(messages)(m =>
where(m.id === message.id.id and m.nextDelivery === message.nextDelivery.millis)
Expand Down

0 comments on commit 8355ed0

Please sign in to comment.