2016-12-07 09:19:16 +00:00
|
|
|
|
using System;
|
2017-01-31 11:01:08 +00:00
|
|
|
|
using System.Threading.Tasks;
|
2016-12-07 09:19:16 +00:00
|
|
|
|
using Tapeti;
|
|
|
|
|
using Tapeti.Annotations;
|
2017-01-31 11:01:08 +00:00
|
|
|
|
using Tapeti.Flow;
|
|
|
|
|
using Tapeti.Flow.Annotations;
|
2016-12-07 09:19:16 +00:00
|
|
|
|
|
|
|
|
|
namespace Test
|
|
|
|
|
{
|
2017-02-08 14:52:24 +00:00
|
|
|
|
[MessageController]
|
2016-12-07 09:19:16 +00:00
|
|
|
|
[DynamicQueue]
|
2017-02-08 14:52:24 +00:00
|
|
|
|
public class MarcoController
|
2016-12-07 09:19:16 +00:00
|
|
|
|
{
|
|
|
|
|
private readonly IPublisher publisher;
|
2017-01-31 11:01:08 +00:00
|
|
|
|
private readonly IFlowProvider flowProvider;
|
|
|
|
|
private readonly Visualizer visualizer;
|
2016-12-07 09:19:16 +00:00
|
|
|
|
|
2017-01-31 11:01:08 +00:00
|
|
|
|
// Public properties are automatically stored and retrieved while in a flow
|
|
|
|
|
public Guid StateTestGuid;
|
2016-12-07 09:19:16 +00:00
|
|
|
|
|
2017-01-31 11:01:08 +00:00
|
|
|
|
|
|
|
|
|
public MarcoController(IPublisher publisher, IFlowProvider flowProvider, Visualizer visualizer)
|
2016-12-07 09:19:16 +00:00
|
|
|
|
{
|
|
|
|
|
this.publisher = publisher;
|
2017-01-31 11:01:08 +00:00
|
|
|
|
this.flowProvider = flowProvider;
|
|
|
|
|
this.visualizer = visualizer;
|
2016-12-07 09:19:16 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2017-01-31 11:01:08 +00:00
|
|
|
|
/**
|
|
|
|
|
* The Visualizer could've been injected through the constructor, which is
|
|
|
|
|
* the recommended way. Just testing the injection middleware here.
|
|
|
|
|
*/
|
2017-02-05 22:22:34 +00:00
|
|
|
|
public async Task<IYieldPoint> Marco(MarcoMessage message, Visualizer myVisualizer)
|
2016-12-07 09:19:16 +00:00
|
|
|
|
{
|
2017-02-05 22:22:34 +00:00
|
|
|
|
Console.WriteLine(">> Marco (yielding with request)");
|
2016-12-07 09:19:16 +00:00
|
|
|
|
|
2017-02-05 22:22:34 +00:00
|
|
|
|
await myVisualizer.VisualizeMarco();
|
2017-02-12 18:04:26 +00:00
|
|
|
|
StateTestGuid = Guid.NewGuid();
|
|
|
|
|
|
|
|
|
|
return flowProvider.YieldWithParallelRequest()
|
|
|
|
|
.AddRequestSync<PoloConfirmationRequestMessage, PoloConfirmationResponseMessage>(new PoloConfirmationRequestMessage
|
|
|
|
|
{
|
|
|
|
|
StoredInState = StateTestGuid
|
|
|
|
|
}, HandlePoloConfirmationResponse1)
|
2016-12-07 09:19:16 +00:00
|
|
|
|
|
2017-02-12 18:04:26 +00:00
|
|
|
|
.AddRequestSync<PoloConfirmationRequestMessage, PoloConfirmationResponseMessage>(new PoloConfirmationRequestMessage
|
2017-01-31 11:01:08 +00:00
|
|
|
|
{
|
|
|
|
|
StoredInState = StateTestGuid
|
2017-02-12 18:04:26 +00:00
|
|
|
|
}, HandlePoloConfirmationResponse2)
|
|
|
|
|
|
|
|
|
|
.YieldSync(ContinuePoloConfirmation);
|
2017-01-31 11:01:08 +00:00
|
|
|
|
}
|
2016-12-07 09:19:16 +00:00
|
|
|
|
|
|
|
|
|
|
2017-02-05 22:22:34 +00:00
|
|
|
|
[Continuation]
|
2017-02-12 18:04:26 +00:00
|
|
|
|
public void HandlePoloConfirmationResponse1(PoloConfirmationResponseMessage message)
|
2017-01-31 11:01:08 +00:00
|
|
|
|
{
|
2017-02-12 18:04:26 +00:00
|
|
|
|
Console.WriteLine(">> HandlePoloConfirmationResponse1");
|
|
|
|
|
Console.WriteLine(message.ShouldMatchState.Equals(StateTestGuid) ? "Confirmed!" : "Oops! Mismatch!");
|
|
|
|
|
}
|
|
|
|
|
|
2017-02-05 22:22:34 +00:00
|
|
|
|
|
2017-02-12 18:04:26 +00:00
|
|
|
|
[Continuation]
|
|
|
|
|
public void HandlePoloConfirmationResponse2(PoloConfirmationResponseMessage message)
|
|
|
|
|
{
|
|
|
|
|
Console.WriteLine(">> HandlePoloConfirmationResponse2");
|
2017-02-05 22:22:34 +00:00
|
|
|
|
Console.WriteLine(message.ShouldMatchState.Equals(StateTestGuid) ? "Confirmed!" : "Oops! Mismatch!");
|
2017-02-12 18:04:26 +00:00
|
|
|
|
}
|
2017-02-05 22:22:34 +00:00
|
|
|
|
|
2017-02-12 18:04:26 +00:00
|
|
|
|
|
|
|
|
|
private IYieldPoint ContinuePoloConfirmation()
|
|
|
|
|
{
|
|
|
|
|
Console.WriteLine("> ConvergePoloConfirmation (ending flow)");
|
2017-02-05 22:22:34 +00:00
|
|
|
|
return flowProvider.EndWithResponse(new PoloMessage());
|
2017-01-31 11:01:08 +00:00
|
|
|
|
}
|
2016-12-07 09:19:16 +00:00
|
|
|
|
|
|
|
|
|
|
2017-01-31 11:01:08 +00:00
|
|
|
|
/**
|
|
|
|
|
* For simple request response patterns, the return type can be used.
|
|
|
|
|
* This will automatically include the correlationId in the response and
|
|
|
|
|
* use the replyTo header of the request if provided.
|
|
|
|
|
*/
|
|
|
|
|
public PoloConfirmationResponseMessage PoloConfirmation(PoloConfirmationRequestMessage message)
|
2016-12-07 09:19:16 +00:00
|
|
|
|
{
|
2017-02-05 22:22:34 +00:00
|
|
|
|
Console.WriteLine(">> PoloConfirmation (returning confirmation)");
|
|
|
|
|
|
2017-01-31 11:01:08 +00:00
|
|
|
|
return new PoloConfirmationResponseMessage
|
|
|
|
|
{
|
|
|
|
|
ShouldMatchState = message.StoredInState
|
|
|
|
|
};
|
2016-12-07 09:19:16 +00:00
|
|
|
|
}
|
2017-02-05 22:22:34 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public void Polo(PoloMessage message)
|
|
|
|
|
{
|
|
|
|
|
Console.WriteLine(">> Polo");
|
|
|
|
|
}
|
2016-12-07 09:19:16 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2017-02-05 22:22:34 +00:00
|
|
|
|
[Request(Response = typeof(PoloMessage))]
|
2016-12-07 09:19:16 +00:00
|
|
|
|
public class MarcoMessage
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public class PoloMessage
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2017-01-31 11:01:08 +00:00
|
|
|
|
[Request(Response = typeof(PoloConfirmationResponseMessage))]
|
|
|
|
|
public class PoloConfirmationRequestMessage
|
2016-12-07 09:19:16 +00:00
|
|
|
|
{
|
2017-01-31 11:01:08 +00:00
|
|
|
|
public Guid StoredInState { get; set; }
|
2016-12-07 09:19:16 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2017-01-31 11:01:08 +00:00
|
|
|
|
public class PoloConfirmationResponseMessage
|
|
|
|
|
{
|
|
|
|
|
public Guid ShouldMatchState { get; set; }
|
2016-12-07 09:19:16 +00:00
|
|
|
|
}
|
|
|
|
|
}
|