Package org.flowable.cmmn.api.delegate

# Interface PlanItemFutureJavaDelegate<Output>

Type Parameters:
  `Output` - the output of the execution

All Known Subinterfaces:
  `FlowablePlanItemFutureJavaDelegate<Input,Output>`, `MapBasedFlowablePlanItemFutureJavaDelegate`

public interface PlanItemFutureJavaDelegate<Output>
Convenience class to be used when needing to execute custom logic for a plan item by delegating to a Java class. When this interface is implemented then the execution of the logic can happen on a different thread then the case execution. The plan item is completed, after the future is done.

This interface allows fine grained control on how the future should be created. It gives access to the `AsyncTaskInvoker` which can delegate execution to a shared task executor. However, it doesn't have to be used. In case you don't need custom task executor the `FlowablePlanItemFutureJavaDelegate` can be used.

Author:
  Filip Hrisafov
See Also:
  - `FlowablePlanItemFutureJavaDelegate`
  - `MapBasedFlowablePlanItemFutureJavaDelegate`

- ## Method Summary

  Modifier and Type
  Method
  Description
  `void`
  `afterExecution(DelegatePlanItemInstance planItemInstance, Output executionData)`
  Method invoked with the result from `execute(DelegatePlanItemInstance, AsyncTaskInvoker)`.
  `CompletableFuture<Output>`
  `execute(DelegatePlanItemInstance planItemInstance, AsyncTaskInvoker taskInvoker)`
  Perform the execution of the delegate, potentially on another thread.

- ## Method Details

  - ### execute

    CompletableFuture<Output> execute(DelegatePlanItemInstance planItemInstance, AsyncTaskInvoker taskInvoker)
    Perform the execution of the delegate, potentially on another thread. The result of the future is passed in the `afterExecution(DelegatePlanItemInstance, Object)` in order to store the data on the planItemInstance on the same thread as the caller of this method. IMPORTANT: the planItemInstance should only be used to read data before creating the future. The planItemInstance should not be used in the task that will be executed on a new thread.

    The `AsyncTaskInvoker` is in order to schedule an execution on a different thread. However, it is also possible to use a different scheduler, or return a future not created by the given `taskInvoker`.

    Parameters:
      `planItemInstance` - the planItemInstance that can be used to extract data
      `taskInvoker` - the task invoker that can be used to execute expensive operation on another thread
    Returns:
      the output data of the execution

  - ### afterExecution

    void afterExecution(DelegatePlanItemInstance planItemInstance, Output executionData)
    Method invoked with the result from `execute(DelegatePlanItemInstance, AsyncTaskInvoker)`. This should be used to set data on the `DelegatePlanItemInstance`. This is on the same thread as `execute(DelegatePlanItemInstance, AsyncTaskInvoker)` and participates in the case transaction.
    Parameters:
      `planItemInstance` - the planItemInstance to which data can be set
      `executionData` - the execution data