@@ -77,6 +77,7 @@ public static final class Builder {
7777 private PollerBehavior workflowTaskPollersBehavior ;
7878 private PollerBehavior activityTaskPollersBehavior ;
7979 private PollerBehavior nexusTaskPollersBehavior ;
80+ private boolean allowActivityHeartbeatDuringShutdown ;
8081
8182 private Builder () {}
8283
@@ -112,6 +113,7 @@ private Builder(WorkerOptions o) {
112113 this .workflowTaskPollersBehavior = o .workflowTaskPollersBehavior ;
113114 this .activityTaskPollersBehavior = o .activityTaskPollersBehavior ;
114115 this .nexusTaskPollersBehavior = o .nexusTaskPollersBehavior ;
116+ this .allowActivityHeartbeatDuringShutdown = o .allowActivityHeartbeatDuringShutdown ;
115117 }
116118
117119 /**
@@ -524,6 +526,28 @@ public Builder setNexusTaskPollersBehavior(PollerBehavior pollerBehavior) {
524526 return this ;
525527 }
526528
529+ /**
530+ * If true, activities can keep heartbeating during graceful worker shutdown (see {@link
531+ * io.temporal.worker.WorkerFactory#shutdown WorkerFactory.shutdown}). Defaults to false, which
532+ * means that after graceful shutdown is requested, calling {@link
533+ * io.temporal.activity.ActivityExecutionContext#heartbeat ActivityExecutionContext.heartbeat}
534+ * does not send a heartbeat and instead throws {@link
535+ * io.temporal.client.ActivityWorkerShutdownException ActivityWorkerShutdownException}. This
536+ * option is ignored by non-graceful shutdown (see {@link
537+ * io.temporal.worker.WorkerFactory#shutdownNow WorkerFactory.shutdownNow}).
538+ *
539+ * <p>Note that with this option enabled, activities are no longer notified of the worker
540+ * shutdown by the {@link io.temporal.client.ActivityWorkerShutdownException
541+ * ActivityWorkerShutdownException} exception, so they are expected to complete within the
542+ * termination grace period on their own.
543+ */
544+ @ Experimental
545+ public Builder setAllowActivityHeartbeatDuringShutdown (
546+ boolean allowActivityHeartbeatDuringShutdown ) {
547+ this .allowActivityHeartbeatDuringShutdown = allowActivityHeartbeatDuringShutdown ;
548+ return this ;
549+ }
550+
527551 public WorkerOptions build () {
528552 return new WorkerOptions (
529553 maxWorkerActivitiesPerSecond ,
@@ -553,7 +577,8 @@ public WorkerOptions build() {
553577 deploymentOptions ,
554578 workflowTaskPollersBehavior ,
555579 activityTaskPollersBehavior ,
556- nexusTaskPollersBehavior );
580+ nexusTaskPollersBehavior ,
581+ allowActivityHeartbeatDuringShutdown );
557582 }
558583
559584 public WorkerOptions validateAndBuildWithDefaults () {
@@ -685,7 +710,8 @@ public WorkerOptions validateAndBuildWithDefaults() {
685710 deploymentOptions ,
686711 workflowTaskPollersBehavior ,
687712 activityTaskPollersBehavior ,
688- nexusTaskPollersBehavior );
713+ nexusTaskPollersBehavior ,
714+ allowActivityHeartbeatDuringShutdown );
689715 }
690716 }
691717
@@ -717,6 +743,7 @@ public WorkerOptions validateAndBuildWithDefaults() {
717743 private final PollerBehavior workflowTaskPollersBehavior ;
718744 private final PollerBehavior activityTaskPollersBehavior ;
719745 private final PollerBehavior nexusTaskPollersBehavior ;
746+ private final boolean allowActivityHeartbeatDuringShutdown ;
720747
721748 private WorkerOptions (
722749 double maxWorkerActivitiesPerSecond ,
@@ -746,7 +773,8 @@ private WorkerOptions(
746773 WorkerDeploymentOptions deploymentOptions ,
747774 PollerBehavior workflowTaskPollersBehavior ,
748775 PollerBehavior activityTaskPollersBehavior ,
749- PollerBehavior nexusTaskPollersBehavior ) {
776+ PollerBehavior nexusTaskPollersBehavior ,
777+ boolean allowActivityHeartbeatDuringShutdown ) {
750778 this .maxWorkerActivitiesPerSecond = maxWorkerActivitiesPerSecond ;
751779 this .maxConcurrentActivityExecutionSize = maxConcurrentActivityExecutionSize ;
752780 this .maxConcurrentWorkflowTaskExecutionSize = maxConcurrentWorkflowTaskExecutionSize ;
@@ -775,6 +803,7 @@ private WorkerOptions(
775803 this .workflowTaskPollersBehavior = workflowTaskPollersBehavior ;
776804 this .activityTaskPollersBehavior = activityTaskPollersBehavior ;
777805 this .nexusTaskPollersBehavior = nexusTaskPollersBehavior ;
806+ this .allowActivityHeartbeatDuringShutdown = allowActivityHeartbeatDuringShutdown ;
778807 }
779808
780809 public double getMaxWorkerActivitiesPerSecond () {
@@ -912,6 +941,11 @@ public PollerBehavior getNexusTaskPollersBehavior() {
912941 return nexusTaskPollersBehavior ;
913942 }
914943
944+ @ Experimental
945+ public boolean getAllowActivityHeartbeatDuringShutdown () {
946+ return allowActivityHeartbeatDuringShutdown ;
947+ }
948+
915949 @ Override
916950 public boolean equals (Object o ) {
917951 if (this == o ) return true ;
@@ -944,7 +978,8 @@ && compare(maxTaskQueueActivitiesPerSecond, that.maxTaskQueueActivitiesPerSecond
944978 && Objects .equals (deploymentOptions , that .deploymentOptions )
945979 && Objects .equals (workflowTaskPollersBehavior , that .workflowTaskPollersBehavior )
946980 && Objects .equals (activityTaskPollersBehavior , that .activityTaskPollersBehavior )
947- && Objects .equals (nexusTaskPollersBehavior , that .nexusTaskPollersBehavior );
981+ && Objects .equals (nexusTaskPollersBehavior , that .nexusTaskPollersBehavior )
982+ && allowActivityHeartbeatDuringShutdown == that .allowActivityHeartbeatDuringShutdown ;
948983 }
949984
950985 @ Override
@@ -977,7 +1012,8 @@ public int hashCode() {
9771012 deploymentOptions ,
9781013 workflowTaskPollersBehavior ,
9791014 activityTaskPollersBehavior ,
980- nexusTaskPollersBehavior );
1015+ nexusTaskPollersBehavior ,
1016+ allowActivityHeartbeatDuringShutdown );
9811017 }
9821018
9831019 @ Override
@@ -1040,6 +1076,8 @@ public String toString() {
10401076 + activityTaskPollersBehavior
10411077 + ", nexusTaskPollersBehavior="
10421078 + nexusTaskPollersBehavior
1079+ + ", allowActivityHeartbeatDuringShutdown="
1080+ + allowActivityHeartbeatDuringShutdown
10431081 + '}' ;
10441082 }
10451083}
0 commit comments