diff --git a/Client/Api/Commands/IUpdateJobTimeoutCommandSteps.cs b/Client/Api/Commands/IUpdateJobTimeoutCommandSteps.cs new file mode 100644 index 00000000..6fc9fc2f --- /dev/null +++ b/Client/Api/Commands/IUpdateJobTimeoutCommandSteps.cs @@ -0,0 +1,25 @@ +using System; +using Zeebe.Client.Api.Responses; + +namespace Zeebe.Client.Api.Commands; + +public interface IUpdateJobTimeoutCommandStep1 +{ + /// + /// Update the timeout for this job. + /// + /// + /// + /// If the job's timeout is set to zero, the job will be retried. + /// + /// The duration of the new timeout as a TimeSpan, starting from the current moment. + /// + /// The builder for this command. Call to complete the command and send it to the broker. + /// + IUpdateJobTimeoutCommandStep2 Timeout(TimeSpan timeout); +} + +public interface IUpdateJobTimeoutCommandStep2 : IFinalCommandWithRetryStep +{ + // the place for new optional parameters +} \ No newline at end of file diff --git a/Client/Api/Responses/IUpdateJobTimeoutResponse.cs b/Client/Api/Responses/IUpdateJobTimeoutResponse.cs new file mode 100644 index 00000000..6a0156a2 --- /dev/null +++ b/Client/Api/Responses/IUpdateJobTimeoutResponse.cs @@ -0,0 +1,9 @@ +namespace Zeebe.Client.Api.Responses +{ + /// + /// Response for an update job timeout request. + /// + public interface IUpdateJobTimeoutResponse + { + } +} \ No newline at end of file diff --git a/Client/IZeebeClient.cs b/Client/IZeebeClient.cs index 63abdce7..ad151cfd 100644 --- a/Client/IZeebeClient.cs +++ b/Client/IZeebeClient.cs @@ -118,6 +118,31 @@ public interface IZeebeClient : IJobClient, IDisposable /// IUpdateRetriesCommandStep1 NewUpdateRetriesCommand(long jobKey); + /// + /// Command to update the timeout of a job. + /// + /// + /// + /// long jobKey = ..; + /// + /// zeebeClient + /// .NewUpdateJobTimeoutCommand(jobKey) + /// .Timeout(new TimeSpan(0, 0, 0, 10)) + /// .Send(); + /// + /// + /// + /// + /// If the job's timeout is zero, the job will be retried. + /// + /// + /// the key of the job to update + /// + /// + /// a builder for the command + /// + IUpdateJobTimeoutCommandStep1 NewUpdateJobTimeoutCommand(long jobKey); + /// /// Command to deploy new resources, i.e. BPMN process models and DMN decision models. /// diff --git a/Client/Impl/Commands/UpdateJobTimeoutCommand.cs b/Client/Impl/Commands/UpdateJobTimeoutCommand.cs new file mode 100644 index 00000000..6d393abc --- /dev/null +++ b/Client/Impl/Commands/UpdateJobTimeoutCommand.cs @@ -0,0 +1,50 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using GatewayProtocol; +using Zeebe.Client.Api.Commands; +using Zeebe.Client.Api.Misc; +using Zeebe.Client.Api.Responses; +using UpdateJobTimeoutResponse = Zeebe.Client.Impl.Responses.UpdateJobTimeoutResponse; + +namespace Zeebe.Client.Impl.Commands; + +public class UpdateJobTimeoutCommand : IUpdateJobTimeoutCommandStep1, IUpdateJobTimeoutCommandStep2 +{ + private readonly UpdateJobTimeoutRequest request; + private readonly Gateway.GatewayClient client; + private readonly IAsyncRetryStrategy asyncRetryStrategy; + + public UpdateJobTimeoutCommand(Gateway.GatewayClient client, IAsyncRetryStrategy asyncRetryStrategy, long jobKey) + { + request = new UpdateJobTimeoutRequest() + { + JobKey = jobKey + }; + this.client = client; + this.asyncRetryStrategy = asyncRetryStrategy; + } + + public IUpdateJobTimeoutCommandStep2 Timeout(TimeSpan timeout) + { + request.Timeout = Convert.ToInt32(timeout.TotalMilliseconds); + return this; + } + + public async Task Send(TimeSpan? timeout = null, CancellationToken token = default) + { + var asyncReply = client.UpdateJobTimeoutAsync(request, deadline: timeout?.FromUtcNow(), cancellationToken: token); + await asyncReply.ResponseAsync; + return new UpdateJobTimeoutResponse(); + } + + public async Task Send(CancellationToken cancellationToken) + { + return await Send(token: cancellationToken); + } + + public async Task SendWithRetry(TimeSpan? timeout = null, CancellationToken token = default) + { + return await asyncRetryStrategy.DoWithRetry(() => Send(timeout, token)); + } +} \ No newline at end of file diff --git a/Client/Impl/Responses/UpdateJobTimeoutResponse.cs b/Client/Impl/Responses/UpdateJobTimeoutResponse.cs new file mode 100644 index 00000000..b756edf5 --- /dev/null +++ b/Client/Impl/Responses/UpdateJobTimeoutResponse.cs @@ -0,0 +1,8 @@ +using Zeebe.Client.Api.Responses; + +namespace Zeebe.Client.Impl.Responses; + +public class UpdateJobTimeoutResponse : IUpdateJobTimeoutResponse +{ + +} \ No newline at end of file diff --git a/Client/ZeebeClient.cs b/Client/ZeebeClient.cs index d94e9915..dba709f7 100644 --- a/Client/ZeebeClient.cs +++ b/Client/ZeebeClient.cs @@ -188,6 +188,11 @@ public IUpdateRetriesCommandStep1 NewUpdateRetriesCommand(long jobKey) return new UpdateRetriesCommand(gatewayClient, asyncRetryStrategy, jobKey); } + public IUpdateJobTimeoutCommandStep1 NewUpdateJobTimeoutCommand(long jobKey) + { + return new UpdateJobTimeoutCommand(gatewayClient, asyncRetryStrategy, jobKey); + } + public IThrowErrorCommandStep1 NewThrowErrorCommand(long jobKey) { return new ThrowErrorCommand(gatewayClient, asyncRetryStrategy, jobKey);