replication test

August 14, 2025 ยท View on GitHub

package io.temporal.samples.hello;

import io.temporal.activity.ActivityInterface; import io.temporal.activity.ActivityMethod; import io.temporal.activity.ActivityOptions; import io.temporal.client.WorkflowClient; import io.temporal.client.WorkflowClientOptions; import io.temporal.client.WorkflowOptions; import io.temporal.serviceclient.WorkflowServiceStubs; import io.temporal.worker.Worker; import io.temporal.worker.WorkerFactory; import io.temporal.workflow.SignalMethod; import io.temporal.workflow.Workflow; import io.temporal.workflow.WorkflowInterface; import io.temporal.workflow.WorkflowMethod; import java.time.Duration; import org.slf4j.Logger; import org.slf4j.LoggerFactory;

/** Sample Temporal Workflow Definition that executes a single Activity. */ public class HelloActivity {

// Define the task queue name static final String TASK_QUEUE = "HelloActivityTaskQueue";

// Define our workflow unique id static final String WORKFLOW_ID = "HelloActivityWorkflow";

/**

  • The Workflow Definition's Interface must contain one method annotated with @WorkflowMethod.
  • Workflow Definitions should not contain any heavyweight computations, non-deterministic

  • code, network calls, database operations, etc. Those things should be handled by the
  • Activities.
  • @see io.temporal.workflow.WorkflowInterface
  • @see io.temporal.workflow.WorkflowMethod */ @WorkflowInterface public interface GreetingWorkflow {
/**
 * This is the method that is executed when the Workflow Execution is started. The Workflow
 * Execution completes when this method finishes execution.
 */
@WorkflowMethod
String getGreeting(String name);

@SignalMethod
void doContinue();

}

/**

  • This is the Activity Definition's Interface. Activities are building blocks of any Temporal
  • Workflow and contain any business logic that could perform long running computation, network
  • calls, etc.
  • Annotating Activity Definition methods with @ActivityMethod is optional.

  • @see io.temporal.activity.ActivityInterface
  • @see io.temporal.activity.ActivityMethod */ @ActivityInterface public interface GreetingActivities {
// Define your activity method which can be called during workflow execution
@ActivityMethod(name = "greet")
String composeGreeting(String greeting, String name);

}

// Define the workflow implementation which implements our getGreeting workflow method. public static class GreetingWorkflowImpl implements GreetingWorkflow {

/**
 * Define the GreetingActivities stub. Activity stubs are proxies for activity invocations that
 * are executed outside of the workflow thread on the activity worker, that can be on a
 * different host. Temporal is going to dispatch the activity results back to the workflow and
 * unblock the stub as soon as activity is completed on the activity worker.
 *
 * <p>In the {@link ActivityOptions} definition the "setStartToCloseTimeout" option sets the
 * overall timeout that our workflow is willing to wait for activity to complete. For this
 * example it is set to 2 seconds.
 */
private boolean cont = false;

private final GreetingActivities activities =
    Workflow.newActivityStub(
        GreetingActivities.class,
        ActivityOptions.newBuilder().setStartToCloseTimeout(Duration.ofSeconds(2)).build());

@Override
public String getGreeting(String name) {
  // This is a blocking call that returns only after the activity has completed.
  String res = activities.composeGreeting("Hello", name);

  Workflow.await(() -> cont);

  return res;
}

@Override
public void doContinue() {
  this.cont = true;
}

}

/** Simple activity implementation, that concatenates two strings. */ public static class GreetingActivitiesImpl implements GreetingActivities { private static final Logger log = LoggerFactory.getLogger(GreetingActivitiesImpl.class);

@Override
public String composeGreeting(String greeting, String name) {
  log.info("Composing greeting...");
  return greeting + " " + name + "!";
}

}

/**

  • With our Workflow and Activities defined, we can now start execution. The main method starts
  • the worker and then the workflow. */ public static void main(String[] args) {
// Get a Workflow service stub.
WorkflowServiceStubs service = WorkflowServiceStubs.newLocalServiceStubs();

/*
 * Get a Workflow service client which can be used to start, Signal, and Query Workflow Executions.
 */
WorkflowClient client =
    WorkflowClient.newInstance(
        service,
        WorkflowClientOptions.newBuilder()
            .setNamespace("replicationtest")
            .validateAndBuildWithDefaults());

/*
 * Define the workflow factory. It is used to create workflow workers for a specific task queue.
 */
WorkerFactory factory = WorkerFactory.newInstance(client);

/*
 * Define the workflow worker. Workflow workers listen to a defined task queue and process
 * workflows and activities.
 */
Worker worker = factory.newWorker(TASK_QUEUE);

/*
 * Register our workflow implementation with the worker.
 * Workflow implementations must be known to the worker at runtime in
 * order to dispatch workflow tasks.
 */
worker.registerWorkflowImplementationTypes(GreetingWorkflowImpl.class);

/*
 * Register our Activity Types with the Worker. Since Activities are stateless and thread-safe,
 * the Activity Type is a shared instance.
 */
worker.registerActivitiesImplementations(new GreetingActivitiesImpl());

/*
 * Start all the workers registered for a specific task queue.
 * The started workers then start polling for workflows and activities.
 */
factory.start();

// Create the workflow client stub. It is used to start our workflow execution.
for (int i = 0; i < 30; i++) {
  GreetingWorkflow workflow =
      client.newWorkflowStub(
          GreetingWorkflow.class,
          WorkflowOptions.newBuilder()
              .setWorkflowId(WORKFLOW_ID + i)
              .setTaskQueue(TASK_QUEUE)
              .build());

  /*
   * Execute our workflow and wait for it to complete. The call to our getGreeting method is
   * synchronous.
   *
   * See {@link io.temporal.samples.hello.HelloSignal} for an example of starting workflow
   * without waiting synchronously for its result.
   */
  WorkflowClient.start(workflow::getGreeting, "Hello World");
}

sleep(3);

// only send signals to 20 of these execs, leave 10 open w/o signal
for (int j = 0; j < 20; j++) {
  GreetingWorkflow workflow = client.newWorkflowStub(GreetingWorkflow.class, WORKFLOW_ID + j);
  workflow.doContinue();
}

// Display workflow execution results
//    System.out.println(greeting);
//    System.exit(0);

}

private static void sleep(int seconds) { try { Thread.sleep(seconds * 1000L); } catch (Exception e) { System.out.println("*E: " + e.getMessage()); } } }