diff --git a/base/src/org/adempiere/util/ProcessUtil.java b/base/src/org/adempiere/util/ProcessUtil.java index 7405669cd9..be719a71f0 100644 --- a/base/src/org/adempiere/util/ProcessUtil.java +++ b/base/src/org/adempiere/util/ProcessUtil.java @@ -249,7 +249,7 @@ public final class ProcessUtil { MWorkflow wf = MWorkflow.get (ctx, AD_Workflow_ID); MWFProcess wfProcess = null; if (pi.isBatch()) - wfProcess = wf.start(pi); // may return null + wfProcess = wf.start(pi, null); // may return null else wfProcess = wf.startWait(pi); // may return null log.fine(pi.toString()); diff --git a/base/src/org/compiere/wf/DocWorkflowManager.java b/base/src/org/compiere/wf/DocWorkflowManager.java index 436404c0b6..56241dc77f 100644 --- a/base/src/org/compiere/wf/DocWorkflowManager.java +++ b/base/src/org/compiere/wf/DocWorkflowManager.java @@ -125,7 +125,7 @@ public class DocWorkflowManager implements DocWorkflowMgr pi.setAD_User_ID (Env.getAD_User_ID(document.getCtx())); pi.setAD_Client_ID(document.getAD_Client_ID()); // - if (wf.start(pi) != null) + if (wf.start(pi, document.get_TrxName()) != null) { log.config(wf.getName()); m_noStarted++; diff --git a/base/src/org/compiere/wf/MWFActivity.java b/base/src/org/compiere/wf/MWFActivity.java index 791b85131d..4b9bcec1f2 100644 --- a/base/src/org/compiere/wf/MWFActivity.java +++ b/base/src/org/compiere/wf/MWFActivity.java @@ -736,8 +736,9 @@ public class MWFActivity extends X_AD_WF_Activity implements Runnable log.info ("Node=" + getNode()); m_newValue = null; - String trxName = Trx.createTrxName("WF"); - m_trx = Trx.get(trxName, true); + + m_trx = Trx.get(Trx.createTrxName("WFA"), true); + // try { @@ -759,11 +760,6 @@ public class MWFActivity extends X_AD_WF_Activity implements Runnable // Do Work /**** Trx Start ****/ boolean done = performWork(m_trx); - //begin vpj-cd e-evolution 03/08/2005 PostgreSQL - // Reason: When is execute setWFState create a transaction for same table is generate a clicle Trx - // is cause that PostgreSQL wait into transaction idle - //setWFState (done ? StateEngine.STATE_Completed : StateEngine.STATE_Suspended); - //end vpj-cd e-evolution 03/08/2005 PostgreSQL /**** Trx End ****/ // teo_sarca [ 1708835 ] @@ -776,9 +772,9 @@ public class MWFActivity extends X_AD_WF_Activity implements Runnable m_docStatus = DocAction.STATUS_Invalid; throw e; } - //begin vpj-cd e-evolution 03/08/2005 PostgreSQL - //Reason: setWFState moved for the first trx be finished + setWFState (done ? StateEngine.STATE_Completed : StateEngine.STATE_Suspended); + //end vpj-cd e-evolution 03/08/2005 PostgreSQL if (m_postImmediate != null) postImmediate(); @@ -792,6 +788,7 @@ public class MWFActivity extends X_AD_WF_Activity implements Runnable // if (e.getCause() != null) log.log(Level.WARNING, "Cause", e.getCause()); + String processMsg = e.getLocalizedMessage(); if (processMsg == null || processMsg.length() == 0) processMsg = e.getMessage(); diff --git a/base/src/org/compiere/wf/MWFProcess.java b/base/src/org/compiere/wf/MWFProcess.java index eeeb967c6b..198587683d 100644 --- a/base/src/org/compiere/wf/MWFProcess.java +++ b/base/src/org/compiere/wf/MWFProcess.java @@ -72,11 +72,24 @@ public class MWFProcess extends X_AD_WF_Process * New Constructor * @param wf workflow * @param pi Process Info (Record_ID) + * @deprecated * @throws Exception */ public MWFProcess (MWorkflow wf, ProcessInfo pi) throws Exception { - super (wf.getCtx(), 0, wf.get_TrxName()); + this(wf, pi, wf.get_TrxName()); + } + + /** + * New Constructor + * @param wf workflow + * @param pi Process Info (Record_ID) + * @param trxName + * @throws Exception + */ + public MWFProcess (MWorkflow wf, ProcessInfo pi, String trxName) throws Exception + { + super (wf.getCtx(), 0, trxName); if (!TimeUtil.isValid(wf.getValidFrom(), wf.getValidTo())) throw new IllegalStateException("Workflow not valid"); m_wf = wf; @@ -251,6 +264,10 @@ public class MWFProcess extends X_AD_WF_Process + (trxName == null ? "" : "[" + trxName + "]")); if (m_state.isClosed()) return; + + if (lastPO != null && lastPO.get_ID() == this.getRecord_ID()) + m_po = lastPO; + // MWFActivity[] activities = getActivities (true, true, trxName); // requery active String closedState = null; @@ -306,7 +323,7 @@ public class MWFProcess extends X_AD_WF_Process setWFState(closedState); getPO(); if (m_po != null) - m_po.unlock(trxName); + m_po.unlock(null); } else if (suspended) setWFState(WFSTATE_Suspended); @@ -487,7 +504,7 @@ public class MWFProcess extends X_AD_WF_Process activity.run(); } - catch (Exception e) + catch (Throwable e) { log.log(Level.SEVERE, "AD_WF_Node_ID=" + AD_WF_Node_ID, e); setTextMsg(e.toString()); diff --git a/base/src/org/compiere/wf/MWorkflow.java b/base/src/org/compiere/wf/MWorkflow.java index f1f1d0e68f..058e67ca9e 100644 --- a/base/src/org/compiere/wf/MWorkflow.java +++ b/base/src/org/compiere/wf/MWorkflow.java @@ -119,6 +119,8 @@ public class MWorkflow extends X_AD_Workflow } // Look for Entry MWorkflow[] retValue = (MWorkflow[])s_cacheDocValue.get(key); + //hengsin: this is not threadsafe + /* //set trxName to all workflow instance if ( retValue != null && retValue.length > 0 ) { @@ -126,7 +128,7 @@ public class MWorkflow extends X_AD_Workflow { retValue[i].set_TrxName(trxName); } - } + }*/ return retValue; } // getDocValue @@ -643,28 +645,50 @@ public class MWorkflow extends X_AD_Workflow return success; } // afterSave + /************************************************************************** + * Start Workflow. + * @param pi Process Info (Record_ID) + * @deprecated + * @return process + */ + public MWFProcess start (ProcessInfo pi) + { + return start(pi, null); + } /************************************************************************** * Start Workflow. * @param pi Process Info (Record_ID) * @return process */ - public MWFProcess start (ProcessInfo pi) + public MWFProcess start (ProcessInfo pi, String trxName) { MWFProcess retValue = null; + Trx localTrx = null; + if (trxName == null) + localTrx = Trx.get(Trx.createTrxName("WFP"), true); try { - retValue = new MWFProcess (this, pi); + retValue = new MWFProcess (this, pi, trxName != null ? trxName : localTrx.getTrxName()); retValue.save(); - retValue.startWork(); pi.setSummary(Msg.getMsg(getCtx(), "Processing")); + retValue.startWork(); + if (localTrx != null) + localTrx.commit(true); } catch (Exception e) { + if (localTrx != null) + localTrx.rollback(); log.log(Level.SEVERE, e.getLocalizedMessage(), e); pi.setSummary(e.getMessage(), true); retValue = null; } + finally + { + if (localTrx != null) + localTrx.close(); + } return retValue; } // MWFProcess @@ -678,7 +702,7 @@ public class MWorkflow extends X_AD_Workflow final int SLEEP = 500; // 1/2 sec final int MAXLOOPS = 30; // 15 sec // - MWFProcess process = start(pi); + MWFProcess process = start(pi, null); if (process == null) return null; Thread.yield();