Class JpaFlowExecutionListener
- All Implemented Interfaces:
FlowExecutionListener
FlowExecutionListener
that implements the Flow Managed Persistence Context (FMPC) pattern using the
standard Java Persistence API (JPA).
This implementation uses standard JPA APIs. The general pattern is as follows:
- When a flow execution starts, create a new JPA persistence context and bind it to flow scope under the name
PERSISTENCE_CONTEXT_ATTRIBUTE
. - Before processing a flow execution request, expose the flow-scoped persistence context as the "current" persistence context for the current thread.
- When an existing flow pauses, unbind the persistence context from the current thread.
- When an existing flow ends, commit the changes made to the persistence context in a transaction if the ending state is a commit state. Then, unbind the context and close it.
- Create a new persistence context when a new flow execution with the 'persistenceContext' attribute starts
- Load some objects into this persistence context
- Perform edits to those objects over a series of requests into the flow
- On successful conversation completion, commit and flush those edits to the database, applying a version check if necessary.
Note: All data access except for the final commit will, by default, be non-transactional. However, a flow may call into a transactional service layer to fetch objects during the conversation in the context of a read-only system transaction if the underlying JPA Transaction Manager supports this. Spring's JPA TransactionManager does support this when working with a Hibernate JPA provider, for example. In that case, Spring will handle setting the FlushMode to MANUAL to ensure any in-progress changes to managed persistent entities are not flushed, while reads of new objects occur transactionally.
Care should be taken to prevent premature commits of flow data while the flow is in progress. You would generally not want intermediate flushing to happen, as the nature of a flow implies a transient, isolated resource that can be canceled before it ends. Generally, the only time a read-write transaction should be started is upon successful completion of the flow, triggered by reaching a 'commit' end state.
- Author:
- Keith Donald, Juergen Hoeller
-
Field Summary
Modifier and TypeFieldDescriptionstatic final String
The name of the attribute the flowpersistence context
is indexed under.d -
Constructor Summary
ConstructorDescriptionJpaFlowExecutionListener
(jakarta.persistence.EntityManagerFactory entityManagerFactory, org.springframework.transaction.PlatformTransactionManager transactionManager) Create a new JPA flow execution listener using given JPA Entity Manager factory. -
Method Summary
Modifier and TypeMethodDescriptionvoid
exceptionThrown
(RequestContext context, FlowExecutionException exception) Called when an exception is thrown during a flow execution, before the exception is handled by any registeredhandler
.void
paused
(RequestContext context) Called when a flow execution is paused, for instance when it is waiting for user input (after event processing).void
resuming
(RequestContext context) Called after a flow execution is successfully reactivated after pause (but before event processing).void
sessionEnded
(RequestContext context, FlowSession session, String outcome, AttributeMap<?> output) Called when a flow execution session ends.void
sessionEnding
(RequestContext context, FlowSession session, String outcome, MutableAttributeMap<?> output) Called when the active flow execution session has been asked to end but before it has ended.void
sessionStarting
(RequestContext context, FlowSession session, MutableAttributeMap<?> input) Called after a new flow session has been created but before it starts.Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Methods inherited from interface org.springframework.webflow.execution.FlowExecutionListener
eventSignaled, requestProcessed, requestSubmitted, sessionCreating, sessionStarted, stateEntered, stateEntering, transitionExecuting, viewRendered, viewRendering
-
Field Details
-
PERSISTENCE_CONTEXT_ATTRIBUTE
The name of the attribute the flowpersistence context
is indexed under.d- See Also:
-
-
Constructor Details
-
JpaFlowExecutionListener
public JpaFlowExecutionListener(jakarta.persistence.EntityManagerFactory entityManagerFactory, org.springframework.transaction.PlatformTransactionManager transactionManager) Create a new JPA flow execution listener using given JPA Entity Manager factory.- Parameters:
entityManagerFactory
- the entity manager factory to use
-
-
Method Details
-
sessionStarting
public void sessionStarting(RequestContext context, FlowSession session, MutableAttributeMap<?> input) Description copied from interface:FlowExecutionListener
Called after a new flow session has been created but before it starts. Useful for setting arbitrary attributes in the session before the flow starts.- Specified by:
sessionStarting
in interfaceFlowExecutionListener
- Parameters:
context
- the current flow request contextsession
- the session that was createdinput
- a mutable input map - attributes placed in this map are eligible for input mapping by the flow definition at startup
-
paused
Description copied from interface:FlowExecutionListener
Called when a flow execution is paused, for instance when it is waiting for user input (after event processing).- Specified by:
paused
in interfaceFlowExecutionListener
- Parameters:
context
- the current flow request context
-
resuming
Description copied from interface:FlowExecutionListener
Called after a flow execution is successfully reactivated after pause (but before event processing).- Specified by:
resuming
in interfaceFlowExecutionListener
- Parameters:
context
- the current flow request context
-
sessionEnding
public void sessionEnding(RequestContext context, FlowSession session, String outcome, MutableAttributeMap<?> output) Description copied from interface:FlowExecutionListener
Called when the active flow execution session has been asked to end but before it has ended.- Specified by:
sessionEnding
in interfaceFlowExecutionListener
- Parameters:
context
- the current flow request contextsession
- the current active session that is endingoutcome
- the outcome reached by the ending session, generally the id of the terminating end-stateoutput
- the flow output produced by the ending session, this map may be modified by this listener to affect the output returned
-
sessionEnded
public void sessionEnded(RequestContext context, FlowSession session, String outcome, AttributeMap<?> output) Description copied from interface:FlowExecutionListener
Called when a flow execution session ends. If the ended session was the root session of the flow execution, the entire flow execution also ends.- Specified by:
sessionEnded
in interfaceFlowExecutionListener
- Parameters:
context
- the current flow request contextsession
- ending flow sessionoutcome
- the outcome reached by the ended session, generally the id of the terminating end-stateoutput
- the flow output returned by the ending session
-
exceptionThrown
Description copied from interface:FlowExecutionListener
Called when an exception is thrown during a flow execution, before the exception is handled by any registeredhandler
.- Specified by:
exceptionThrown
in interfaceFlowExecutionListener
- Parameters:
context
- the current flow request contextexception
- the exception that occurred
-