microsoft / microsoft/durabletask-java

Wrap gRPC StatusRuntimeException across all client and worker gRPC calls

Open
#274 0 comments 1 reaction 2 assignees View on GitHub

@bachuv is already working on this.

Since Apr 7, 2026.

  • #278 by @copilot-swe-agent — closed without merging
Enhancement
Dominant language
Java
Stars
29
Forks
18
Avg merge
1d 10h
Merged PRs (30d)
2

Description

Summary

Most gRPC calls in the Java SDK let raw io.grpc.StatusRuntimeException escape to callers. The .NET SDK wraps RpcException (at minimum StatusCode.CancelledOperationCanceledException) for all entity client methods. The Java SDK should provide consistent domain-level exception wrapping so callers don't need to depend on gRPC types and so we can have .NET feature parity.

Current Behavior

The majority of gRPC methods across DurableTaskGrpcClient, GrpcDurableEntityClient, and DurableTaskGrpcWorker let StatusRuntimeException propagate unwrapped:

DurableTaskGrpcClient — no wrapping:

  • suspendInstance()
  • resumeInstance()
  • terminate()
  • raiseEvent()
  • createInstanceWithRaise()
  • getInstanceMetadata()

DurableTaskGrpcClient — wraps specific codes only:

  • waitForInstanceStart()DEADLINE_EXCEEDEDTimeoutException
  • waitForInstanceCompletion()DEADLINE_EXCEEDEDTimeoutException
  • purgeInstances()DEADLINE_EXCEEDEDTimeoutException
  • rewindInstance()NOT_FOUNDIllegalArgumentException, FAILED_PRECONDITIONIllegalStateException

GrpcDurableEntityClient — no wrapping:

  • signalEntity()
  • getEntityMetadata()
  • queryEntities()
  • cleanEntityStorage()

DurableTaskGrpcWorker — no wrapping:

  • completeActivityTask()
  • completeOrchestratorTask()
  • completeEntityTask()

Expected Behavior

gRPC transport exceptions should be translated into SDK-level exceptions. At minimum:

  • CANCELLEDCancellationException (closest Java equivalent to .NET's OperationCanceledException)
  • NOT_FOUNDIllegalArgumentException or a dedicated not-found exception
  • DEADLINE_EXCEEDEDTimeoutException (already done for some methods)

.NET SDK Reference

The .NET GrpcDurableEntityClient wraps RpcException for every entity method:

catch (RpcException e) when (e.StatusCode == StatusCode.Cancelled)
{
    throw new OperationCanceledException(
        $"The {nameof(this.SignalEntityAsync)} operation was canceled.", e, cancellation);
}

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.