Skip to content
This repository was archived by the owner on Sep 2, 2021. It is now read-only.

Commit 63ba214

Browse files
Scooletztimbussmann
authored andcommitted
Reduced public API (#13)
* All types made internal with only two public extension methods to configure the routing. * Endpoint based integration tests covering usage the default file and a file with a custom name * Cleaned up AssemblyInfo * Added warn logging when trying to configure filed-based routing when transport uses native routing. * add extensions postfix * make class internal
1 parent 2cb3fc7 commit 63ba214

13 files changed

Lines changed: 188 additions & 29 deletions

EndpointA/Program.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ static async Task AsyncMain()
2525
routingConfig.RegisterPublisher(typeof(DemoCommandReceived), "endpointB");
2626
routingConfig.InstanceMappingFile().FilePath("instance-mapping.xml");
2727

28-
endpointConfiguration.EnableFeature<FileBasedRoutingFeature>();
28+
endpointConfiguration.EnableFileBasedRouting();
2929

3030
var endpoint = await Endpoint.Start(endpointConfiguration);
3131

EndpointB/Configuration.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public static async Task Start(string discriminator)
1919
var routingConfig = endpointConfiguration.UseTransport<MsmqTransport>().Routing();
2020
routingConfig.RegisterPublisher(typeof(DemoEvent), "endpointA");
2121

22-
endpointConfiguration.EnableFeature<FileBasedRoutingFeature>();
22+
endpointConfiguration.EnableFileBasedRouting();
2323

2424
var endpoint = await Endpoint.Start(endpointConfiguration);
2525

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
using System;
2+
using System.IO;
3+
using System.Reflection;
4+
using System.Threading.Tasks;
5+
using NServiceBus.Configuration.AdvanceExtensibility;
6+
using NServiceBus.FileBasedRouting.Tests.Contracts.Commands;
7+
using NServiceBus.Routing;
8+
using NUnit.Framework;
9+
10+
namespace NServiceBus.FileBasedRouting.Tests
11+
{
12+
public class EndpointBasedIntegrationTests
13+
{
14+
const string XmlA = @"
15+
<endpoints>
16+
<endpoint name=""EndpointName"">
17+
<handles>
18+
<command type = ""NServiceBus.FileBasedRouting.Tests.Contracts.Commands.A, NServiceBus.FileBasedRouting.Tests.Contracts"" />
19+
</handles>
20+
</endpoint>
21+
</endpoints>
22+
";
23+
const string XmlB = @"
24+
<endpoints>
25+
<endpoint name=""EndpointName"">
26+
<handles>
27+
<command type = ""NServiceBus.FileBasedRouting.Tests.Contracts.Commands.B, NServiceBus.FileBasedRouting.Tests.Contracts"" />
28+
</handles>
29+
</endpoint>
30+
</endpoints>
31+
";
32+
const string EndpointName = "EndpointName";
33+
34+
[Test]
35+
public async Task Should_read_default_file()
36+
{
37+
using (Use("endpoints.xml", XmlA))
38+
{
39+
var routing = await GetRouting(null);
40+
41+
var routeA = routing(typeof(A));
42+
Assert.AreEqual(EndpointName, routeA.Endpoint);
43+
44+
var routeB = routing(typeof(B));
45+
Assert.IsNull(routeB);
46+
}
47+
}
48+
49+
[Test]
50+
public async Task Should_read_custom_file()
51+
{
52+
const string name = "custom.xml";
53+
using (Use(name, XmlB))
54+
{
55+
var routing = await GetRouting(name);
56+
57+
var routeA = routing(typeof(A));
58+
Assert.IsNull(routeA);
59+
60+
var routeB = routing(typeof(B));
61+
Assert.AreEqual(EndpointName, routeB.Endpoint);
62+
}
63+
}
64+
65+
static async Task<Func<Type,UnicastRoute>> GetRouting(string filePath)
66+
{
67+
var endpointConfiguration = new EndpointConfiguration("test");
68+
endpointConfiguration.UsePersistence<InMemoryPersistence>();
69+
endpointConfiguration.SendFailedMessagesTo("error");
70+
endpointConfiguration.UseTransport<MsmqTransport>();
71+
72+
if (filePath == null)
73+
{
74+
endpointConfiguration.EnableFileBasedRouting();
75+
}
76+
else
77+
{
78+
endpointConfiguration.EnableFileBasedRouting(filePath);
79+
}
80+
81+
await Endpoint.Create(endpointConfiguration); // to init all features
82+
var routingTable = endpointConfiguration.GetSettings().Get<UnicastRoutingTable>();
83+
var getRouteFor = typeof(UnicastRoutingTable).GetMethod("GetRouteFor",
84+
BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
85+
86+
return t => (UnicastRoute) getRouteFor.Invoke(routingTable, new object[] {t});
87+
}
88+
89+
static IDisposable Use(string fileName, string xml)
90+
{
91+
// the feature uses the relative path
92+
var file = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, fileName);
93+
File.WriteAllText(file, xml);
94+
95+
return new Disposable(() => File.Delete(file));
96+
}
97+
98+
class Disposable : IDisposable
99+
{
100+
readonly Action dispose;
101+
102+
public Disposable(Action dispose)
103+
{
104+
this.dispose = dispose;
105+
}
106+
107+
public void Dispose()
108+
{
109+
dispose();
110+
}
111+
}
112+
}
113+
}

NServiceBus.FileBasedRouting.Tests/NServiceBus.FileBasedRouting.Tests.csproj

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@
3030
<WarningLevel>4</WarningLevel>
3131
</PropertyGroup>
3232
<ItemGroup>
33+
<Reference Include="NServiceBus.Core, Version=6.0.0.0, Culture=neutral, PublicKeyToken=9fc386479f8a226c, processorArchitecture=MSIL">
34+
<HintPath>..\packages\NServiceBus.6.1.0-alpha0115\lib\net452\NServiceBus.Core.dll</HintPath>
35+
<Private>True</Private>
36+
</Reference>
3337
<Reference Include="nunit.framework, Version=3.5.0.0, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL">
3438
<HintPath>..\packages\NUnit.3.5.0\lib\net45\nunit.framework.dll</HintPath>
3539
<Private>True</Private>
@@ -44,6 +48,7 @@
4448
<Reference Include="System.Xml" />
4549
</ItemGroup>
4650
<ItemGroup>
51+
<Compile Include="EndpointBasedIntegrationTests.cs" />
4752
<Compile Include="XmlRoutingFileAccessTests.cs" />
4853
<Compile Include="XmlRoutingFileTests.cs" />
4954
</ItemGroup>
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<packages>
3+
<package id="NServiceBus" version="6.1.0-alpha0115" targetFramework="net46" />
34
<package id="NUnit" version="3.5.0" targetFramework="net46" />
45
</packages>

NServiceBus.FileBasedRouting/EndpointRoutingConfiguration.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
namespace NServiceBus.FileBasedRouting
44
{
5-
public class EndpointRoutingConfiguration
5+
class EndpointRoutingConfiguration
66
{
77
public string LogicalEndpointName { get; set; }
88

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
using NServiceBus.Configuration.AdvanceExtensibility;
2+
3+
namespace NServiceBus.FileBasedRouting
4+
{
5+
public static class FileBasedRoutingConfigExtensions
6+
{
7+
/// <summary>
8+
/// Enables routing configured with the routing configuration file.
9+
/// </summary>
10+
/// <param name="config">The configuration object.</param>
11+
public static void EnableFileBasedRouting(this EndpointConfiguration config)
12+
{
13+
config.EnableFeature<FileBasedRoutingFeature>();
14+
}
15+
16+
/// <summary>
17+
/// Enables routing configured with the routing configuration file under <paramref name="configurationFilePath"/>
18+
/// </summary>
19+
/// <param name="config">The configuration object.</param>
20+
/// <param name="configurationFilePath">The path to the configuration file.</param>
21+
public static void EnableFileBasedRouting(this EndpointConfiguration config, string configurationFilePath)
22+
{
23+
config.GetSettings().Set(FileBasedRoutingFeature.RoutingFilePathKey, configurationFilePath);
24+
config.EnableFeature<FileBasedRoutingFeature>();
25+
}
26+
}
27+
}

NServiceBus.FileBasedRouting/FileBasedRoutingFeature.cs

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,17 @@
99
namespace NServiceBus.FileBasedRouting
1010
{
1111
using System.IO;
12+
using Logging;
1213

13-
public class FileBasedRoutingFeature : Feature
14+
class FileBasedRoutingFeature : Feature
1415
{
15-
const string RoutingFilePathKey = "NServiceBus.FileBasedRouting.RoutingFilePath";
16+
static ILog log = LogManager.GetLogger<FileBasedRoutingFeature>();
17+
18+
public const string RoutingFilePathKey = "NServiceBus.FileBasedRouting.RoutingFilePath";
1619

1720
public FileBasedRoutingFeature()
1821
{
19-
Defaults(s =>
22+
Defaults(s=>
2023
{
2124
s.SetDefault(RoutingFilePathKey, "endpoints.xml");
2225
s.SetDefault<UnicastSubscriberTable>(new UnicastSubscriberTable());
@@ -25,22 +28,26 @@ public FileBasedRoutingFeature()
2528

2629
protected override void Setup(FeatureConfigurationContext context)
2730
{
31+
var transportInfrastructure = context.Settings.Get<TransportInfrastructure>();
32+
2833
var unicastRoutingTable = context.Settings.Get<UnicastRoutingTable>();
2934
var unicastSubscriberTable = context.Settings.Get<UnicastSubscriberTable>();
3035

3136
var routingFilePath = GetRoutingFilePath(context);
3237
var routingFile = new XmlRoutingFileAccess(routingFilePath);
3338
var routingFileParser = new XmlRoutingFileParser();
3439

40+
var nativeSends = transportInfrastructure.OutboundRoutingPolicy.Sends == OutboundRoutingType.Multicast;
41+
var nativePublishes = transportInfrastructure.OutboundRoutingPolicy.Publishes == OutboundRoutingType.Multicast;
42+
3543
// ensure the routing file is valid and the routing table is populated before running FeatureStartupTasks
36-
UpdateRoutingTable(routingFileParser, routingFile, unicastRoutingTable, unicastSubscriberTable);
44+
UpdateRoutingTable(routingFileParser, routingFile, unicastRoutingTable, unicastSubscriberTable, nativeSends, nativePublishes);
3745

38-
context.RegisterStartupTask(new UpdateRoutingTask(routingFileParser, routingFile, unicastRoutingTable, unicastSubscriberTable));
46+
context.RegisterStartupTask(new UpdateRoutingTask(() => UpdateRoutingTable(routingFileParser, routingFile, unicastRoutingTable, unicastSubscriberTable, nativeSends, nativePublishes)));
3947

4048
// if the transport provides native pub/sub support, don't plug in the FileBased pub/sub storage.
4149
if (context.Settings.Get<TransportInfrastructure>().OutboundRoutingPolicy.Publishes == OutboundRoutingType.Unicast)
4250
{
43-
var transportInfrastructure = context.Settings.Get<TransportInfrastructure>();
4451
var routingConnector = new PublishRoutingConnector(
4552
unicastSubscriberTable,
4653
context.Settings.Get<EndpointInstances>(),
@@ -60,7 +67,7 @@ static string GetRoutingFilePath(FeatureConfigurationContext context)
6067
return Path.IsPathRooted(configuredRoutingFilePath) ? configuredRoutingFilePath : Path.Combine(AppDomain.CurrentDomain.BaseDirectory, configuredRoutingFilePath);
6168
}
6269

63-
static void UpdateRoutingTable(XmlRoutingFileParser routingFileParser, XmlRoutingFileAccess routingFile, UnicastRoutingTable routingTable, UnicastSubscriberTable subscriberTable)
70+
static void UpdateRoutingTable(XmlRoutingFileParser routingFileParser, XmlRoutingFileAccess routingFile, UnicastRoutingTable routingTable, UnicastSubscriberTable subscriberTable, bool nativeSends, bool nativePublishes)
6471
{
6572
var endpoints = routingFileParser.Parse(routingFile.Read());
6673

@@ -72,11 +79,19 @@ static void UpdateRoutingTable(XmlRoutingFileParser routingFileParser, XmlRoutin
7279
var route = UnicastRoute.CreateFromEndpointName(endpoint.LogicalEndpointName);
7380
foreach (var commandType in endpoint.Commands)
7481
{
82+
if (nativeSends)
83+
{
84+
log.Warn($"Selected transport uses native command routing. Route for {commandType.FullName} to {endpoint.LogicalEndpointName} configured in {routingFile.FilePath} will be ignored.");
85+
}
7586
commandRoutes.Add(new RouteTableEntry(commandType, route));
7687
}
7788

7889
foreach (var eventType in endpoint.Events)
7990
{
91+
if (nativePublishes)
92+
{
93+
log.Warn($"Selected transport uses native event routing. Route for {eventType.FullName} to {endpoint.LogicalEndpointName} configured in {routingFile.FilePath} will be ignored.");
94+
}
8095
eventRoutes.Add(new RouteTableEntry(eventType, route));
8196
}
8297
}
@@ -87,23 +102,17 @@ static void UpdateRoutingTable(XmlRoutingFileParser routingFileParser, XmlRoutin
87102

88103
class UpdateRoutingTask : FeatureStartupTask, IDisposable
89104
{
90-
XmlRoutingFileParser routingFileParser;
91-
XmlRoutingFileAccess routingFile;
92-
UnicastRoutingTable unicastRoutingTable;
93-
UnicastSubscriberTable subscriberTable;
105+
Action updateRoutingCallback;
94106
Timer updateTimer;
95107

96-
public UpdateRoutingTask(XmlRoutingFileParser routingFileParser, XmlRoutingFileAccess routingFile, UnicastRoutingTable unicastRoutingTable, UnicastSubscriberTable subscriberTable)
108+
public UpdateRoutingTask(Action updateRoutingCallback)
97109
{
98-
this.routingFileParser = routingFileParser;
99-
this.routingFile = routingFile;
100-
this.unicastRoutingTable = unicastRoutingTable;
101-
this.subscriberTable = subscriberTable;
110+
this.updateRoutingCallback = updateRoutingCallback;
102111
}
103112

104113
protected override Task OnStart(IMessageSession session)
105114
{
106-
updateTimer = new Timer(state => UpdateRoutingTable(routingFileParser, routingFile, unicastRoutingTable, subscriberTable), null, TimeSpan.FromSeconds(30), TimeSpan.FromSeconds(30));
115+
updateTimer = new Timer(state => updateRoutingCallback(), null, TimeSpan.FromSeconds(30), TimeSpan.FromSeconds(30));
107116

108117
return Task.CompletedTask;
109118
}

NServiceBus.FileBasedRouting/NServiceBus.FileBasedRouting.csproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,11 @@
4444
<Reference Include="System.Xml" />
4545
</ItemGroup>
4646
<ItemGroup>
47+
<Compile Include="Properties\AssemblyInfo.cs" />
4748
<Compile Include="XmlRoutingFileAccess.cs" />
4849
<Compile Include="UnicastRouteGroup.cs" />
4950
<Compile Include="EndpointRoutingConfiguration.cs" />
51+
<Compile Include="FileBasedRoutingConfigExtensions.cs" />
5052
<Compile Include="FileBasedRoutingFeature.cs" />
5153
<Compile Include="PublishRoutingConnector.cs" />
5254
<Compile Include="UnicastSubscriberTable.cs" />
@@ -62,9 +64,7 @@
6264
<ItemGroup>
6365
<None Include="packages.config" />
6466
</ItemGroup>
65-
<ItemGroup>
66-
<Folder Include="Properties\" />
67-
</ItemGroup>
67+
<ItemGroup />
6868
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
6969
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
7070
Other similar extension points exist, see Microsoft.Common.targets.
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+

2+
using System.Runtime.CompilerServices;
3+
4+
[assembly: InternalsVisibleTo("NServiceBus.FileBasedRouting.Tests")]

0 commit comments

Comments
 (0)