blob: 99dca3b6629ac5d0a42e20bdec1f5c5c74592b42 [file] [log] [blame]
= Workflow embedded execution in Java
This guide uses a standard Java virtual machine and a small set of Maven dependencies to execute a link:{spec_doc_url}[CNCF Serverless Workflow] definition. Therefore, it is assumed you are fluent both in Java and Maven.
The workflow definition to be executed can be read from a `.json` or `.yaml` file or programmatically defined using the {product_name} fluent API.
.Prerequisites
. Install https://openjdk.org/[OpenJDK] {java_min_version}
. Install https://maven.apache.org/index.html[Apache Maven] {maven_min_version}.
[[embedded-file-quick-start]]
== Hello world (using existing definition file)
The first step is to set up an empty Maven project that includes link:{swf_executor_core_maven_repo_url}[Workflow executor core] dependency.
This guide also uses [slf4j dependency](https://mvnrepository.com/artifact/org.slf4j/slf4j-simple) to avoid using `System.out.println`
Let's assume you already have a workflow definition written in a JSON file in your project root directory. For example, link:{kogito_sw_examples_url}/serverless-workflow-hello-world/src/main/resources/hello.sw.json[Hello World] definition. To execute it, you must write the following main Java class (standard Java imports and package declaration are intentionally skipped for briefness)
[source,java]
----
import org.kie.kogito.serverless.workflow.executor.StaticWorkflowApplication;
import org.kie.kogito.serverless.workflow.models.JsonNodeModel;
import org.kie.kogito.serverless.workflow.utils.ServerlessWorkflowUtils;
import org.kie.kogito.serverless.workflow.utils.WorkflowFormat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import io.serverlessworkflow.api.Workflow;
public class DefinitionFileExecutor {
private static final Logger logger = LoggerFactory.getLogger(DefinitionFileExecutor.class);
public static void main(String[] args) throws IOException {
try (Reader reader = new FileReader("hello.sw.json"); <1>
StaticWorkflowApplication application = StaticWorkflowApplication.create()) { <2>
Workflow workflow = ServerlessWorkflowUtils.getWorkflow(reader, WorkflowFormat.JSON); <3>
JsonNodeModel result = application.execute(workflow, Collections.emptyMap()); <4>
logger.info("Workflow execution result is {}", result.getWorkflowdata()); <5>
}
}
}
----
<1> Reads the workflow file definition from the project root directory
<2> Creates a static workflow application object. It is done within the try block since the instance is `Closeable`. This is the reference that allow you to execute workflow definitions.
<3> Reads the Serverless Workflow Java SDK `Workflow` object from the file.
<4> Execute the workflow, passing `Workflow` reference and no parameters (an empty Map). The result of the workflow execution: process instance id and workflow output model, can accessed using `result` variable.
<5> Prints the workflow model in the configured standard output.
If you compile and execute this Java class, you will see the following log in your configured standard output:
----
Workflow execution result is {"greeting":"Hello World","mantra":"Serverless Workflow is awesome!"}
----
[[embedded-fluent-quick-start]]
== Hello world (using fluent API)
Using the same Maven setup as in the previous section, you can programmatically generate that workflow definition rather than loading it from a file definition by using the link:{kogito_runtimes_url}/kogito-serverless-workflow/kogito-serverless-workflow-fluent/src/main/java/org/kie/kogito/serverless/workflow/fluent[fluent API]
Therefore, you can modify the previous example to generate the same output when it is executed, but rather than creating a `FileReader` that reads the `Workflow` object, we create the `Workflow` object using Java statements. The resulting modified main method is the following
[source,java]
----
try (StaticWorkflowApplication application = StaticWorkflowApplication.create()) {
Workflow workflow = workflow("HelloWorld"). <1>
start( <2>
inject( <3>
jsonObject().put("greeting", "Hello World").put("mantra","Serverless Workflow is awesome!"))) <4>
.end() <5>
.build(); <6>
logger.info("Workflow execution result is {}",application.execute(workflow, Collections.emptyMap()).getWorkflowdata()); <7>
}
----
<1> Creates a workflow which name is `HelloWorld`
<2> Indicate that you are going to specify the start state
<3> A Inject state is the start state
<4> Inject state accepts static json, therefore this line creates the JSON data
<5> End the workflow definition
<6> Build the workflow definition
<7> Execute and print as in previous example
== Further reading
You can find additional and commented examples of fluent API usage (including jq expression evaluation and orchestration of rest services) link:{{kogito_sw_examples_url}/sonataflow-fluent[here]
== Additional resources
include::../../pages/_common-content/report-issue.adoc[]
ifeval::["{kogito_version_redhat}" != ""]
include::../../pages/_common-content/downstream-project-setup-instructions.adoc[]
endif::[]