-
Notifications
You must be signed in to change notification settings - Fork 111
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
MsmqMessageBuilder supports DeliverBy and MaxAttempts (when it is 1).
- Loading branch information
1 parent
3bc5fbc
commit 5b2191d
Showing
4 changed files
with
205 additions
and
93 deletions.
There are no files selected for viewing
This file was deleted.
Oops, something went wrong.
185 changes: 185 additions & 0 deletions
185
Rhino.ServiceBus.Tests/CanCustomizeOutgoingMessagesWithMsmq.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,185 @@ | ||
using System; | ||
using System.Messaging; | ||
using System.Threading; | ||
using Castle.Core; | ||
using Castle.MicroKernel.Registration; | ||
using Castle.Windsor; | ||
using Castle.Windsor.Configuration.Interpreters; | ||
using Rhino.ServiceBus.Exceptions; | ||
using Rhino.ServiceBus.Impl; | ||
using Rhino.ServiceBus.Internal; | ||
using Rhino.ServiceBus.Msmq; | ||
using Rhino.ServiceBus.Util; | ||
using Xunit; | ||
|
||
namespace Rhino.ServiceBus.Tests | ||
{ | ||
public class CanCustomizeOutgoingMessagesWithMsmq : MsmqTestBase | ||
{ | ||
[Fact] | ||
public void it_should_add_custom_header_to_headers_collection_for_normal_messages() | ||
{ | ||
using (var container = new WindsorContainer()) | ||
{ | ||
container.Register(Component.For<ICustomizeOutgoingMessages>().ImplementedBy<AppIdentityCustomizer>().LifeStyle.Is(LifestyleType.Transient)); | ||
new RhinoServiceBusConfiguration() | ||
.UseCastleWindsor(container) | ||
.Configure(); | ||
var builder = container.Resolve<IMessageBuilder<Message>>(); | ||
Message afterBuild = null; | ||
builder.MessageBuilt += msg => afterBuild = msg; | ||
|
||
using (var bus = container.Resolve<IStartableServiceBus>()) | ||
{ | ||
bus.Start(); | ||
bus.Send(bus.Endpoint, "testmessage"); | ||
} | ||
Assert.NotNull(afterBuild); | ||
var headers = afterBuild.Extension.DeserializeHeaders(); | ||
Assert.Equal("corey", headers["user-id"]); | ||
} | ||
} | ||
|
||
[Fact] | ||
public void it_should_add_custom_header_to_headers_collection_for_delayed_messages() | ||
{ | ||
using (var container = new WindsorContainer(new XmlInterpreter())) | ||
{ | ||
container.Register(Component.For<ICustomizeOutgoingMessages>().ImplementedBy<AppIdentityCustomizer>().LifeStyle.Is(LifestyleType.Transient)); | ||
new RhinoServiceBusConfiguration() | ||
.UseCastleWindsor(container) | ||
.Configure(); | ||
var transport = container.Resolve<ITransport>(); | ||
MsmqCurrentMessageInformation currentMessageInformation = null; | ||
var waitHandle = new ManualResetEvent(false); | ||
transport.MessageArrived += messageInfo => | ||
{ | ||
currentMessageInformation = (MsmqCurrentMessageInformation) messageInfo; | ||
waitHandle.Set(); | ||
return true; | ||
}; | ||
var builder = container.Resolve<IMessageBuilder<Message>>(); | ||
Message afterBuild = null; | ||
builder.MessageBuilt += msg => afterBuild = msg; | ||
|
||
using (var bus = container.Resolve<IStartableServiceBus>()) | ||
{ | ||
bus.Start(); | ||
DateTime beforeSend = DateTime.Now; | ||
bus.DelaySend(bus.Endpoint, DateTime.Now.AddMilliseconds(250), "testmessage"); | ||
waitHandle.WaitOne(TimeSpan.FromSeconds(30)); | ||
Assert.True((DateTime.Now - beforeSend).TotalMilliseconds >= 250); | ||
} | ||
Assert.NotNull(afterBuild); | ||
var headers = afterBuild.Extension.DeserializeHeaders(); | ||
Assert.Equal("corey", headers["user-id"]); | ||
Assert.Equal("corey", currentMessageInformation.Headers["user-id"]); | ||
} | ||
} | ||
|
||
[Fact] | ||
public void TimeToReachQueue_is_set_when_DeliverBy_is_specified() | ||
{ | ||
using (var container = new WindsorContainer()) | ||
{ | ||
container.Register(Component.For<ICustomizeOutgoingMessages>() | ||
.ImplementedBy<DeliverByCustomizer>() | ||
.LifeStyle.Is(LifestyleType.Transient)); | ||
new RhinoServiceBusConfiguration() | ||
.UseCastleWindsor(container) | ||
.Configure(); | ||
var builder = container.Resolve<IMessageBuilder<Message>>(); | ||
Message afterBuild = null; | ||
builder.MessageBuilt += msg => afterBuild = msg; | ||
|
||
using (var bus = container.Resolve<IStartableServiceBus>()) | ||
{ | ||
bus.Start(); | ||
bus.Send(bus.Endpoint, "testmessage"); | ||
} | ||
|
||
Assert.NotNull(afterBuild); | ||
Assert.NotEqual(Message.InfiniteTimeout, afterBuild.TimeToReachQueue); | ||
} | ||
} | ||
|
||
[Fact] | ||
public void TimeToReachQueue_is_set_when_MaxAttempts_is_one() | ||
{ | ||
using (var container = new WindsorContainer()) | ||
{ | ||
container.Register(Component.For<ICustomizeOutgoingMessages>() | ||
.ImplementedBy<MaxAttemptCustomizer>() | ||
.LifeStyle.Is(LifestyleType.Transient)); | ||
new RhinoServiceBusConfiguration() | ||
.UseCastleWindsor(container) | ||
.Configure(); | ||
var builder = container.Resolve<IMessageBuilder<Message>>(); | ||
Message afterBuild = null; | ||
builder.MessageBuilt += msg => afterBuild = msg; | ||
|
||
using (var bus = container.Resolve<IStartableServiceBus>()) | ||
{ | ||
bus.Start(); | ||
bus.Send(bus.Endpoint, "testmessage"); | ||
} | ||
|
||
Assert.NotNull(afterBuild); | ||
Assert.Equal(TimeSpan.Zero, afterBuild.TimeToReachQueue); | ||
} | ||
} | ||
|
||
[Fact] | ||
public void Throws_when_MaxAttempts_is_greater_than_one() | ||
{ | ||
using (var container = new WindsorContainer()) | ||
{ | ||
MaxAttemptCustomizer.MaxAttempts = 2; | ||
container.Register(Component.For<ICustomizeOutgoingMessages>() | ||
.ImplementedBy<MaxAttemptCustomizer>() | ||
.LifeStyle.Is(LifestyleType.Transient)); | ||
new RhinoServiceBusConfiguration() | ||
.UseCastleWindsor(container) | ||
.Configure(); | ||
var builder = container.Resolve<IMessageBuilder<Message>>(); | ||
Message afterBuild = null; | ||
builder.MessageBuilt += msg => afterBuild = msg; | ||
|
||
using (var bus = container.Resolve<IStartableServiceBus>()) | ||
{ | ||
bus.Start(); | ||
|
||
Assert.Throws<InvalidUsageException>(() => | ||
{ | ||
bus.Send(bus.Endpoint, "testmessage"); | ||
}); | ||
} | ||
} | ||
} | ||
|
||
public class AppIdentityCustomizer : ICustomizeOutgoingMessages | ||
{ | ||
public void Customize(OutgoingMessageInformation messageInformation) | ||
{ | ||
messageInformation.Headers.Add("user-id", "corey"); | ||
} | ||
} | ||
|
||
public class DeliverByCustomizer : ICustomizeOutgoingMessages | ||
{ | ||
public void Customize(OutgoingMessageInformation messageInformation) | ||
{ | ||
messageInformation.DeliverBy = DateTime.Now.AddMinutes(1); | ||
} | ||
} | ||
|
||
public class MaxAttemptCustomizer : ICustomizeOutgoingMessages | ||
{ | ||
public static int MaxAttempts = 1; | ||
public void Customize(OutgoingMessageInformation messageInformation) | ||
{ | ||
messageInformation.MaxAttempts = MaxAttempts; | ||
} | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters