As I posted in my last blog about JSF and Transactioncontext, it is importend to keep the transaction context in mind when developing a business application within JSF. When you use the Imixs-Workflow Engine you normaly don’t need to think about transactions because Imixs-Workflow takes care about processing a workitem in a full controlled transaction context. But developing with JSF can lead into situations where the business logic is not allways encapsulated correctly in a single transaction. Look at the following example of an Imixs-Workflow web application based on JSF:
//jsf bean...
@EJB WorkflowService workflowService;
...
public String process(ItemCollection workitem) {
workitem=workflowService.process(workitem);
// evaluate result and trigger another process step...
if (workitem.getItemValueString('department').equals('finance')) {
workitem.replaceItemValue('$activity',APPROVE_BY_MANAGEMENT);
workitem=workflowService.process(workitem);
}
....
}
In this example, the process method of the front-end controller evaluates the result of a process step and calls a second process for the same business object. Now you have the problem that the workflowService will run in two separate transactions. As I mentioned in my blog this can result into unexpected database results.
When you are working with Imixs-Workflow, the solution is quite simple: Just put your business logic into Imixs-Workflow Plugi-In. Plug-Ins are always controlled by the WorkflowManager and called inside a single transaction. So there is no risk that your business process runs in an undefined context.
