Skip to content

Commit

Permalink
Added QueuePerInstance support
Browse files Browse the repository at this point in the history
  • Loading branch information
yvesgoeleven committed Aug 20, 2011
1 parent 1da570a commit b1d9b57
Show file tree
Hide file tree
Showing 9 changed files with 110 additions and 8 deletions.
Binary file modified Samples/AzureFullDuplex/AzureFullDuplex.suo
Binary file not shown.
7 changes: 4 additions & 3 deletions Samples/AzureFullDuplex/OrderWebSite/Global.asax.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,11 @@ protected void Application_BeginRequest(object sender, EventArgs e)
.Log4Net(new AzureAppender())
.AzureConfigurationSource()
.AzureMessageQueue()
.JsonSerializer()
.JsonSerializer()
.QueuePerInstance()
.UnicastBus()
.LoadMessageHandlers()
.IsTransactional(true)
.LoadMessageHandlers()
.IsTransactional(true)
.CreateBus();

Bus = StartBus.Value;
Expand Down
10 changes: 5 additions & 5 deletions Samples/AzurePubSub/OrderWebSite/Global.asax.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,12 +36,12 @@ protected void Application_Start(object sender, EventArgs e)
//.Log4Net(new AzureAppender())
.AzureConfigurationSource()
.AzureMessageQueue()
.JsonSerializer()
.JsonSerializer()
.QueuePerInstance()
.UnicastBus()
.LoadMessageHandlers()
.IsTransactional(true)
.CreateBus()
;
.LoadMessageHandlers()
.IsTransactional(true)
.CreateBus();
}

protected void Application_BeginRequest(object sender, EventArgs e)
Expand Down
1 change: 1 addition & 0 deletions Samples/AzureThumbnailCreator/WebSite/Global.asax.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ protected void Application_BeginRequest(object sender, EventArgs e)
.AzureConfigurationSource()
.AzureMessageQueue()
.JsonSerializer()
.QueuePerInstance()
.AzureDataBus()
.UnicastBus()
.LoadMessageHandlers()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,5 +82,18 @@ public int BatchSize
this["BatchSize"] = value;
}
}

[ConfigurationProperty("QueuePerInstance", IsRequired = false, DefaultValue = AzureMessageQueue.DefaultQueuePerInstance)]
public bool QueuePerInstance
{
get
{
return (bool)this["QueuePerInstance"];
}
set
{
this["QueuePerInstance"] = value;
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@ public static Configure AzureMessageQueue(this Configure config)
{
queueClient = CloudStorageAccount.Parse(configSection.ConnectionString).CreateCloudQueueClient();
Address.OverrideDefaultMachine(configSection.ConnectionString);

if (configSection.QueuePerInstance)
Configure.Instance.CustomConfigurationSource(new IndividualQueueConfigurationSource(Configure.ConfigurationSource));
}
else
{
Expand Down Expand Up @@ -109,5 +112,18 @@ public static Configure BatchSize(this Configure config, int value)

return config;
}

/// <summary>
/// Configures a queue per instance
/// </summary>
/// <param name="config"></param>
/// <returns></returns>
public static Configure QueuePerInstance(this Configure config)
{
if(! (Configure.ConfigurationSource is IndividualQueueConfigurationSource))
Configure.Instance.CustomConfigurationSource(new IndividualQueueConfigurationSource(Configure.ConfigurationSource));

return config;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
using Microsoft.WindowsAzure.ServiceRuntime;
using NServiceBus.Config.ConfigurationSource;

namespace NServiceBus.Config
{
public class IndividualQueueConfigurationSource : IConfigurationSource
{
private readonly IConfigurationSource innerSource;

public IndividualQueueConfigurationSource(IConfigurationSource innerSource)
{
this.innerSource = innerSource;
}

T IConfigurationSource.GetConfiguration<T>()
{
var config = innerSource.GetConfiguration<T>();

var unicastBusConfig = config as UnicastBusConfig;
if (unicastBusConfig != null && unicastBusConfig.LocalAddress != null && RoleEnvironment.IsAvailable)
{
var individualQueueName = ParseQueueNameFrom(unicastBusConfig.LocalAddress)
+ "-"
+ ParseIndexFrom(RoleEnvironment.CurrentRoleInstance.Id);
if (unicastBusConfig.LocalAddress.Contains("@"))
individualQueueName += "@" + ParseMachineNameFrom(unicastBusConfig.LocalAddress);

unicastBusConfig.LocalAddress = individualQueueName;
}

var msmqTransportConfig = config as MsmqTransportConfig;
if (msmqTransportConfig != null && msmqTransportConfig.InputQueue != null && RoleEnvironment.IsAvailable)
{
var individualQueueName = ParseQueueNameFrom(msmqTransportConfig.InputQueue)
+ "-"
+ ParseIndexFrom(RoleEnvironment.CurrentRoleInstance.Id);
if (msmqTransportConfig.InputQueue.Contains("@"))
individualQueueName += "@" + ParseMachineNameFrom(msmqTransportConfig.InputQueue);

msmqTransportConfig.InputQueue = individualQueueName;
}

return config;
}

private string ParseMachineNameFrom(string inputQueue)
{
return inputQueue.Contains("@") ? inputQueue.Substring(inputQueue.IndexOf("@") + 1) : string.Empty;
}

private object ParseQueueNameFrom(string inputQueue)
{
return inputQueue.Contains("@") ? inputQueue.Substring(0, inputQueue.IndexOf("@")) : inputQueue;
}

private static int ParseIndexFrom(string id)
{
var idArray = id.Split('.');
int index;
if (!int.TryParse((idArray[idArray.Length - 1]), out index))
{
idArray = id.Split('_');
index = int.Parse((idArray[idArray.Length - 1]));
}
return index;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Microsoft.CSharp" />
<Reference Include="Microsoft.WindowsAzure.ServiceRuntime, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\lib\Azure\Microsoft.WindowsAzure.ServiceRuntime.dll</HintPath>
Expand Down Expand Up @@ -59,6 +60,7 @@
</Compile>
<Compile Include="AzureQueueConfig.cs" />
<Compile Include="ConfigureAzureMessageQueue.cs" />
<Compile Include="IndividualQueueConfigurationSource.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ public class AzureMessageQueue : IReceiveMessages,ISendMessages
public const int DefaultBatchSize = 10;
public const bool DefaultPurgeOnStartup = false;
public const string DefaultConnectionString = "UseDevelopmentStorage=true";
public const bool DefaultQueuePerInstance = false;

private CloudQueue queue;
private readonly CloudQueueClient client;
Expand Down

0 comments on commit b1d9b57

Please sign in to comment.