[skip appveyor] #9 Documentation and examples
Added YieldWithParallelRequest and Tapeti.Transient examples.
This commit is contained in:
parent
cd80778775
commit
7075baeb80
73
Examples/03-FlowRequestResponse/ParallelFlowController.cs
Normal file
73
Examples/03-FlowRequestResponse/ParallelFlowController.cs
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
using System;
|
||||||
|
using ExampleLib;
|
||||||
|
using Messaging.TapetiExample;
|
||||||
|
using Tapeti.Annotations;
|
||||||
|
using Tapeti.Flow;
|
||||||
|
using Tapeti.Flow.Annotations;
|
||||||
|
|
||||||
|
namespace _03_FlowRequestResponse
|
||||||
|
{
|
||||||
|
[MessageController]
|
||||||
|
[DynamicQueue("tapeti.example.03")]
|
||||||
|
public class ParallelFlowController
|
||||||
|
{
|
||||||
|
private readonly IFlowProvider flowProvider;
|
||||||
|
private readonly IExampleState exampleState;
|
||||||
|
|
||||||
|
public string FirstQuote;
|
||||||
|
public string SecondQuote;
|
||||||
|
|
||||||
|
|
||||||
|
public ParallelFlowController(IFlowProvider flowProvider, IExampleState exampleState)
|
||||||
|
{
|
||||||
|
this.flowProvider = flowProvider;
|
||||||
|
this.exampleState = exampleState;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[Start]
|
||||||
|
public IYieldPoint StartFlow()
|
||||||
|
{
|
||||||
|
return flowProvider.YieldWithParallelRequest()
|
||||||
|
.AddRequestSync<QuoteRequestMessage, QuoteResponseMessage>(
|
||||||
|
new QuoteRequestMessage
|
||||||
|
{
|
||||||
|
Amount = 1
|
||||||
|
},
|
||||||
|
HandleFirstQuoteResponse)
|
||||||
|
.AddRequestSync<QuoteRequestMessage, QuoteResponseMessage>(
|
||||||
|
new QuoteRequestMessage
|
||||||
|
{
|
||||||
|
Amount = 2
|
||||||
|
},
|
||||||
|
HandleSecondQuoteResponse)
|
||||||
|
.YieldSync(AllQuotesReceived);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[Continuation]
|
||||||
|
public void HandleFirstQuoteResponse(QuoteResponseMessage message)
|
||||||
|
{
|
||||||
|
Console.WriteLine("[ParallelFlowController] First quote response received");
|
||||||
|
FirstQuote = message.Quote;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[Continuation]
|
||||||
|
public void HandleSecondQuoteResponse(QuoteResponseMessage message)
|
||||||
|
{
|
||||||
|
Console.WriteLine("[ParallelFlowController] Second quote response received");
|
||||||
|
SecondQuote = message.Quote;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private IYieldPoint AllQuotesReceived()
|
||||||
|
{
|
||||||
|
Console.WriteLine("[ParallelFlowController] First quote: " + FirstQuote);
|
||||||
|
Console.WriteLine("[ParallelFlowController] Second quote: " + SecondQuote);
|
||||||
|
|
||||||
|
exampleState.Done();
|
||||||
|
return flowProvider.End();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -42,20 +42,20 @@ namespace _03_FlowRequestResponse
|
|||||||
await dependencyResolver.Resolve<IFlowStore>().Load();
|
await dependencyResolver.Resolve<IFlowStore>().Load();
|
||||||
|
|
||||||
|
|
||||||
// This creates or updates the durable queue
|
|
||||||
await connection.Subscribe();
|
await connection.Subscribe();
|
||||||
|
|
||||||
|
|
||||||
var flowStarter = dependencyResolver.Resolve<IFlowStarter>();
|
var flowStarter = dependencyResolver.Resolve<IFlowStarter>();
|
||||||
|
|
||||||
var startData = new SendingFlowController.StartData
|
var startData = new SimpleFlowController.StartData
|
||||||
{
|
{
|
||||||
RequestStartTime = DateTime.Now,
|
RequestStartTime = DateTime.Now,
|
||||||
Amount = 1
|
Amount = 1
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
await flowStarter.Start<SendingFlowController, SendingFlowController.StartData>(c => c.StartFlow, startData);
|
await flowStarter.Start<SimpleFlowController, SimpleFlowController.StartData>(c => c.StartFlow, startData);
|
||||||
|
await flowStarter.Start<ParallelFlowController>(c => c.StartFlow);
|
||||||
|
|
||||||
|
|
||||||
// Wait for the controller to signal that the message has been received
|
// Wait for the controller to signal that the message has been received
|
||||||
|
@ -9,7 +9,7 @@ namespace _03_FlowRequestResponse
|
|||||||
{
|
{
|
||||||
[MessageController]
|
[MessageController]
|
||||||
[DynamicQueue("tapeti.example.03")]
|
[DynamicQueue("tapeti.example.03")]
|
||||||
public class SendingFlowController
|
public class SimpleFlowController
|
||||||
{
|
{
|
||||||
private readonly IFlowProvider flowProvider;
|
private readonly IFlowProvider flowProvider;
|
||||||
private readonly IExampleState exampleState;
|
private readonly IExampleState exampleState;
|
||||||
@ -32,7 +32,7 @@ namespace _03_FlowRequestResponse
|
|||||||
public DateTime RequestStartTime;
|
public DateTime RequestStartTime;
|
||||||
|
|
||||||
|
|
||||||
public SendingFlowController(IFlowProvider flowProvider, IExampleState exampleState)
|
public SimpleFlowController(IFlowProvider flowProvider, IExampleState exampleState)
|
||||||
{
|
{
|
||||||
this.flowProvider = flowProvider;
|
this.flowProvider = flowProvider;
|
||||||
this.exampleState = exampleState;
|
this.exampleState = exampleState;
|
||||||
@ -58,11 +58,11 @@ namespace _03_FlowRequestResponse
|
|||||||
public IYieldPoint HandleQuoteResponse(QuoteResponseMessage message)
|
public IYieldPoint HandleQuoteResponse(QuoteResponseMessage message)
|
||||||
{
|
{
|
||||||
if (nonPersistentState)
|
if (nonPersistentState)
|
||||||
Console.WriteLine("This is not supposed to show. NonPersistentState should not be retained. Someone please check http://www.hasthelargehadroncolliderdestroyedtheworldyet.com.");
|
Console.WriteLine("[SimpleFlowController] This is not supposed to show. NonPersistentState should not be retained. Someone please check http://www.hasthelargehadroncolliderdestroyedtheworldyet.com.");
|
||||||
|
|
||||||
Console.WriteLine("Request start: " + RequestStartTime.ToLongTimeString());
|
Console.WriteLine("[SimpleFlowController] Request start: " + RequestStartTime.ToLongTimeString());
|
||||||
Console.WriteLine("Response time: " + DateTime.Now.ToLongTimeString());
|
Console.WriteLine("[SimpleFlowController] Response time: " + DateTime.Now.ToLongTimeString());
|
||||||
Console.WriteLine("Quote: " + message.Quote);
|
Console.WriteLine("[SimpleFlowController] Quote: " + message.Quote);
|
||||||
|
|
||||||
|
|
||||||
exampleState.Done();
|
exampleState.Done();
|
22
Examples/04-Transient/04-Transient.csproj
Normal file
22
Examples/04-Transient/04-Transient.csproj
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>netcoreapp2.1</TargetFramework>
|
||||||
|
<RootNamespace>_04_Transient</RootNamespace>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="SimpleInjector" Version="4.6.2" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\..\Tapeti.DataAnnotations\Tapeti.DataAnnotations.csproj" />
|
||||||
|
<ProjectReference Include="..\..\Tapeti.SimpleInjector\Tapeti.SimpleInjector.csproj" />
|
||||||
|
<ProjectReference Include="..\..\Tapeti.Transient\Tapeti.Transient.csproj" />
|
||||||
|
<ProjectReference Include="..\..\Tapeti\Tapeti.csproj" />
|
||||||
|
<ProjectReference Include="..\ExampleLib\ExampleLib.csproj" />
|
||||||
|
<ProjectReference Include="..\Messaging.TapetiExample\Messaging.TapetiExample.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
55
Examples/04-Transient/Program.cs
Normal file
55
Examples/04-Transient/Program.cs
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
using System;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using ExampleLib;
|
||||||
|
using Messaging.TapetiExample;
|
||||||
|
using SimpleInjector;
|
||||||
|
using Tapeti;
|
||||||
|
using Tapeti.DataAnnotations;
|
||||||
|
using Tapeti.Default;
|
||||||
|
using Tapeti.SimpleInjector;
|
||||||
|
using Tapeti.Transient;
|
||||||
|
|
||||||
|
namespace _04_Transient
|
||||||
|
{
|
||||||
|
public class Program
|
||||||
|
{
|
||||||
|
public static void Main(string[] args)
|
||||||
|
{
|
||||||
|
var container = new Container();
|
||||||
|
var dependencyResolver = new SimpleInjectorDependencyResolver(container);
|
||||||
|
|
||||||
|
container.Register<ILogger, ConsoleLogger>();
|
||||||
|
|
||||||
|
var helper = new ExampleConsoleApp(dependencyResolver);
|
||||||
|
helper.Run(MainAsync);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
internal static async Task MainAsync(IDependencyResolver dependencyResolver, Func<Task> waitForDone)
|
||||||
|
{
|
||||||
|
var config = new TapetiConfig(dependencyResolver)
|
||||||
|
.WithDataAnnotations()
|
||||||
|
.WithTransient(TimeSpan.FromSeconds(5), "tapeti.example.04.transient")
|
||||||
|
.RegisterAllControllers()
|
||||||
|
.Build();
|
||||||
|
|
||||||
|
|
||||||
|
using (var connection = new TapetiConnection(config))
|
||||||
|
{
|
||||||
|
await connection.Subscribe();
|
||||||
|
|
||||||
|
|
||||||
|
Console.WriteLine("Sending request...");
|
||||||
|
|
||||||
|
var transientPublisher = dependencyResolver.Resolve<ITransientPublisher>();
|
||||||
|
var response = await transientPublisher.RequestResponse<LoggedInUsersRequestMessage, LoggedInUsersResponseMessage>(
|
||||||
|
new LoggedInUsersRequestMessage());
|
||||||
|
|
||||||
|
Console.WriteLine("Response: " + response.Count);
|
||||||
|
|
||||||
|
|
||||||
|
// Unlike the other example, there is no need to call waitForDone, once we're here the response has been handled.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
24
Examples/04-Transient/UsersMessageController.cs
Normal file
24
Examples/04-Transient/UsersMessageController.cs
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
using System;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Messaging.TapetiExample;
|
||||||
|
using Tapeti.Annotations;
|
||||||
|
|
||||||
|
namespace _04_Transient
|
||||||
|
{
|
||||||
|
[MessageController]
|
||||||
|
[DynamicQueue("tapeti.example.04")]
|
||||||
|
public class UsersMessageController
|
||||||
|
{
|
||||||
|
// No publisher required, responses can simply be returned
|
||||||
|
public async Task<LoggedInUsersResponseMessage> HandleQuoteRequest(LoggedInUsersRequestMessage message)
|
||||||
|
{
|
||||||
|
// Simulate the response taking some time
|
||||||
|
await Task.Delay(1000);
|
||||||
|
|
||||||
|
return new LoggedInUsersResponseMessage
|
||||||
|
{
|
||||||
|
Count = new Random().Next(0, 100)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,15 @@
|
|||||||
|
using Tapeti.Annotations;
|
||||||
|
|
||||||
|
namespace Messaging.TapetiExample
|
||||||
|
{
|
||||||
|
[Request(Response = typeof(LoggedInUsersResponseMessage))]
|
||||||
|
public class LoggedInUsersRequestMessage
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public class LoggedInUsersResponseMessage
|
||||||
|
{
|
||||||
|
public int Count { get; set; }
|
||||||
|
}
|
||||||
|
}
|
17
Tapeti.sln
17
Tapeti.sln
@ -27,15 +27,17 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tapeti.DataAnnotations.Exte
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Examples", "Examples", "{266B9B94-A4D2-41C2-860C-24A7C3B63B56}"
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Examples", "Examples", "{266B9B94-A4D2-41C2-860C-24A7C3B63B56}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "01-PublishSubscribe", "Examples\01-PublishSubscribe\01-PublishSubscribe.csproj", "{8350A0AB-F0EE-48CF-9CA6-6019467101CF}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "01-PublishSubscribe", "Examples\01-PublishSubscribe\01-PublishSubscribe.csproj", "{8350A0AB-F0EE-48CF-9CA6-6019467101CF}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExampleLib", "Examples\ExampleLib\ExampleLib.csproj", "{F3B38753-06B4-4932-84B4-A07692AD802D}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ExampleLib", "Examples\ExampleLib\ExampleLib.csproj", "{F3B38753-06B4-4932-84B4-A07692AD802D}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Messaging.TapetiExample", "Examples\Messaging.TapetiExample\Messaging.TapetiExample.csproj", "{D24120D4-50A2-44B6-A4EA-6ADAAEBABA84}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Messaging.TapetiExample", "Examples\Messaging.TapetiExample\Messaging.TapetiExample.csproj", "{D24120D4-50A2-44B6-A4EA-6ADAAEBABA84}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "02-DeclareDurableQueues", "Examples\02-DeclareDurableQueues\02-DeclareDurableQueues.csproj", "{85511282-EF91-4B56-B7DC-9E8706556D6E}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "02-DeclareDurableQueues", "Examples\02-DeclareDurableQueues\02-DeclareDurableQueues.csproj", "{85511282-EF91-4B56-B7DC-9E8706556D6E}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "03-FlowRequestResponse", "Examples\03-FlowRequestResponse\03-FlowRequestResponse.csproj", "{463A12CE-E221-450D-ADEA-91A599612DFA}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "03-FlowRequestResponse", "Examples\03-FlowRequestResponse\03-FlowRequestResponse.csproj", "{463A12CE-E221-450D-ADEA-91A599612DFA}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "04-Transient", "Examples\04-Transient\04-Transient.csproj", "{46DFC131-A398-435F-A7DF-3C41B656BF11}"
|
||||||
EndProject
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
@ -107,6 +109,10 @@ Global
|
|||||||
{463A12CE-E221-450D-ADEA-91A599612DFA}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{463A12CE-E221-450D-ADEA-91A599612DFA}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{463A12CE-E221-450D-ADEA-91A599612DFA}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{463A12CE-E221-450D-ADEA-91A599612DFA}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{463A12CE-E221-450D-ADEA-91A599612DFA}.Release|Any CPU.Build.0 = Release|Any CPU
|
{463A12CE-E221-450D-ADEA-91A599612DFA}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{46DFC131-A398-435F-A7DF-3C41B656BF11}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{46DFC131-A398-435F-A7DF-3C41B656BF11}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{46DFC131-A398-435F-A7DF-3C41B656BF11}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{46DFC131-A398-435F-A7DF-3C41B656BF11}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
@ -117,6 +123,7 @@ Global
|
|||||||
{D24120D4-50A2-44B6-A4EA-6ADAAEBABA84} = {266B9B94-A4D2-41C2-860C-24A7C3B63B56}
|
{D24120D4-50A2-44B6-A4EA-6ADAAEBABA84} = {266B9B94-A4D2-41C2-860C-24A7C3B63B56}
|
||||||
{85511282-EF91-4B56-B7DC-9E8706556D6E} = {266B9B94-A4D2-41C2-860C-24A7C3B63B56}
|
{85511282-EF91-4B56-B7DC-9E8706556D6E} = {266B9B94-A4D2-41C2-860C-24A7C3B63B56}
|
||||||
{463A12CE-E221-450D-ADEA-91A599612DFA} = {266B9B94-A4D2-41C2-860C-24A7C3B63B56}
|
{463A12CE-E221-450D-ADEA-91A599612DFA} = {266B9B94-A4D2-41C2-860C-24A7C3B63B56}
|
||||||
|
{46DFC131-A398-435F-A7DF-3C41B656BF11} = {266B9B94-A4D2-41C2-860C-24A7C3B63B56}
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
SolutionGuid = {B09CC2BF-B2AF-4CB6-8728-5D1D8E5C50FA}
|
SolutionGuid = {B09CC2BF-B2AF-4CB6-8728-5D1D8E5C50FA}
|
||||||
|
Loading…
Reference in New Issue
Block a user