public void TestReceiveRollback()
{
IMessage[] outbound = new IMessage[] {
session.CreateTextMessage("First IMessage"),
session.CreateTextMessage("Second IMessage")};
// lets consume any outstanding messages from prev test runs
BeginTx();
bool needCommit = false;
while(consumer.ReceiveNoWait() != null)
{
needCommit = true;
}
if(needCommit)
{
CommitTx();
}
// sent both messages
BeginTx();
producer.Send(outbound[0]);
producer.Send(outbound[1]);
CommitTx();
LinkedList<IMessage> messages = new LinkedList<IMessage>();
BeginTx();
IMessage message = consumer.Receive(TimeSpan.FromMilliseconds(1000));
Assert.IsNotNull(message);
messages.AddLast(message);
AssertEquals(outbound[0], message);
CommitTx();
// Rollback so we can get that last message again.
BeginTx();
message = consumer.Receive(TimeSpan.FromMilliseconds(1000));
Assert.IsNotNull(message);
AssertEquals(outbound[1], message);
RollbackTx();
// Consume again.. the prev message should
// get redelivered.
BeginTx();
message = consumer.Receive(TimeSpan.FromMilliseconds(5000));
Assert.IsNotNull(message, "Should have re-received the message again!");
messages.AddLast(message);
CommitTx();
IMessage[] inbound = new IMessage[messages.Count];
messages.CopyTo(inbound, 0);
AssertTextMessagesEqual(outbound, inbound, "Rollback did not work.");
}