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);