• When the activities client method returns, the Promise<T> object is initially in an unready state, which
indicates that the object does not yet represent a valid return value.
• When the corresponding activity method completes its task and returns, the framework assigns the
return value to the Promise<T> object and puts it in the ready state.
Promise<T> Type
The primary purpose of Promise<T> objects is to manage data flow between asynchronous components
and control when they execute. It relieves your application of the need to explicitly manage synchronization
or depend on mechanisms such as timers to ensure that asynchronous components do not execute
prematurely. When you call an activities client method, it immediately returns but the framework defers
executing the corresponding activity method until any input Promise<T> objects are ready and represent
valid data.
From GreeterWorkflowImpl perspective, all three activities client methods return immediately. From
the GreeterActivitiesImpl perspective, the framework doesn't call getGreeting until name
completes, and doesn't call say until getGreeting completes.
By using Promise<T> to pass data from one activity to the next, HelloWorldWorkflow not only ensures
that activity methods don't attempt to use invalid data, it also controls when the activities execute and
implicitly defines the workflow topology. Passing each activity's Promise<T> return value to the next
activity requires the activities to execute in sequence, defining the linear topology discussed earlier. With
AWS Flow Framework for Java, you don't need to use any special modeling code to define even complex
topologies, just standard Java flow control and Promise<T>. For an example of how to implement a
simple parallel topology, see HelloWorldWorkflowParallel Activities Worker (p. 25).
Note
When an activity method such as say doesn't return a value, the corresponding client method
returns a Promise<Void> object. The object doesn't represent data, but it is initially unready
and becomes ready when the activity completes.You can therefore pass a Promise<Void>
object to other activities client methods to ensure that they defer execution until the original
activity completes.
Promise<T> allows a workflow implementation to use activities client methods and their return values
much like synchronous methods. However, you must be careful about accessing a Promise<T> object's
value. Unlike the Java Future<T> type, the framework handles synchronization for Promise<T>, not the
application. If you call Promise<T>.get and the object is not ready, get throws an exception. Notice
that HelloWorldWorkflow never accesses a Promise<T> object directly; it simply passes the objects
from one activity to the next. When an object becomes ready, the framework extracts the value and
passes it to the activity method as a standard type.
Promise<T> objects should be accessed only by asynchronous code, where the framework guarantees
that the object is ready and represents a valid value. HelloWorldWorkflow deals with this issue by
passing Promise<T> objects only to activities client methods.You can access a Promise<T> object's
value in your workflow implementation by passing the object to an asynchronous workflow method, which
behaves much like an activity. For an example, see HelloWorldWorkflowAsync Application (p. 20).
HelloWorldWorkflow Workflow and Activities Host
The workflow and activities implementations have associated worker classes, ActivityWorker and
WorkflowWorker. They handle communication between Amazon SWF and the activities and workflow
implementations by polling the appropriate Amazon SWF task list for tasks, executing the appropriate
method for each task, and managing the data flow. For details, see Application Structure (p. 28)
To associate the activity and workflow implementations with the corresponding worker objects, you
implement one or more worker applications which:
API Version 2012-01-25
14
AWS Flow Framework for Java Developer Guide
HelloWorldWorkflow Workflow and Activities Host