Added possibility to publish a request-response directly to a queue
This commit is contained in:
parent
c7f736e033
commit
a6f2b24ea0
@ -45,6 +45,20 @@ namespace Tapeti.Flow.Default
|
|||||||
return new DelegateYieldPoint(context => SendRequest(context, message, responseHandlerInfo));
|
return new DelegateYieldPoint(context => SendRequest(context, message, responseHandlerInfo));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public IYieldPoint YieldWithRequestDirect<TRequest, TResponse>(TRequest message, string queueName, Func<TResponse, Task<IYieldPoint>> responseHandler) where TRequest : class where TResponse : class
|
||||||
|
{
|
||||||
|
var responseHandlerInfo = GetResponseHandlerInfo(config, message, responseHandler);
|
||||||
|
return new DelegateYieldPoint(context => SendRequestDirect(context, message, queueName, responseHandlerInfo));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public IYieldPoint YieldWithRequestDirect<TRequest, TResponse>(TRequest message, string queueName, Func<TResponse, ValueTask<IYieldPoint>> responseHandler) where TRequest : class where TResponse : class
|
||||||
|
{
|
||||||
|
var responseHandlerInfo = GetResponseHandlerInfo(config, message, responseHandler);
|
||||||
|
return new DelegateYieldPoint(context => SendRequestDirect(context, message, queueName, responseHandlerInfo));
|
||||||
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public IYieldPoint YieldWithRequestSync<TRequest, TResponse>(TRequest message, Func<TResponse, IYieldPoint> responseHandler) where TRequest : class where TResponse : class
|
public IYieldPoint YieldWithRequestSync<TRequest, TResponse>(TRequest message, Func<TResponse, IYieldPoint> responseHandler) where TRequest : class where TResponse : class
|
||||||
{
|
{
|
||||||
@ -52,6 +66,13 @@ namespace Tapeti.Flow.Default
|
|||||||
return new DelegateYieldPoint(context => SendRequest(context, message, responseHandlerInfo));
|
return new DelegateYieldPoint(context => SendRequest(context, message, responseHandlerInfo));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public IYieldPoint YieldWithRequestDirectSync<TRequest, TResponse>(TRequest message, string queueName, Func<TResponse, IYieldPoint> responseHandler) where TRequest : class where TResponse : class
|
||||||
|
{
|
||||||
|
var responseHandlerInfo = GetResponseHandlerInfo(config, message, responseHandler);
|
||||||
|
return new DelegateYieldPoint(context => SendRequestDirect(context, message, queueName, responseHandlerInfo));
|
||||||
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public IFlowParallelRequestBuilder YieldWithParallelRequest()
|
public IFlowParallelRequestBuilder YieldWithParallelRequest()
|
||||||
{
|
{
|
||||||
@ -110,6 +131,16 @@ namespace Tapeti.Flow.Default
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
internal async Task SendRequestDirect(FlowContext context, object message, string queueName, ResponseHandlerInfo responseHandlerInfo,
|
||||||
|
string convergeMethodName = null, bool convergeMethodTaskSync = false)
|
||||||
|
{
|
||||||
|
var properties = await PrepareRequest(context, responseHandlerInfo, convergeMethodName, convergeMethodTaskSync);
|
||||||
|
await context.Store(responseHandlerInfo.IsDurableQueue);
|
||||||
|
|
||||||
|
await publisher.PublishDirect(message, queueName, properties, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private async Task SendResponse(FlowContext context, object message)
|
private async Task SendResponse(FlowContext context, object message)
|
||||||
{
|
{
|
||||||
var reply = context.HasFlowStateAndLock
|
var reply = context.HasFlowStateAndLock
|
||||||
|
@ -35,6 +35,34 @@ namespace Tapeti.Flow
|
|||||||
IYieldPoint YieldWithRequest<TRequest, TResponse>(TRequest message, Func<TResponse, ValueTask<IYieldPoint>> responseHandler) where TRequest : class where TResponse : class;
|
IYieldPoint YieldWithRequest<TRequest, TResponse>(TRequest message, Func<TResponse, ValueTask<IYieldPoint>> responseHandler) where TRequest : class where TResponse : class;
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Publish a request message directly to a queue and continue the flow when the response arrives.
|
||||||
|
/// The exchange and routing key are not used.
|
||||||
|
/// The request message must be marked with the [Request] attribute, and the
|
||||||
|
/// Response type must match. Used for asynchronous response handlers.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="message"></param>
|
||||||
|
/// <param name="queueName"></param>
|
||||||
|
/// <param name="responseHandler"></param>
|
||||||
|
/// <typeparam name="TRequest"></typeparam>
|
||||||
|
/// <typeparam name="TResponse"></typeparam>
|
||||||
|
IYieldPoint YieldWithRequestDirect<TRequest, TResponse>(TRequest message, string queueName, Func<TResponse, Task<IYieldPoint>> responseHandler) where TRequest : class where TResponse : class;
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Publish a request message directly to a queue and continue the flow when the response arrives.
|
||||||
|
/// The exchange and routing key are not used.
|
||||||
|
/// The request message must be marked with the [Request] attribute, and the
|
||||||
|
/// Response type must match. Used for asynchronous response handlers.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="message"></param>
|
||||||
|
/// <param name="queueName"></param>
|
||||||
|
/// <param name="responseHandler"></param>
|
||||||
|
/// <typeparam name="TRequest"></typeparam>
|
||||||
|
/// <typeparam name="TResponse"></typeparam>
|
||||||
|
IYieldPoint YieldWithRequestDirect<TRequest, TResponse>(TRequest message, string queueName, Func<TResponse, ValueTask<IYieldPoint>> responseHandler) where TRequest : class where TResponse : class;
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Publish a request message and continue the flow when the response arrives.
|
/// Publish a request message and continue the flow when the response arrives.
|
||||||
/// The request message must be marked with the [Request] attribute, and the
|
/// The request message must be marked with the [Request] attribute, and the
|
||||||
@ -54,6 +82,27 @@ namespace Tapeti.Flow
|
|||||||
IYieldPoint YieldWithRequestSync<TRequest, TResponse>(TRequest message, Func<TResponse, IYieldPoint> responseHandler) where TRequest : class where TResponse : class;
|
IYieldPoint YieldWithRequestSync<TRequest, TResponse>(TRequest message, Func<TResponse, IYieldPoint> responseHandler) where TRequest : class where TResponse : class;
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Publish a request message directly to a queue and continue the flow when the response arrives.
|
||||||
|
/// The exchange and routing key are not used.
|
||||||
|
/// The request message must be marked with the [Request] attribute, and the
|
||||||
|
/// Response type must match. Used for synchronous response handlers.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// The reason why this requires the extra 'Sync' in the name: one does not simply overload methods
|
||||||
|
/// with Task vs non-Task Funcs. "Ambiguous call". Apparantly this is because a return type
|
||||||
|
/// of a method is not part of its signature,according to:
|
||||||
|
/// http://stackoverflow.com/questions/18715979/ambiguity-with-action-and-func-parameter
|
||||||
|
/// </remarks>
|
||||||
|
/// <param name="message"></param>
|
||||||
|
/// <param name="queueName"></param>
|
||||||
|
/// <param name="responseHandler"></param>
|
||||||
|
/// <typeparam name="TRequest"></typeparam>
|
||||||
|
/// <typeparam name="TResponse"></typeparam>
|
||||||
|
/// <returns></returns>
|
||||||
|
IYieldPoint YieldWithRequestDirectSync<TRequest, TResponse>(TRequest message, string queueName, Func<TResponse, IYieldPoint> responseHandler) where TRequest : class where TResponse : class;
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Create a request builder to publish one or more requests messages. Call Yield on the resulting builder
|
/// Create a request builder to publish one or more requests messages. Call Yield on the resulting builder
|
||||||
/// to acquire an IYieldPoint.
|
/// to acquire an IYieldPoint.
|
||||||
|
Loading…
Reference in New Issue
Block a user