:(
I thought we stopped using Javolution. Adrian Crum Sandglass Software www.sandglass-software.com On 8/9/2014 10:00 AM, [hidden email] wrote: > Author: lektran > Date: Sat Aug 9 09:00:39 2014 > New Revision: 1616925 > > URL: http://svn.apache.org/r1616925 > Log: > Replace the ServiceXaWrapper with a simpler Synchronization implementation. Helps pave the way for use of alternative transaction management libraries that don't work well with our XA wrapper implementations. Still DebugXaResource to go. > > Added: > ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java (with props) > Modified: > ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkServices.java > ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java > ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java > ofbiz/trunk/framework/service/src/org/ofbiz/service/LocalDispatcher.java > ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceXaWrapper.java > ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaAction.java > > Modified: ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkServices.java > URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkServices.java?rev=1616925&r1=1616924&r2=1616925&view=diff > ============================================================================== > --- ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkServices.java (original) > +++ ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkServices.java Sat Aug 9 09:00:39 2014 > @@ -24,8 +24,6 @@ import java.util.Locale; > import java.util.Map; > import java.util.Properties; > > -import javax.transaction.xa.XAException; > - > import javolution.util.FastMap; > > import org.ofbiz.base.util.Debug; > @@ -48,7 +46,6 @@ import org.ofbiz.service.GenericServiceE > import org.ofbiz.service.LocalDispatcher; > import org.ofbiz.service.ModelService; > import org.ofbiz.service.ServiceUtil; > -import org.ofbiz.service.ServiceXaWrapper; > > /** > * ValueLinkServices - Integration with ValueLink Gift Cards > @@ -792,13 +789,11 @@ public class ValueLinkServices { > // Activate/Rollback is not supported by valuelink > if (!vlInterface.equals("Activate")) { > // create the listener > - ServiceXaWrapper xaw = new ServiceXaWrapper(dctx); > - xaw.setRollbackService("vlTimeOutReversal", context); > - //xaw.setCommitService("vlTimeOutReversal", context); > Debug.logInfo("Set 704 context : " + context, module); > try { > - xaw.enlist(); > - } catch (XAException e) { > + dctx.getDispatcher().addRollbackService("vlTimeOutReversal", context, false); > + //dctx.getDispatcher().addCommitService("vlTimeOutReversal", context, false); > + } catch (GenericServiceException e) { > Debug.logError(e, "Unable to setup 0704 Timeout Reversal", module); > } > } > @@ -1214,14 +1209,10 @@ public class ValueLinkServices { > } > > if (!failure) { > - // set the void on rollback wrapper > - ServiceXaWrapper xaw = new ServiceXaWrapper(dctx); > - activateCtx.put("cardNumber", activateResult.get("cardNumber")); > - activateCtx.put("pin", activateResult.get("pin")); > - xaw.setRollbackService("voidActivateGiftCard", activateCtx); > + // set the void on rollback > try { > - xaw.enlist(); > - } catch (XAException e) { > + dispatcher.addRollbackService("voidActivateGiftCard", activateCtx, false); > + } catch (GenericServiceException e) { > Debug.logError(e, "Unable to setup Activate/Void on error", module); > } > } > > Modified: ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java > URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java?rev=1616925&r1=1616924&r2=1616925&view=diff > ============================================================================== > --- ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java (original) > +++ ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java Sat Aug 9 09:00:39 2014 > @@ -40,7 +40,6 @@ import java.util.Set; > import java.util.TreeSet; > > import javax.mail.internet.MimeMessage; > -import javax.transaction.xa.XAException; > > import javolution.util.FastList; > import javolution.util.FastMap; > @@ -65,8 +64,8 @@ import org.ofbiz.service.DispatchContext > import org.ofbiz.service.GenericServiceException; > import org.ofbiz.service.LocalDispatcher; > import org.ofbiz.service.ModelService; > +import org.ofbiz.service.ServiceSynchronization; > import org.ofbiz.service.ServiceUtil; > -import org.ofbiz.service.ServiceXaWrapper; > import org.ofbiz.service.mail.MimeMessageWrapper; > import org.owasp.esapi.errors.EncodingException; > > @@ -142,23 +141,19 @@ public class CommonServices { > } > > public static Map<String, Object> testRollbackListener(DispatchContext dctx, Map<String, ?> context) { > - Locale locale = (Locale) context.get("locale"); > - ServiceXaWrapper xar = new ServiceXaWrapper(dctx); > - xar.setRollbackService("testScv", context); > try { > - xar.enlist(); > - } catch (XAException e) { > + ServiceSynchronization.registerRollbackService(dctx, "testScv", null, context, false, false); > + } catch (GenericServiceException e) { > Debug.logError(e, module); > } > + Locale locale = (Locale) context.get("locale"); > return ServiceUtil.returnError(UtilProperties.getMessage(resource, "CommonTestRollingBack", locale)); > } > > public static Map<String, Object> testCommitListener(DispatchContext dctx, Map<String, ?> context) { > - ServiceXaWrapper xar = new ServiceXaWrapper(dctx); > - xar.setCommitService("testScv", context); > try { > - xar.enlist(); > - } catch (XAException e) { > + ServiceSynchronization.registerCommitService(dctx, "testScv", null, context, false, false); > + } catch (GenericServiceException e) { > Debug.logError(e, module); > } > return ServiceUtil.returnSuccess(); > > Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java > URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java?rev=1616925&r1=1616924&r2=1616925&view=diff > ============================================================================== > --- ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java (original) > +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java Sat Aug 9 09:00:39 2014 > @@ -22,7 +22,6 @@ import java.util.Date; > import java.util.Map; > > import javax.transaction.Transaction; > -import javax.transaction.xa.XAException; > > import org.ofbiz.service.calendar.RecurrenceRule; > import org.ofbiz.entity.Delegator; > @@ -117,14 +116,7 @@ public abstract class GenericAbstractDis > } > > public void addRollbackService(String serviceName, Map<String, ? extends Object> context, boolean persist) throws GenericServiceException { > - ServiceXaWrapper xa = new ServiceXaWrapper(this.getDispatchContext()); > - xa.setRollbackService(serviceName, context, true, persist); > - try { > - xa.enlist(); > - } catch (XAException e) { > - Debug.logError(e, module); > - throw new GenericServiceException(e.getMessage(), e); > - } > + ServiceSynchronization.registerRollbackService(this.getDispatchContext(), serviceName, null, context, true, persist); > } > > public void addRollbackService(String serviceName, boolean persist, Object... context) throws GenericServiceException { > @@ -132,14 +124,7 @@ public abstract class GenericAbstractDis > } > > public void addCommitService(String serviceName, Map<String, ? extends Object> context, boolean persist) throws GenericServiceException { > - ServiceXaWrapper xa = new ServiceXaWrapper(this.getDispatchContext()); > - xa.setCommitService(serviceName, context, true, persist); > - try { > - xa.enlist(); > - } catch (XAException e) { > - Debug.logError(e, module); > - throw new GenericServiceException(e.getMessage(), e); > - } > + ServiceSynchronization.registerCommitService(this.getDispatchContext(), serviceName, null, context, true, persist); > } > > public void addCommitService(String serviceName, boolean persist, Object... context) throws GenericServiceException { > > Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/LocalDispatcher.java > URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/LocalDispatcher.java?rev=1616925&r1=1616924&r2=1616925&view=diff > ============================================================================== > --- ofbiz/trunk/framework/service/src/org/ofbiz/service/LocalDispatcher.java (original) > +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/LocalDispatcher.java Sat Aug 9 09:00:39 2014 > @@ -281,7 +281,7 @@ public interface LocalDispatcher { > > > /** > - * Adds a rollback service to the current TX using the ServiceXaWrapper > + * Adds a rollback service to the current TX using ServiceSynchronization > * @param serviceName > * @param context > * @param persist > @@ -291,7 +291,7 @@ public interface LocalDispatcher { > public void addRollbackService(String serviceName, boolean persist, Object... context) throws GenericServiceException; > > /** > - * Adds a commit service to the current TX using the ServiceXaWrapper > + * Adds a commit service to the current TX using ServiceSynchronization > * @param serviceName > * @param context > * @param persist > > Added: ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java > URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java?rev=1616925&view=auto > ============================================================================== > --- ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java (added) > +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java Sat Aug 9 09:00:39 2014 > @@ -0,0 +1,167 @@ > +package org.ofbiz.service; > + > +import java.util.List; > +import java.util.Map; > +import java.util.WeakHashMap; > + > +import javax.transaction.RollbackException; > +import javax.transaction.Status; > +import javax.transaction.Synchronization; > +import javax.transaction.SystemException; > +import javax.transaction.Transaction; > + > +import javolution.util.FastList; > +import javolution.util.FastMap; > + > +import org.ofbiz.base.util.Debug; > +import org.ofbiz.entity.transaction.GenericTransactionException; > +import org.ofbiz.entity.transaction.TransactionFactory; > +import org.ofbiz.entity.transaction.TransactionUtil; > + > +/** > + * This class is used to execute services when a transaction is either > + * committed or rolled back. It should generally be accessed via > + * LocalDispatcher's addCommitService and addRollbackService methods > + * or by using the service ECA event attribute values global-commit, > + * global-rollback or global-commit-post-run > + * > + */ > +public class ServiceSynchronization implements Synchronization { > + > + public static final String MODULE = ServiceSynchronization.class.getName(); > + > + private static Map<Transaction, ServiceSynchronization> syncingleton = new WeakHashMap<Transaction, ServiceSynchronization>(); > + private List<ServiceExecution> services = FastList.newInstance(); > + > + public static void registerCommitService(DispatchContext dctx, String serviceName, String runAsUser, Map<String, ? extends Object> context, boolean async, boolean persist) throws GenericServiceException { > + ServiceSynchronization sync = ServiceSynchronization.getInstance(); > + if (sync != null) { > + sync.services.add(new ServiceExecution(dctx, serviceName, runAsUser, context, async, persist, false)); > + } > + } > + > + public static void registerRollbackService(DispatchContext dctx, String serviceName, String runAsUser, Map<String, ? extends Object> context, boolean async, boolean persist) throws GenericServiceException { > + ServiceSynchronization sync = ServiceSynchronization.getInstance(); > + if (sync != null) { > + sync.services.add(new ServiceExecution(dctx, serviceName, runAsUser, context, async, persist, true)); > + } > + } > + > + protected static ServiceSynchronization getInstance() throws GenericServiceException { > + ServiceSynchronization sync = null; > + try { > + Transaction transaction = TransactionFactory.getTransactionManager().getTransaction(); > + synchronized (transaction) { > + sync = syncingleton.get(transaction); > + if (sync == null) { > + sync = new ServiceSynchronization(); > + transaction.registerSynchronization(sync); > + syncingleton.put(transaction, sync); > + } > + } > + } catch (SystemException e) { > + throw new GenericServiceException(e.getMessage(), e); > + } catch (IllegalStateException e) { > + throw new GenericServiceException(e.getMessage(), e); > + } catch (RollbackException e) { > + throw new GenericServiceException(e.getMessage(), e); > + } > + return sync; > + } > + > + @Override > + public void afterCompletion(int status) { > + for (ServiceExecution serviceExec : this.services) { > + serviceExec.runService(status); > + } > + } > + > + @Override > + public void beforeCompletion() { > + > + } > + > + static class ServiceExecution { > + protected DispatchContext dctx = null; > + protected String serviceName; > + protected String runAsUser = null; > + protected Map<String, ? extends Object> context = null; > + protected boolean rollback = false; > + protected boolean persist = true; > + protected boolean async = false; > + > + ServiceExecution(DispatchContext dctx, String serviceName, String runAsUser, Map<String, ? extends Object> context, boolean async, boolean persist, boolean rollback) { > + this.dctx = dctx; > + this.serviceName = serviceName; > + this.runAsUser = runAsUser; > + this.context = context; > + this.async = async; > + this.persist = persist; > + this.rollback = rollback; > + } > + > + protected void runService(int status) { > + if ((status == Status.STATUS_COMMITTED && !rollback) || (status == Status.STATUS_ROLLEDBACK && rollback)) { > + Thread thread = new Thread() { > + @Override > + public void run() { > + String msgPrefix = null; > + if (rollback) { > + msgPrefix = "[Rollback] "; > + } else { > + msgPrefix = "[Commit] "; > + } > + > + boolean beganTx; > + try { > + // begin the new tx > + beganTx = TransactionUtil.begin(); > + // configure and run the service > + try { > + // obtain the model and get the valid context > + ModelService model = dctx.getModelService(serviceName); > + Map<String, Object> thisContext; > + if (model.validate) { > + thisContext = model.makeValid(context, ModelService.IN_PARAM); > + } else { > + thisContext = FastMap.newInstance(); > + thisContext.putAll(context); > + } > + > + // set the userLogin object > + thisContext.put("userLogin", ServiceUtil.getUserLogin(dctx, thisContext, runAsUser)); > + if (async) { > + if (Debug.infoOn()) Debug.logInfo(msgPrefix + "Invoking [" + serviceName + "] via runAsync", MODULE); > + dctx.getDispatcher().runAsync(serviceName, thisContext, persist); > + } else { > + if (Debug.infoOn()) Debug.logInfo(msgPrefix + "Invoking [" + serviceName + "] via runSyncIgnore", MODULE); > + dctx.getDispatcher().runSyncIgnore(serviceName, thisContext); > + } > + } catch (Throwable t) { > + Debug.logError(t, "Problem calling " + msgPrefix + "service : " + serviceName + " / " + context, MODULE); > + try { > + TransactionUtil.rollback(beganTx, t.getMessage(), t); > + } catch (GenericTransactionException e) { > + Debug.logError(e, MODULE); > + } > + > + } finally { > + // commit the transaction > + try { > + TransactionUtil.commit(beganTx); > + } catch (GenericTransactionException e) { > + Debug.logError(e, MODULE); > + } > + } > + } catch (GenericTransactionException e) { > + Debug.logError(e, MODULE); > + } > + > + } > + }; > + thread.start(); > + } > + } > + } > + > +} > > Propchange: ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java > ------------------------------------------------------------------------------ > svn:eol-style = native > > Propchange: ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java > ------------------------------------------------------------------------------ > svn:keywords = "Date Rev Author URL Id" > > Propchange: ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java > ------------------------------------------------------------------------------ > svn:mime-type = text/plain > > Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceXaWrapper.java > URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceXaWrapper.java?rev=1616925&r1=1616924&r2=1616925&view=diff > ============================================================================== > --- ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceXaWrapper.java (original) > +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceXaWrapper.java Sat Aug 9 09:00:39 2014 > @@ -34,7 +34,9 @@ import org.ofbiz.entity.transaction.Tran > > /** > * ServiceXaWrapper - XA Resource wrapper for running services on commit() or rollback() > + * @deprecated - Use ServiceSynchronization instead (via LocalDispatcher) > */ > +@Deprecated > public class ServiceXaWrapper extends GenericXaResource { > > public static final String module = ServiceXaWrapper.class.getName(); > > Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaAction.java > URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaAction.java?rev=1616925&r1=1616924&r2=1616925&view=diff > ============================================================================== > --- ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaAction.java (original) > +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaAction.java Sat Aug 9 09:00:39 2014 > @@ -22,8 +22,6 @@ import java.util.LinkedList; > import java.util.List; > import java.util.Map; > > -import javax.transaction.xa.XAException; > - > import javolution.util.FastMap; > > import org.ofbiz.base.util.Debug; > @@ -33,8 +31,8 @@ import org.ofbiz.service.DispatchContext > import org.ofbiz.service.GenericServiceException; > import org.ofbiz.service.LocalDispatcher; > import org.ofbiz.service.ModelService; > +import org.ofbiz.service.ServiceSynchronization; > import org.ofbiz.service.ServiceUtil; > -import org.ofbiz.service.ServiceXaWrapper; > import org.w3c.dom.Element; > > /** > @@ -115,19 +113,12 @@ public class ServiceEcaAction implements > } > > if (eventName.startsWith("global-")) { > - // XA resource ECA > - ServiceXaWrapper xaw = new ServiceXaWrapper(dctx); > if (eventName.equals("global-rollback")) { > - xaw.setRollbackService(serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates > + ServiceSynchronization.registerRollbackService(dctx, serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates > } else if (eventName.equals("global-commit")) { > - xaw.setCommitService(serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates > + ServiceSynchronization.registerCommitService(dctx, serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates > } else if (eventName.equals("global-commit-post-run")) { > - xaw.setCommitService(serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates > - } > - try { > - xaw.enlist(); > - } catch (XAException e) { > - throw new GenericServiceException("Unable to enlist ServiceXaWrapper with transaction", e); > + ServiceSynchronization.registerCommitService(dctx, serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates > } > } else { > // standard ECA > > |
Oh sorry, force of habit I guess. If we've stopped using it, why haven't we removed the libs? That's a sure fire way of preventing its use!
Regards Scott On 9/08/2014, at 12:24 pm, Adrian Crum <[hidden email]> wrote: > :( > > I thought we stopped using Javolution. > > Adrian Crum > Sandglass Software > www.sandglass-software.com > > On 8/9/2014 10:00 AM, [hidden email] wrote: >> Author: lektran >> Date: Sat Aug 9 09:00:39 2014 >> New Revision: 1616925 >> >> URL: http://svn.apache.org/r1616925 >> Log: >> Replace the ServiceXaWrapper with a simpler Synchronization implementation. Helps pave the way for use of alternative transaction management libraries that don't work well with our XA wrapper implementations. Still DebugXaResource to go. >> >> Added: >> ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java (with props) >> Modified: >> ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkServices.java >> ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java >> ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java >> ofbiz/trunk/framework/service/src/org/ofbiz/service/LocalDispatcher.java >> ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceXaWrapper.java >> ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaAction.java >> >> Modified: ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkServices.java >> URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkServices.java?rev=1616925&r1=1616924&r2=1616925&view=diff >> ============================================================================== >> --- ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkServices.java (original) >> +++ ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkServices.java Sat Aug 9 09:00:39 2014 >> @@ -24,8 +24,6 @@ import java.util.Locale; >> import java.util.Map; >> import java.util.Properties; >> >> -import javax.transaction.xa.XAException; >> - >> import javolution.util.FastMap; >> >> import org.ofbiz.base.util.Debug; >> @@ -48,7 +46,6 @@ import org.ofbiz.service.GenericServiceE >> import org.ofbiz.service.LocalDispatcher; >> import org.ofbiz.service.ModelService; >> import org.ofbiz.service.ServiceUtil; >> -import org.ofbiz.service.ServiceXaWrapper; >> >> /** >> * ValueLinkServices - Integration with ValueLink Gift Cards >> @@ -792,13 +789,11 @@ public class ValueLinkServices { >> // Activate/Rollback is not supported by valuelink >> if (!vlInterface.equals("Activate")) { >> // create the listener >> - ServiceXaWrapper xaw = new ServiceXaWrapper(dctx); >> - xaw.setRollbackService("vlTimeOutReversal", context); >> - //xaw.setCommitService("vlTimeOutReversal", context); >> Debug.logInfo("Set 704 context : " + context, module); >> try { >> - xaw.enlist(); >> - } catch (XAException e) { >> + dctx.getDispatcher().addRollbackService("vlTimeOutReversal", context, false); >> + //dctx.getDispatcher().addCommitService("vlTimeOutReversal", context, false); >> + } catch (GenericServiceException e) { >> Debug.logError(e, "Unable to setup 0704 Timeout Reversal", module); >> } >> } >> @@ -1214,14 +1209,10 @@ public class ValueLinkServices { >> } >> >> if (!failure) { >> - // set the void on rollback wrapper >> - ServiceXaWrapper xaw = new ServiceXaWrapper(dctx); >> - activateCtx.put("cardNumber", activateResult.get("cardNumber")); >> - activateCtx.put("pin", activateResult.get("pin")); >> - xaw.setRollbackService("voidActivateGiftCard", activateCtx); >> + // set the void on rollback >> try { >> - xaw.enlist(); >> - } catch (XAException e) { >> + dispatcher.addRollbackService("voidActivateGiftCard", activateCtx, false); >> + } catch (GenericServiceException e) { >> Debug.logError(e, "Unable to setup Activate/Void on error", module); >> } >> } >> >> Modified: ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java >> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java?rev=1616925&r1=1616924&r2=1616925&view=diff >> ============================================================================== >> --- ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java (original) >> +++ ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java Sat Aug 9 09:00:39 2014 >> @@ -40,7 +40,6 @@ import java.util.Set; >> import java.util.TreeSet; >> >> import javax.mail.internet.MimeMessage; >> -import javax.transaction.xa.XAException; >> >> import javolution.util.FastList; >> import javolution.util.FastMap; >> @@ -65,8 +64,8 @@ import org.ofbiz.service.DispatchContext >> import org.ofbiz.service.GenericServiceException; >> import org.ofbiz.service.LocalDispatcher; >> import org.ofbiz.service.ModelService; >> +import org.ofbiz.service.ServiceSynchronization; >> import org.ofbiz.service.ServiceUtil; >> -import org.ofbiz.service.ServiceXaWrapper; >> import org.ofbiz.service.mail.MimeMessageWrapper; >> import org.owasp.esapi.errors.EncodingException; >> >> @@ -142,23 +141,19 @@ public class CommonServices { >> } >> >> public static Map<String, Object> testRollbackListener(DispatchContext dctx, Map<String, ?> context) { >> - Locale locale = (Locale) context.get("locale"); >> - ServiceXaWrapper xar = new ServiceXaWrapper(dctx); >> - xar.setRollbackService("testScv", context); >> try { >> - xar.enlist(); >> - } catch (XAException e) { >> + ServiceSynchronization.registerRollbackService(dctx, "testScv", null, context, false, false); >> + } catch (GenericServiceException e) { >> Debug.logError(e, module); >> } >> + Locale locale = (Locale) context.get("locale"); >> return ServiceUtil.returnError(UtilProperties.getMessage(resource, "CommonTestRollingBack", locale)); >> } >> >> public static Map<String, Object> testCommitListener(DispatchContext dctx, Map<String, ?> context) { >> - ServiceXaWrapper xar = new ServiceXaWrapper(dctx); >> - xar.setCommitService("testScv", context); >> try { >> - xar.enlist(); >> - } catch (XAException e) { >> + ServiceSynchronization.registerCommitService(dctx, "testScv", null, context, false, false); >> + } catch (GenericServiceException e) { >> Debug.logError(e, module); >> } >> return ServiceUtil.returnSuccess(); >> >> Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java >> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java?rev=1616925&r1=1616924&r2=1616925&view=diff >> ============================================================================== >> --- ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java (original) >> +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java Sat Aug 9 09:00:39 2014 >> @@ -22,7 +22,6 @@ import java.util.Date; >> import java.util.Map; >> >> import javax.transaction.Transaction; >> -import javax.transaction.xa.XAException; >> >> import org.ofbiz.service.calendar.RecurrenceRule; >> import org.ofbiz.entity.Delegator; >> @@ -117,14 +116,7 @@ public abstract class GenericAbstractDis >> } >> >> public void addRollbackService(String serviceName, Map<String, ? extends Object> context, boolean persist) throws GenericServiceException { >> - ServiceXaWrapper xa = new ServiceXaWrapper(this.getDispatchContext()); >> - xa.setRollbackService(serviceName, context, true, persist); >> - try { >> - xa.enlist(); >> - } catch (XAException e) { >> - Debug.logError(e, module); >> - throw new GenericServiceException(e.getMessage(), e); >> - } >> + ServiceSynchronization.registerRollbackService(this.getDispatchContext(), serviceName, null, context, true, persist); >> } >> >> public void addRollbackService(String serviceName, boolean persist, Object... context) throws GenericServiceException { >> @@ -132,14 +124,7 @@ public abstract class GenericAbstractDis >> } >> >> public void addCommitService(String serviceName, Map<String, ? extends Object> context, boolean persist) throws GenericServiceException { >> - ServiceXaWrapper xa = new ServiceXaWrapper(this.getDispatchContext()); >> - xa.setCommitService(serviceName, context, true, persist); >> - try { >> - xa.enlist(); >> - } catch (XAException e) { >> - Debug.logError(e, module); >> - throw new GenericServiceException(e.getMessage(), e); >> - } >> + ServiceSynchronization.registerCommitService(this.getDispatchContext(), serviceName, null, context, true, persist); >> } >> >> public void addCommitService(String serviceName, boolean persist, Object... context) throws GenericServiceException { >> >> Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/LocalDispatcher.java >> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/LocalDispatcher.java?rev=1616925&r1=1616924&r2=1616925&view=diff >> ============================================================================== >> --- ofbiz/trunk/framework/service/src/org/ofbiz/service/LocalDispatcher.java (original) >> +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/LocalDispatcher.java Sat Aug 9 09:00:39 2014 >> @@ -281,7 +281,7 @@ public interface LocalDispatcher { >> >> >> /** >> - * Adds a rollback service to the current TX using the ServiceXaWrapper >> + * Adds a rollback service to the current TX using ServiceSynchronization >> * @param serviceName >> * @param context >> * @param persist >> @@ -291,7 +291,7 @@ public interface LocalDispatcher { >> public void addRollbackService(String serviceName, boolean persist, Object... context) throws GenericServiceException; >> >> /** >> - * Adds a commit service to the current TX using the ServiceXaWrapper >> + * Adds a commit service to the current TX using ServiceSynchronization >> * @param serviceName >> * @param context >> * @param persist >> >> Added: ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java >> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java?rev=1616925&view=auto >> ============================================================================== >> --- ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java (added) >> +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java Sat Aug 9 09:00:39 2014 >> @@ -0,0 +1,167 @@ >> +package org.ofbiz.service; >> + >> +import java.util.List; >> +import java.util.Map; >> +import java.util.WeakHashMap; >> + >> +import javax.transaction.RollbackException; >> +import javax.transaction.Status; >> +import javax.transaction.Synchronization; >> +import javax.transaction.SystemException; >> +import javax.transaction.Transaction; >> + >> +import javolution.util.FastList; >> +import javolution.util.FastMap; >> + >> +import org.ofbiz.base.util.Debug; >> +import org.ofbiz.entity.transaction.GenericTransactionException; >> +import org.ofbiz.entity.transaction.TransactionFactory; >> +import org.ofbiz.entity.transaction.TransactionUtil; >> + >> +/** >> + * This class is used to execute services when a transaction is either >> + * committed or rolled back. It should generally be accessed via >> + * LocalDispatcher's addCommitService and addRollbackService methods >> + * or by using the service ECA event attribute values global-commit, >> + * global-rollback or global-commit-post-run >> + * >> + */ >> +public class ServiceSynchronization implements Synchronization { >> + >> + public static final String MODULE = ServiceSynchronization.class.getName(); >> + >> + private static Map<Transaction, ServiceSynchronization> syncingleton = new WeakHashMap<Transaction, ServiceSynchronization>(); >> + private List<ServiceExecution> services = FastList.newInstance(); >> + >> + public static void registerCommitService(DispatchContext dctx, String serviceName, String runAsUser, Map<String, ? extends Object> context, boolean async, boolean persist) throws GenericServiceException { >> + ServiceSynchronization sync = ServiceSynchronization.getInstance(); >> + if (sync != null) { >> + sync.services.add(new ServiceExecution(dctx, serviceName, runAsUser, context, async, persist, false)); >> + } >> + } >> + >> + public static void registerRollbackService(DispatchContext dctx, String serviceName, String runAsUser, Map<String, ? extends Object> context, boolean async, boolean persist) throws GenericServiceException { >> + ServiceSynchronization sync = ServiceSynchronization.getInstance(); >> + if (sync != null) { >> + sync.services.add(new ServiceExecution(dctx, serviceName, runAsUser, context, async, persist, true)); >> + } >> + } >> + >> + protected static ServiceSynchronization getInstance() throws GenericServiceException { >> + ServiceSynchronization sync = null; >> + try { >> + Transaction transaction = TransactionFactory.getTransactionManager().getTransaction(); >> + synchronized (transaction) { >> + sync = syncingleton.get(transaction); >> + if (sync == null) { >> + sync = new ServiceSynchronization(); >> + transaction.registerSynchronization(sync); >> + syncingleton.put(transaction, sync); >> + } >> + } >> + } catch (SystemException e) { >> + throw new GenericServiceException(e.getMessage(), e); >> + } catch (IllegalStateException e) { >> + throw new GenericServiceException(e.getMessage(), e); >> + } catch (RollbackException e) { >> + throw new GenericServiceException(e.getMessage(), e); >> + } >> + return sync; >> + } >> + >> + @Override >> + public void afterCompletion(int status) { >> + for (ServiceExecution serviceExec : this.services) { >> + serviceExec.runService(status); >> + } >> + } >> + >> + @Override >> + public void beforeCompletion() { >> + >> + } >> + >> + static class ServiceExecution { >> + protected DispatchContext dctx = null; >> + protected String serviceName; >> + protected String runAsUser = null; >> + protected Map<String, ? extends Object> context = null; >> + protected boolean rollback = false; >> + protected boolean persist = true; >> + protected boolean async = false; >> + >> + ServiceExecution(DispatchContext dctx, String serviceName, String runAsUser, Map<String, ? extends Object> context, boolean async, boolean persist, boolean rollback) { >> + this.dctx = dctx; >> + this.serviceName = serviceName; >> + this.runAsUser = runAsUser; >> + this.context = context; >> + this.async = async; >> + this.persist = persist; >> + this.rollback = rollback; >> + } >> + >> + protected void runService(int status) { >> + if ((status == Status.STATUS_COMMITTED && !rollback) || (status == Status.STATUS_ROLLEDBACK && rollback)) { >> + Thread thread = new Thread() { >> + @Override >> + public void run() { >> + String msgPrefix = null; >> + if (rollback) { >> + msgPrefix = "[Rollback] "; >> + } else { >> + msgPrefix = "[Commit] "; >> + } >> + >> + boolean beganTx; >> + try { >> + // begin the new tx >> + beganTx = TransactionUtil.begin(); >> + // configure and run the service >> + try { >> + // obtain the model and get the valid context >> + ModelService model = dctx.getModelService(serviceName); >> + Map<String, Object> thisContext; >> + if (model.validate) { >> + thisContext = model.makeValid(context, ModelService.IN_PARAM); >> + } else { >> + thisContext = FastMap.newInstance(); >> + thisContext.putAll(context); >> + } >> + >> + // set the userLogin object >> + thisContext.put("userLogin", ServiceUtil.getUserLogin(dctx, thisContext, runAsUser)); >> + if (async) { >> + if (Debug.infoOn()) Debug.logInfo(msgPrefix + "Invoking [" + serviceName + "] via runAsync", MODULE); >> + dctx.getDispatcher().runAsync(serviceName, thisContext, persist); >> + } else { >> + if (Debug.infoOn()) Debug.logInfo(msgPrefix + "Invoking [" + serviceName + "] via runSyncIgnore", MODULE); >> + dctx.getDispatcher().runSyncIgnore(serviceName, thisContext); >> + } >> + } catch (Throwable t) { >> + Debug.logError(t, "Problem calling " + msgPrefix + "service : " + serviceName + " / " + context, MODULE); >> + try { >> + TransactionUtil.rollback(beganTx, t.getMessage(), t); >> + } catch (GenericTransactionException e) { >> + Debug.logError(e, MODULE); >> + } >> + >> + } finally { >> + // commit the transaction >> + try { >> + TransactionUtil.commit(beganTx); >> + } catch (GenericTransactionException e) { >> + Debug.logError(e, MODULE); >> + } >> + } >> + } catch (GenericTransactionException e) { >> + Debug.logError(e, MODULE); >> + } >> + >> + } >> + }; >> + thread.start(); >> + } >> + } >> + } >> + >> +} >> >> Propchange: ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java >> ------------------------------------------------------------------------------ >> svn:eol-style = native >> >> Propchange: ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java >> ------------------------------------------------------------------------------ >> svn:keywords = "Date Rev Author URL Id" >> >> Propchange: ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java >> ------------------------------------------------------------------------------ >> svn:mime-type = text/plain >> >> Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceXaWrapper.java >> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceXaWrapper.java?rev=1616925&r1=1616924&r2=1616925&view=diff >> ============================================================================== >> --- ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceXaWrapper.java (original) >> +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceXaWrapper.java Sat Aug 9 09:00:39 2014 >> @@ -34,7 +34,9 @@ import org.ofbiz.entity.transaction.Tran >> >> /** >> * ServiceXaWrapper - XA Resource wrapper for running services on commit() or rollback() >> + * @deprecated - Use ServiceSynchronization instead (via LocalDispatcher) >> */ >> +@Deprecated >> public class ServiceXaWrapper extends GenericXaResource { >> >> public static final String module = ServiceXaWrapper.class.getName(); >> >> Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaAction.java >> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaAction.java?rev=1616925&r1=1616924&r2=1616925&view=diff >> ============================================================================== >> --- ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaAction.java (original) >> +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaAction.java Sat Aug 9 09:00:39 2014 >> @@ -22,8 +22,6 @@ import java.util.LinkedList; >> import java.util.List; >> import java.util.Map; >> >> -import javax.transaction.xa.XAException; >> - >> import javolution.util.FastMap; >> >> import org.ofbiz.base.util.Debug; >> @@ -33,8 +31,8 @@ import org.ofbiz.service.DispatchContext >> import org.ofbiz.service.GenericServiceException; >> import org.ofbiz.service.LocalDispatcher; >> import org.ofbiz.service.ModelService; >> +import org.ofbiz.service.ServiceSynchronization; >> import org.ofbiz.service.ServiceUtil; >> -import org.ofbiz.service.ServiceXaWrapper; >> import org.w3c.dom.Element; >> >> /** >> @@ -115,19 +113,12 @@ public class ServiceEcaAction implements >> } >> >> if (eventName.startsWith("global-")) { >> - // XA resource ECA >> - ServiceXaWrapper xaw = new ServiceXaWrapper(dctx); >> if (eventName.equals("global-rollback")) { >> - xaw.setRollbackService(serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates >> + ServiceSynchronization.registerRollbackService(dctx, serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates >> } else if (eventName.equals("global-commit")) { >> - xaw.setCommitService(serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates >> + ServiceSynchronization.registerCommitService(dctx, serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates >> } else if (eventName.equals("global-commit-post-run")) { >> - xaw.setCommitService(serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates >> - } >> - try { >> - xaw.enlist(); >> - } catch (XAException e) { >> - throw new GenericServiceException("Unable to enlist ServiceXaWrapper with transaction", e); >> + ServiceSynchronization.registerCommitService(dctx, serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates >> } >> } else { >> // standard ECA >> >> |
Fixed in r1616928
Regards Scott On 9/08/2014, at 12:41 pm, Scott Gray <[hidden email]> wrote: > Oh sorry, force of habit I guess. If we've stopped using it, why haven't we removed the libs? That's a sure fire way of preventing its use! > > Regards > Scott > > On 9/08/2014, at 12:24 pm, Adrian Crum <[hidden email]> wrote: > >> :( >> >> I thought we stopped using Javolution. >> >> Adrian Crum >> Sandglass Software >> www.sandglass-software.com >> >> On 8/9/2014 10:00 AM, [hidden email] wrote: >>> Author: lektran >>> Date: Sat Aug 9 09:00:39 2014 >>> New Revision: 1616925 >>> >>> URL: http://svn.apache.org/r1616925 >>> Log: >>> Replace the ServiceXaWrapper with a simpler Synchronization implementation. Helps pave the way for use of alternative transaction management libraries that don't work well with our XA wrapper implementations. Still DebugXaResource to go. >>> >>> Added: >>> ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java (with props) >>> Modified: >>> ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkServices.java >>> ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java >>> ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java >>> ofbiz/trunk/framework/service/src/org/ofbiz/service/LocalDispatcher.java >>> ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceXaWrapper.java >>> ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaAction.java >>> >>> Modified: ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkServices.java >>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkServices.java?rev=1616925&r1=1616924&r2=1616925&view=diff >>> ============================================================================== >>> --- ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkServices.java (original) >>> +++ ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkServices.java Sat Aug 9 09:00:39 2014 >>> @@ -24,8 +24,6 @@ import java.util.Locale; >>> import java.util.Map; >>> import java.util.Properties; >>> >>> -import javax.transaction.xa.XAException; >>> - >>> import javolution.util.FastMap; >>> >>> import org.ofbiz.base.util.Debug; >>> @@ -48,7 +46,6 @@ import org.ofbiz.service.GenericServiceE >>> import org.ofbiz.service.LocalDispatcher; >>> import org.ofbiz.service.ModelService; >>> import org.ofbiz.service.ServiceUtil; >>> -import org.ofbiz.service.ServiceXaWrapper; >>> >>> /** >>> * ValueLinkServices - Integration with ValueLink Gift Cards >>> @@ -792,13 +789,11 @@ public class ValueLinkServices { >>> // Activate/Rollback is not supported by valuelink >>> if (!vlInterface.equals("Activate")) { >>> // create the listener >>> - ServiceXaWrapper xaw = new ServiceXaWrapper(dctx); >>> - xaw.setRollbackService("vlTimeOutReversal", context); >>> - //xaw.setCommitService("vlTimeOutReversal", context); >>> Debug.logInfo("Set 704 context : " + context, module); >>> try { >>> - xaw.enlist(); >>> - } catch (XAException e) { >>> + dctx.getDispatcher().addRollbackService("vlTimeOutReversal", context, false); >>> + //dctx.getDispatcher().addCommitService("vlTimeOutReversal", context, false); >>> + } catch (GenericServiceException e) { >>> Debug.logError(e, "Unable to setup 0704 Timeout Reversal", module); >>> } >>> } >>> @@ -1214,14 +1209,10 @@ public class ValueLinkServices { >>> } >>> >>> if (!failure) { >>> - // set the void on rollback wrapper >>> - ServiceXaWrapper xaw = new ServiceXaWrapper(dctx); >>> - activateCtx.put("cardNumber", activateResult.get("cardNumber")); >>> - activateCtx.put("pin", activateResult.get("pin")); >>> - xaw.setRollbackService("voidActivateGiftCard", activateCtx); >>> + // set the void on rollback >>> try { >>> - xaw.enlist(); >>> - } catch (XAException e) { >>> + dispatcher.addRollbackService("voidActivateGiftCard", activateCtx, false); >>> + } catch (GenericServiceException e) { >>> Debug.logError(e, "Unable to setup Activate/Void on error", module); >>> } >>> } >>> >>> Modified: ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java >>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java?rev=1616925&r1=1616924&r2=1616925&view=diff >>> ============================================================================== >>> --- ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java (original) >>> +++ ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java Sat Aug 9 09:00:39 2014 >>> @@ -40,7 +40,6 @@ import java.util.Set; >>> import java.util.TreeSet; >>> >>> import javax.mail.internet.MimeMessage; >>> -import javax.transaction.xa.XAException; >>> >>> import javolution.util.FastList; >>> import javolution.util.FastMap; >>> @@ -65,8 +64,8 @@ import org.ofbiz.service.DispatchContext >>> import org.ofbiz.service.GenericServiceException; >>> import org.ofbiz.service.LocalDispatcher; >>> import org.ofbiz.service.ModelService; >>> +import org.ofbiz.service.ServiceSynchronization; >>> import org.ofbiz.service.ServiceUtil; >>> -import org.ofbiz.service.ServiceXaWrapper; >>> import org.ofbiz.service.mail.MimeMessageWrapper; >>> import org.owasp.esapi.errors.EncodingException; >>> >>> @@ -142,23 +141,19 @@ public class CommonServices { >>> } >>> >>> public static Map<String, Object> testRollbackListener(DispatchContext dctx, Map<String, ?> context) { >>> - Locale locale = (Locale) context.get("locale"); >>> - ServiceXaWrapper xar = new ServiceXaWrapper(dctx); >>> - xar.setRollbackService("testScv", context); >>> try { >>> - xar.enlist(); >>> - } catch (XAException e) { >>> + ServiceSynchronization.registerRollbackService(dctx, "testScv", null, context, false, false); >>> + } catch (GenericServiceException e) { >>> Debug.logError(e, module); >>> } >>> + Locale locale = (Locale) context.get("locale"); >>> return ServiceUtil.returnError(UtilProperties.getMessage(resource, "CommonTestRollingBack", locale)); >>> } >>> >>> public static Map<String, Object> testCommitListener(DispatchContext dctx, Map<String, ?> context) { >>> - ServiceXaWrapper xar = new ServiceXaWrapper(dctx); >>> - xar.setCommitService("testScv", context); >>> try { >>> - xar.enlist(); >>> - } catch (XAException e) { >>> + ServiceSynchronization.registerCommitService(dctx, "testScv", null, context, false, false); >>> + } catch (GenericServiceException e) { >>> Debug.logError(e, module); >>> } >>> return ServiceUtil.returnSuccess(); >>> >>> Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java >>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java?rev=1616925&r1=1616924&r2=1616925&view=diff >>> ============================================================================== >>> --- ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java (original) >>> +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java Sat Aug 9 09:00:39 2014 >>> @@ -22,7 +22,6 @@ import java.util.Date; >>> import java.util.Map; >>> >>> import javax.transaction.Transaction; >>> -import javax.transaction.xa.XAException; >>> >>> import org.ofbiz.service.calendar.RecurrenceRule; >>> import org.ofbiz.entity.Delegator; >>> @@ -117,14 +116,7 @@ public abstract class GenericAbstractDis >>> } >>> >>> public void addRollbackService(String serviceName, Map<String, ? extends Object> context, boolean persist) throws GenericServiceException { >>> - ServiceXaWrapper xa = new ServiceXaWrapper(this.getDispatchContext()); >>> - xa.setRollbackService(serviceName, context, true, persist); >>> - try { >>> - xa.enlist(); >>> - } catch (XAException e) { >>> - Debug.logError(e, module); >>> - throw new GenericServiceException(e.getMessage(), e); >>> - } >>> + ServiceSynchronization.registerRollbackService(this.getDispatchContext(), serviceName, null, context, true, persist); >>> } >>> >>> public void addRollbackService(String serviceName, boolean persist, Object... context) throws GenericServiceException { >>> @@ -132,14 +124,7 @@ public abstract class GenericAbstractDis >>> } >>> >>> public void addCommitService(String serviceName, Map<String, ? extends Object> context, boolean persist) throws GenericServiceException { >>> - ServiceXaWrapper xa = new ServiceXaWrapper(this.getDispatchContext()); >>> - xa.setCommitService(serviceName, context, true, persist); >>> - try { >>> - xa.enlist(); >>> - } catch (XAException e) { >>> - Debug.logError(e, module); >>> - throw new GenericServiceException(e.getMessage(), e); >>> - } >>> + ServiceSynchronization.registerCommitService(this.getDispatchContext(), serviceName, null, context, true, persist); >>> } >>> >>> public void addCommitService(String serviceName, boolean persist, Object... context) throws GenericServiceException { >>> >>> Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/LocalDispatcher.java >>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/LocalDispatcher.java?rev=1616925&r1=1616924&r2=1616925&view=diff >>> ============================================================================== >>> --- ofbiz/trunk/framework/service/src/org/ofbiz/service/LocalDispatcher.java (original) >>> +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/LocalDispatcher.java Sat Aug 9 09:00:39 2014 >>> @@ -281,7 +281,7 @@ public interface LocalDispatcher { >>> >>> >>> /** >>> - * Adds a rollback service to the current TX using the ServiceXaWrapper >>> + * Adds a rollback service to the current TX using ServiceSynchronization >>> * @param serviceName >>> * @param context >>> * @param persist >>> @@ -291,7 +291,7 @@ public interface LocalDispatcher { >>> public void addRollbackService(String serviceName, boolean persist, Object... context) throws GenericServiceException; >>> >>> /** >>> - * Adds a commit service to the current TX using the ServiceXaWrapper >>> + * Adds a commit service to the current TX using ServiceSynchronization >>> * @param serviceName >>> * @param context >>> * @param persist >>> >>> Added: ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java >>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java?rev=1616925&view=auto >>> ============================================================================== >>> --- ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java (added) >>> +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java Sat Aug 9 09:00:39 2014 >>> @@ -0,0 +1,167 @@ >>> +package org.ofbiz.service; >>> + >>> +import java.util.List; >>> +import java.util.Map; >>> +import java.util.WeakHashMap; >>> + >>> +import javax.transaction.RollbackException; >>> +import javax.transaction.Status; >>> +import javax.transaction.Synchronization; >>> +import javax.transaction.SystemException; >>> +import javax.transaction.Transaction; >>> + >>> +import javolution.util.FastList; >>> +import javolution.util.FastMap; >>> + >>> +import org.ofbiz.base.util.Debug; >>> +import org.ofbiz.entity.transaction.GenericTransactionException; >>> +import org.ofbiz.entity.transaction.TransactionFactory; >>> +import org.ofbiz.entity.transaction.TransactionUtil; >>> + >>> +/** >>> + * This class is used to execute services when a transaction is either >>> + * committed or rolled back. It should generally be accessed via >>> + * LocalDispatcher's addCommitService and addRollbackService methods >>> + * or by using the service ECA event attribute values global-commit, >>> + * global-rollback or global-commit-post-run >>> + * >>> + */ >>> +public class ServiceSynchronization implements Synchronization { >>> + >>> + public static final String MODULE = ServiceSynchronization.class.getName(); >>> + >>> + private static Map<Transaction, ServiceSynchronization> syncingleton = new WeakHashMap<Transaction, ServiceSynchronization>(); >>> + private List<ServiceExecution> services = FastList.newInstance(); >>> + >>> + public static void registerCommitService(DispatchContext dctx, String serviceName, String runAsUser, Map<String, ? extends Object> context, boolean async, boolean persist) throws GenericServiceException { >>> + ServiceSynchronization sync = ServiceSynchronization.getInstance(); >>> + if (sync != null) { >>> + sync.services.add(new ServiceExecution(dctx, serviceName, runAsUser, context, async, persist, false)); >>> + } >>> + } >>> + >>> + public static void registerRollbackService(DispatchContext dctx, String serviceName, String runAsUser, Map<String, ? extends Object> context, boolean async, boolean persist) throws GenericServiceException { >>> + ServiceSynchronization sync = ServiceSynchronization.getInstance(); >>> + if (sync != null) { >>> + sync.services.add(new ServiceExecution(dctx, serviceName, runAsUser, context, async, persist, true)); >>> + } >>> + } >>> + >>> + protected static ServiceSynchronization getInstance() throws GenericServiceException { >>> + ServiceSynchronization sync = null; >>> + try { >>> + Transaction transaction = TransactionFactory.getTransactionManager().getTransaction(); >>> + synchronized (transaction) { >>> + sync = syncingleton.get(transaction); >>> + if (sync == null) { >>> + sync = new ServiceSynchronization(); >>> + transaction.registerSynchronization(sync); >>> + syncingleton.put(transaction, sync); >>> + } >>> + } >>> + } catch (SystemException e) { >>> + throw new GenericServiceException(e.getMessage(), e); >>> + } catch (IllegalStateException e) { >>> + throw new GenericServiceException(e.getMessage(), e); >>> + } catch (RollbackException e) { >>> + throw new GenericServiceException(e.getMessage(), e); >>> + } >>> + return sync; >>> + } >>> + >>> + @Override >>> + public void afterCompletion(int status) { >>> + for (ServiceExecution serviceExec : this.services) { >>> + serviceExec.runService(status); >>> + } >>> + } >>> + >>> + @Override >>> + public void beforeCompletion() { >>> + >>> + } >>> + >>> + static class ServiceExecution { >>> + protected DispatchContext dctx = null; >>> + protected String serviceName; >>> + protected String runAsUser = null; >>> + protected Map<String, ? extends Object> context = null; >>> + protected boolean rollback = false; >>> + protected boolean persist = true; >>> + protected boolean async = false; >>> + >>> + ServiceExecution(DispatchContext dctx, String serviceName, String runAsUser, Map<String, ? extends Object> context, boolean async, boolean persist, boolean rollback) { >>> + this.dctx = dctx; >>> + this.serviceName = serviceName; >>> + this.runAsUser = runAsUser; >>> + this.context = context; >>> + this.async = async; >>> + this.persist = persist; >>> + this.rollback = rollback; >>> + } >>> + >>> + protected void runService(int status) { >>> + if ((status == Status.STATUS_COMMITTED && !rollback) || (status == Status.STATUS_ROLLEDBACK && rollback)) { >>> + Thread thread = new Thread() { >>> + @Override >>> + public void run() { >>> + String msgPrefix = null; >>> + if (rollback) { >>> + msgPrefix = "[Rollback] "; >>> + } else { >>> + msgPrefix = "[Commit] "; >>> + } >>> + >>> + boolean beganTx; >>> + try { >>> + // begin the new tx >>> + beganTx = TransactionUtil.begin(); >>> + // configure and run the service >>> + try { >>> + // obtain the model and get the valid context >>> + ModelService model = dctx.getModelService(serviceName); >>> + Map<String, Object> thisContext; >>> + if (model.validate) { >>> + thisContext = model.makeValid(context, ModelService.IN_PARAM); >>> + } else { >>> + thisContext = FastMap.newInstance(); >>> + thisContext.putAll(context); >>> + } >>> + >>> + // set the userLogin object >>> + thisContext.put("userLogin", ServiceUtil.getUserLogin(dctx, thisContext, runAsUser)); >>> + if (async) { >>> + if (Debug.infoOn()) Debug.logInfo(msgPrefix + "Invoking [" + serviceName + "] via runAsync", MODULE); >>> + dctx.getDispatcher().runAsync(serviceName, thisContext, persist); >>> + } else { >>> + if (Debug.infoOn()) Debug.logInfo(msgPrefix + "Invoking [" + serviceName + "] via runSyncIgnore", MODULE); >>> + dctx.getDispatcher().runSyncIgnore(serviceName, thisContext); >>> + } >>> + } catch (Throwable t) { >>> + Debug.logError(t, "Problem calling " + msgPrefix + "service : " + serviceName + " / " + context, MODULE); >>> + try { >>> + TransactionUtil.rollback(beganTx, t.getMessage(), t); >>> + } catch (GenericTransactionException e) { >>> + Debug.logError(e, MODULE); >>> + } >>> + >>> + } finally { >>> + // commit the transaction >>> + try { >>> + TransactionUtil.commit(beganTx); >>> + } catch (GenericTransactionException e) { >>> + Debug.logError(e, MODULE); >>> + } >>> + } >>> + } catch (GenericTransactionException e) { >>> + Debug.logError(e, MODULE); >>> + } >>> + >>> + } >>> + }; >>> + thread.start(); >>> + } >>> + } >>> + } >>> + >>> +} >>> >>> Propchange: ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java >>> ------------------------------------------------------------------------------ >>> svn:eol-style = native >>> >>> Propchange: ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java >>> ------------------------------------------------------------------------------ >>> svn:keywords = "Date Rev Author URL Id" >>> >>> Propchange: ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java >>> ------------------------------------------------------------------------------ >>> svn:mime-type = text/plain >>> >>> Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceXaWrapper.java >>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceXaWrapper.java?rev=1616925&r1=1616924&r2=1616925&view=diff >>> ============================================================================== >>> --- ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceXaWrapper.java (original) >>> +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceXaWrapper.java Sat Aug 9 09:00:39 2014 >>> @@ -34,7 +34,9 @@ import org.ofbiz.entity.transaction.Tran >>> >>> /** >>> * ServiceXaWrapper - XA Resource wrapper for running services on commit() or rollback() >>> + * @deprecated - Use ServiceSynchronization instead (via LocalDispatcher) >>> */ >>> +@Deprecated >>> public class ServiceXaWrapper extends GenericXaResource { >>> >>> public static final String module = ServiceXaWrapper.class.getName(); >>> >>> Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaAction.java >>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaAction.java?rev=1616925&r1=1616924&r2=1616925&view=diff >>> ============================================================================== >>> --- ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaAction.java (original) >>> +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaAction.java Sat Aug 9 09:00:39 2014 >>> @@ -22,8 +22,6 @@ import java.util.LinkedList; >>> import java.util.List; >>> import java.util.Map; >>> >>> -import javax.transaction.xa.XAException; >>> - >>> import javolution.util.FastMap; >>> >>> import org.ofbiz.base.util.Debug; >>> @@ -33,8 +31,8 @@ import org.ofbiz.service.DispatchContext >>> import org.ofbiz.service.GenericServiceException; >>> import org.ofbiz.service.LocalDispatcher; >>> import org.ofbiz.service.ModelService; >>> +import org.ofbiz.service.ServiceSynchronization; >>> import org.ofbiz.service.ServiceUtil; >>> -import org.ofbiz.service.ServiceXaWrapper; >>> import org.w3c.dom.Element; >>> >>> /** >>> @@ -115,19 +113,12 @@ public class ServiceEcaAction implements >>> } >>> >>> if (eventName.startsWith("global-")) { >>> - // XA resource ECA >>> - ServiceXaWrapper xaw = new ServiceXaWrapper(dctx); >>> if (eventName.equals("global-rollback")) { >>> - xaw.setRollbackService(serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates >>> + ServiceSynchronization.registerRollbackService(dctx, serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates >>> } else if (eventName.equals("global-commit")) { >>> - xaw.setCommitService(serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates >>> + ServiceSynchronization.registerCommitService(dctx, serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates >>> } else if (eventName.equals("global-commit-post-run")) { >>> - xaw.setCommitService(serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates >>> - } >>> - try { >>> - xaw.enlist(); >>> - } catch (XAException e) { >>> - throw new GenericServiceException("Unable to enlist ServiceXaWrapper with transaction", e); >>> + ServiceSynchronization.registerCommitService(dctx, serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates >>> } >>> } else { >>> // standard ECA >>> >>> > |
Thanks Scott!
Javolution is ubiquitous in this project - removing it will require a lot of work. I removed it from some sections of the project, but there is still a lot of work to do. Adrian Crum Sandglass Software www.sandglass-software.com On 8/9/2014 10:44 AM, Scott Gray wrote: > Fixed in r1616928 > > Regards > Scott > > On 9/08/2014, at 12:41 pm, Scott Gray <[hidden email]> wrote: > >> Oh sorry, force of habit I guess. If we've stopped using it, why haven't we removed the libs? That's a sure fire way of preventing its use! >> >> Regards >> Scott >> >> On 9/08/2014, at 12:24 pm, Adrian Crum <[hidden email]> wrote: >> >>> :( >>> >>> I thought we stopped using Javolution. >>> >>> Adrian Crum >>> Sandglass Software >>> www.sandglass-software.com >>> >>> On 8/9/2014 10:00 AM, [hidden email] wrote: >>>> Author: lektran >>>> Date: Sat Aug 9 09:00:39 2014 >>>> New Revision: 1616925 >>>> >>>> URL: http://svn.apache.org/r1616925 >>>> Log: >>>> Replace the ServiceXaWrapper with a simpler Synchronization implementation. Helps pave the way for use of alternative transaction management libraries that don't work well with our XA wrapper implementations. Still DebugXaResource to go. >>>> >>>> Added: >>>> ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java (with props) >>>> Modified: >>>> ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkServices.java >>>> ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java >>>> ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java >>>> ofbiz/trunk/framework/service/src/org/ofbiz/service/LocalDispatcher.java >>>> ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceXaWrapper.java >>>> ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaAction.java >>>> >>>> Modified: ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkServices.java >>>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkServices.java?rev=1616925&r1=1616924&r2=1616925&view=diff >>>> ============================================================================== >>>> --- ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkServices.java (original) >>>> +++ ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkServices.java Sat Aug 9 09:00:39 2014 >>>> @@ -24,8 +24,6 @@ import java.util.Locale; >>>> import java.util.Map; >>>> import java.util.Properties; >>>> >>>> -import javax.transaction.xa.XAException; >>>> - >>>> import javolution.util.FastMap; >>>> >>>> import org.ofbiz.base.util.Debug; >>>> @@ -48,7 +46,6 @@ import org.ofbiz.service.GenericServiceE >>>> import org.ofbiz.service.LocalDispatcher; >>>> import org.ofbiz.service.ModelService; >>>> import org.ofbiz.service.ServiceUtil; >>>> -import org.ofbiz.service.ServiceXaWrapper; >>>> >>>> /** >>>> * ValueLinkServices - Integration with ValueLink Gift Cards >>>> @@ -792,13 +789,11 @@ public class ValueLinkServices { >>>> // Activate/Rollback is not supported by valuelink >>>> if (!vlInterface.equals("Activate")) { >>>> // create the listener >>>> - ServiceXaWrapper xaw = new ServiceXaWrapper(dctx); >>>> - xaw.setRollbackService("vlTimeOutReversal", context); >>>> - //xaw.setCommitService("vlTimeOutReversal", context); >>>> Debug.logInfo("Set 704 context : " + context, module); >>>> try { >>>> - xaw.enlist(); >>>> - } catch (XAException e) { >>>> + dctx.getDispatcher().addRollbackService("vlTimeOutReversal", context, false); >>>> + //dctx.getDispatcher().addCommitService("vlTimeOutReversal", context, false); >>>> + } catch (GenericServiceException e) { >>>> Debug.logError(e, "Unable to setup 0704 Timeout Reversal", module); >>>> } >>>> } >>>> @@ -1214,14 +1209,10 @@ public class ValueLinkServices { >>>> } >>>> >>>> if (!failure) { >>>> - // set the void on rollback wrapper >>>> - ServiceXaWrapper xaw = new ServiceXaWrapper(dctx); >>>> - activateCtx.put("cardNumber", activateResult.get("cardNumber")); >>>> - activateCtx.put("pin", activateResult.get("pin")); >>>> - xaw.setRollbackService("voidActivateGiftCard", activateCtx); >>>> + // set the void on rollback >>>> try { >>>> - xaw.enlist(); >>>> - } catch (XAException e) { >>>> + dispatcher.addRollbackService("voidActivateGiftCard", activateCtx, false); >>>> + } catch (GenericServiceException e) { >>>> Debug.logError(e, "Unable to setup Activate/Void on error", module); >>>> } >>>> } >>>> >>>> Modified: ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java >>>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java?rev=1616925&r1=1616924&r2=1616925&view=diff >>>> ============================================================================== >>>> --- ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java (original) >>>> +++ ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java Sat Aug 9 09:00:39 2014 >>>> @@ -40,7 +40,6 @@ import java.util.Set; >>>> import java.util.TreeSet; >>>> >>>> import javax.mail.internet.MimeMessage; >>>> -import javax.transaction.xa.XAException; >>>> >>>> import javolution.util.FastList; >>>> import javolution.util.FastMap; >>>> @@ -65,8 +64,8 @@ import org.ofbiz.service.DispatchContext >>>> import org.ofbiz.service.GenericServiceException; >>>> import org.ofbiz.service.LocalDispatcher; >>>> import org.ofbiz.service.ModelService; >>>> +import org.ofbiz.service.ServiceSynchronization; >>>> import org.ofbiz.service.ServiceUtil; >>>> -import org.ofbiz.service.ServiceXaWrapper; >>>> import org.ofbiz.service.mail.MimeMessageWrapper; >>>> import org.owasp.esapi.errors.EncodingException; >>>> >>>> @@ -142,23 +141,19 @@ public class CommonServices { >>>> } >>>> >>>> public static Map<String, Object> testRollbackListener(DispatchContext dctx, Map<String, ?> context) { >>>> - Locale locale = (Locale) context.get("locale"); >>>> - ServiceXaWrapper xar = new ServiceXaWrapper(dctx); >>>> - xar.setRollbackService("testScv", context); >>>> try { >>>> - xar.enlist(); >>>> - } catch (XAException e) { >>>> + ServiceSynchronization.registerRollbackService(dctx, "testScv", null, context, false, false); >>>> + } catch (GenericServiceException e) { >>>> Debug.logError(e, module); >>>> } >>>> + Locale locale = (Locale) context.get("locale"); >>>> return ServiceUtil.returnError(UtilProperties.getMessage(resource, "CommonTestRollingBack", locale)); >>>> } >>>> >>>> public static Map<String, Object> testCommitListener(DispatchContext dctx, Map<String, ?> context) { >>>> - ServiceXaWrapper xar = new ServiceXaWrapper(dctx); >>>> - xar.setCommitService("testScv", context); >>>> try { >>>> - xar.enlist(); >>>> - } catch (XAException e) { >>>> + ServiceSynchronization.registerCommitService(dctx, "testScv", null, context, false, false); >>>> + } catch (GenericServiceException e) { >>>> Debug.logError(e, module); >>>> } >>>> return ServiceUtil.returnSuccess(); >>>> >>>> Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java >>>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java?rev=1616925&r1=1616924&r2=1616925&view=diff >>>> ============================================================================== >>>> --- ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java (original) >>>> +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java Sat Aug 9 09:00:39 2014 >>>> @@ -22,7 +22,6 @@ import java.util.Date; >>>> import java.util.Map; >>>> >>>> import javax.transaction.Transaction; >>>> -import javax.transaction.xa.XAException; >>>> >>>> import org.ofbiz.service.calendar.RecurrenceRule; >>>> import org.ofbiz.entity.Delegator; >>>> @@ -117,14 +116,7 @@ public abstract class GenericAbstractDis >>>> } >>>> >>>> public void addRollbackService(String serviceName, Map<String, ? extends Object> context, boolean persist) throws GenericServiceException { >>>> - ServiceXaWrapper xa = new ServiceXaWrapper(this.getDispatchContext()); >>>> - xa.setRollbackService(serviceName, context, true, persist); >>>> - try { >>>> - xa.enlist(); >>>> - } catch (XAException e) { >>>> - Debug.logError(e, module); >>>> - throw new GenericServiceException(e.getMessage(), e); >>>> - } >>>> + ServiceSynchronization.registerRollbackService(this.getDispatchContext(), serviceName, null, context, true, persist); >>>> } >>>> >>>> public void addRollbackService(String serviceName, boolean persist, Object... context) throws GenericServiceException { >>>> @@ -132,14 +124,7 @@ public abstract class GenericAbstractDis >>>> } >>>> >>>> public void addCommitService(String serviceName, Map<String, ? extends Object> context, boolean persist) throws GenericServiceException { >>>> - ServiceXaWrapper xa = new ServiceXaWrapper(this.getDispatchContext()); >>>> - xa.setCommitService(serviceName, context, true, persist); >>>> - try { >>>> - xa.enlist(); >>>> - } catch (XAException e) { >>>> - Debug.logError(e, module); >>>> - throw new GenericServiceException(e.getMessage(), e); >>>> - } >>>> + ServiceSynchronization.registerCommitService(this.getDispatchContext(), serviceName, null, context, true, persist); >>>> } >>>> >>>> public void addCommitService(String serviceName, boolean persist, Object... context) throws GenericServiceException { >>>> >>>> Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/LocalDispatcher.java >>>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/LocalDispatcher.java?rev=1616925&r1=1616924&r2=1616925&view=diff >>>> ============================================================================== >>>> --- ofbiz/trunk/framework/service/src/org/ofbiz/service/LocalDispatcher.java (original) >>>> +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/LocalDispatcher.java Sat Aug 9 09:00:39 2014 >>>> @@ -281,7 +281,7 @@ public interface LocalDispatcher { >>>> >>>> >>>> /** >>>> - * Adds a rollback service to the current TX using the ServiceXaWrapper >>>> + * Adds a rollback service to the current TX using ServiceSynchronization >>>> * @param serviceName >>>> * @param context >>>> * @param persist >>>> @@ -291,7 +291,7 @@ public interface LocalDispatcher { >>>> public void addRollbackService(String serviceName, boolean persist, Object... context) throws GenericServiceException; >>>> >>>> /** >>>> - * Adds a commit service to the current TX using the ServiceXaWrapper >>>> + * Adds a commit service to the current TX using ServiceSynchronization >>>> * @param serviceName >>>> * @param context >>>> * @param persist >>>> >>>> Added: ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java >>>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java?rev=1616925&view=auto >>>> ============================================================================== >>>> --- ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java (added) >>>> +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java Sat Aug 9 09:00:39 2014 >>>> @@ -0,0 +1,167 @@ >>>> +package org.ofbiz.service; >>>> + >>>> +import java.util.List; >>>> +import java.util.Map; >>>> +import java.util.WeakHashMap; >>>> + >>>> +import javax.transaction.RollbackException; >>>> +import javax.transaction.Status; >>>> +import javax.transaction.Synchronization; >>>> +import javax.transaction.SystemException; >>>> +import javax.transaction.Transaction; >>>> + >>>> +import javolution.util.FastList; >>>> +import javolution.util.FastMap; >>>> + >>>> +import org.ofbiz.base.util.Debug; >>>> +import org.ofbiz.entity.transaction.GenericTransactionException; >>>> +import org.ofbiz.entity.transaction.TransactionFactory; >>>> +import org.ofbiz.entity.transaction.TransactionUtil; >>>> + >>>> +/** >>>> + * This class is used to execute services when a transaction is either >>>> + * committed or rolled back. It should generally be accessed via >>>> + * LocalDispatcher's addCommitService and addRollbackService methods >>>> + * or by using the service ECA event attribute values global-commit, >>>> + * global-rollback or global-commit-post-run >>>> + * >>>> + */ >>>> +public class ServiceSynchronization implements Synchronization { >>>> + >>>> + public static final String MODULE = ServiceSynchronization.class.getName(); >>>> + >>>> + private static Map<Transaction, ServiceSynchronization> syncingleton = new WeakHashMap<Transaction, ServiceSynchronization>(); >>>> + private List<ServiceExecution> services = FastList.newInstance(); >>>> + >>>> + public static void registerCommitService(DispatchContext dctx, String serviceName, String runAsUser, Map<String, ? extends Object> context, boolean async, boolean persist) throws GenericServiceException { >>>> + ServiceSynchronization sync = ServiceSynchronization.getInstance(); >>>> + if (sync != null) { >>>> + sync.services.add(new ServiceExecution(dctx, serviceName, runAsUser, context, async, persist, false)); >>>> + } >>>> + } >>>> + >>>> + public static void registerRollbackService(DispatchContext dctx, String serviceName, String runAsUser, Map<String, ? extends Object> context, boolean async, boolean persist) throws GenericServiceException { >>>> + ServiceSynchronization sync = ServiceSynchronization.getInstance(); >>>> + if (sync != null) { >>>> + sync.services.add(new ServiceExecution(dctx, serviceName, runAsUser, context, async, persist, true)); >>>> + } >>>> + } >>>> + >>>> + protected static ServiceSynchronization getInstance() throws GenericServiceException { >>>> + ServiceSynchronization sync = null; >>>> + try { >>>> + Transaction transaction = TransactionFactory.getTransactionManager().getTransaction(); >>>> + synchronized (transaction) { >>>> + sync = syncingleton.get(transaction); >>>> + if (sync == null) { >>>> + sync = new ServiceSynchronization(); >>>> + transaction.registerSynchronization(sync); >>>> + syncingleton.put(transaction, sync); >>>> + } >>>> + } >>>> + } catch (SystemException e) { >>>> + throw new GenericServiceException(e.getMessage(), e); >>>> + } catch (IllegalStateException e) { >>>> + throw new GenericServiceException(e.getMessage(), e); >>>> + } catch (RollbackException e) { >>>> + throw new GenericServiceException(e.getMessage(), e); >>>> + } >>>> + return sync; >>>> + } >>>> + >>>> + @Override >>>> + public void afterCompletion(int status) { >>>> + for (ServiceExecution serviceExec : this.services) { >>>> + serviceExec.runService(status); >>>> + } >>>> + } >>>> + >>>> + @Override >>>> + public void beforeCompletion() { >>>> + >>>> + } >>>> + >>>> + static class ServiceExecution { >>>> + protected DispatchContext dctx = null; >>>> + protected String serviceName; >>>> + protected String runAsUser = null; >>>> + protected Map<String, ? extends Object> context = null; >>>> + protected boolean rollback = false; >>>> + protected boolean persist = true; >>>> + protected boolean async = false; >>>> + >>>> + ServiceExecution(DispatchContext dctx, String serviceName, String runAsUser, Map<String, ? extends Object> context, boolean async, boolean persist, boolean rollback) { >>>> + this.dctx = dctx; >>>> + this.serviceName = serviceName; >>>> + this.runAsUser = runAsUser; >>>> + this.context = context; >>>> + this.async = async; >>>> + this.persist = persist; >>>> + this.rollback = rollback; >>>> + } >>>> + >>>> + protected void runService(int status) { >>>> + if ((status == Status.STATUS_COMMITTED && !rollback) || (status == Status.STATUS_ROLLEDBACK && rollback)) { >>>> + Thread thread = new Thread() { >>>> + @Override >>>> + public void run() { >>>> + String msgPrefix = null; >>>> + if (rollback) { >>>> + msgPrefix = "[Rollback] "; >>>> + } else { >>>> + msgPrefix = "[Commit] "; >>>> + } >>>> + >>>> + boolean beganTx; >>>> + try { >>>> + // begin the new tx >>>> + beganTx = TransactionUtil.begin(); >>>> + // configure and run the service >>>> + try { >>>> + // obtain the model and get the valid context >>>> + ModelService model = dctx.getModelService(serviceName); >>>> + Map<String, Object> thisContext; >>>> + if (model.validate) { >>>> + thisContext = model.makeValid(context, ModelService.IN_PARAM); >>>> + } else { >>>> + thisContext = FastMap.newInstance(); >>>> + thisContext.putAll(context); >>>> + } >>>> + >>>> + // set the userLogin object >>>> + thisContext.put("userLogin", ServiceUtil.getUserLogin(dctx, thisContext, runAsUser)); >>>> + if (async) { >>>> + if (Debug.infoOn()) Debug.logInfo(msgPrefix + "Invoking [" + serviceName + "] via runAsync", MODULE); >>>> + dctx.getDispatcher().runAsync(serviceName, thisContext, persist); >>>> + } else { >>>> + if (Debug.infoOn()) Debug.logInfo(msgPrefix + "Invoking [" + serviceName + "] via runSyncIgnore", MODULE); >>>> + dctx.getDispatcher().runSyncIgnore(serviceName, thisContext); >>>> + } >>>> + } catch (Throwable t) { >>>> + Debug.logError(t, "Problem calling " + msgPrefix + "service : " + serviceName + " / " + context, MODULE); >>>> + try { >>>> + TransactionUtil.rollback(beganTx, t.getMessage(), t); >>>> + } catch (GenericTransactionException e) { >>>> + Debug.logError(e, MODULE); >>>> + } >>>> + >>>> + } finally { >>>> + // commit the transaction >>>> + try { >>>> + TransactionUtil.commit(beganTx); >>>> + } catch (GenericTransactionException e) { >>>> + Debug.logError(e, MODULE); >>>> + } >>>> + } >>>> + } catch (GenericTransactionException e) { >>>> + Debug.logError(e, MODULE); >>>> + } >>>> + >>>> + } >>>> + }; >>>> + thread.start(); >>>> + } >>>> + } >>>> + } >>>> + >>>> +} >>>> >>>> Propchange: ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java >>>> ------------------------------------------------------------------------------ >>>> svn:eol-style = native >>>> >>>> Propchange: ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java >>>> ------------------------------------------------------------------------------ >>>> svn:keywords = "Date Rev Author URL Id" >>>> >>>> Propchange: ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java >>>> ------------------------------------------------------------------------------ >>>> svn:mime-type = text/plain >>>> >>>> Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceXaWrapper.java >>>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceXaWrapper.java?rev=1616925&r1=1616924&r2=1616925&view=diff >>>> ============================================================================== >>>> --- ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceXaWrapper.java (original) >>>> +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceXaWrapper.java Sat Aug 9 09:00:39 2014 >>>> @@ -34,7 +34,9 @@ import org.ofbiz.entity.transaction.Tran >>>> >>>> /** >>>> * ServiceXaWrapper - XA Resource wrapper for running services on commit() or rollback() >>>> + * @deprecated - Use ServiceSynchronization instead (via LocalDispatcher) >>>> */ >>>> +@Deprecated >>>> public class ServiceXaWrapper extends GenericXaResource { >>>> >>>> public static final String module = ServiceXaWrapper.class.getName(); >>>> >>>> Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaAction.java >>>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaAction.java?rev=1616925&r1=1616924&r2=1616925&view=diff >>>> ============================================================================== >>>> --- ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaAction.java (original) >>>> +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaAction.java Sat Aug 9 09:00:39 2014 >>>> @@ -22,8 +22,6 @@ import java.util.LinkedList; >>>> import java.util.List; >>>> import java.util.Map; >>>> >>>> -import javax.transaction.xa.XAException; >>>> - >>>> import javolution.util.FastMap; >>>> >>>> import org.ofbiz.base.util.Debug; >>>> @@ -33,8 +31,8 @@ import org.ofbiz.service.DispatchContext >>>> import org.ofbiz.service.GenericServiceException; >>>> import org.ofbiz.service.LocalDispatcher; >>>> import org.ofbiz.service.ModelService; >>>> +import org.ofbiz.service.ServiceSynchronization; >>>> import org.ofbiz.service.ServiceUtil; >>>> -import org.ofbiz.service.ServiceXaWrapper; >>>> import org.w3c.dom.Element; >>>> >>>> /** >>>> @@ -115,19 +113,12 @@ public class ServiceEcaAction implements >>>> } >>>> >>>> if (eventName.startsWith("global-")) { >>>> - // XA resource ECA >>>> - ServiceXaWrapper xaw = new ServiceXaWrapper(dctx); >>>> if (eventName.equals("global-rollback")) { >>>> - xaw.setRollbackService(serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates >>>> + ServiceSynchronization.registerRollbackService(dctx, serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates >>>> } else if (eventName.equals("global-commit")) { >>>> - xaw.setCommitService(serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates >>>> + ServiceSynchronization.registerCommitService(dctx, serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates >>>> } else if (eventName.equals("global-commit-post-run")) { >>>> - xaw.setCommitService(serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates >>>> - } >>>> - try { >>>> - xaw.enlist(); >>>> - } catch (XAException e) { >>>> - throw new GenericServiceException("Unable to enlist ServiceXaWrapper with transaction", e); >>>> + ServiceSynchronization.registerCommitService(dctx, serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates >>>> } >>>> } else { >>>> // standard ECA >>>> >>>> >> > |
In reply to this post by Scott Gray-2
and again in r1616931
Regards Scott On 9/08/2014, at 12:44 pm, Scott Gray <[hidden email]> wrote: > Fixed in r1616928 > > Regards > Scott > > On 9/08/2014, at 12:41 pm, Scott Gray <[hidden email]> wrote: > >> Oh sorry, force of habit I guess. If we've stopped using it, why haven't we removed the libs? That's a sure fire way of preventing its use! >> >> Regards >> Scott >> >> On 9/08/2014, at 12:24 pm, Adrian Crum <[hidden email]> wrote: >> >>> :( >>> >>> I thought we stopped using Javolution. >>> >>> Adrian Crum >>> Sandglass Software >>> www.sandglass-software.com >>> >>> On 8/9/2014 10:00 AM, [hidden email] wrote: >>>> Author: lektran >>>> Date: Sat Aug 9 09:00:39 2014 >>>> New Revision: 1616925 >>>> >>>> URL: http://svn.apache.org/r1616925 >>>> Log: >>>> Replace the ServiceXaWrapper with a simpler Synchronization implementation. Helps pave the way for use of alternative transaction management libraries that don't work well with our XA wrapper implementations. Still DebugXaResource to go. >>>> >>>> Added: >>>> ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java (with props) >>>> Modified: >>>> ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkServices.java >>>> ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java >>>> ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java >>>> ofbiz/trunk/framework/service/src/org/ofbiz/service/LocalDispatcher.java >>>> ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceXaWrapper.java >>>> ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaAction.java >>>> >>>> Modified: ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkServices.java >>>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkServices.java?rev=1616925&r1=1616924&r2=1616925&view=diff >>>> ============================================================================== >>>> --- ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkServices.java (original) >>>> +++ ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkServices.java Sat Aug 9 09:00:39 2014 >>>> @@ -24,8 +24,6 @@ import java.util.Locale; >>>> import java.util.Map; >>>> import java.util.Properties; >>>> >>>> -import javax.transaction.xa.XAException; >>>> - >>>> import javolution.util.FastMap; >>>> >>>> import org.ofbiz.base.util.Debug; >>>> @@ -48,7 +46,6 @@ import org.ofbiz.service.GenericServiceE >>>> import org.ofbiz.service.LocalDispatcher; >>>> import org.ofbiz.service.ModelService; >>>> import org.ofbiz.service.ServiceUtil; >>>> -import org.ofbiz.service.ServiceXaWrapper; >>>> >>>> /** >>>> * ValueLinkServices - Integration with ValueLink Gift Cards >>>> @@ -792,13 +789,11 @@ public class ValueLinkServices { >>>> // Activate/Rollback is not supported by valuelink >>>> if (!vlInterface.equals("Activate")) { >>>> // create the listener >>>> - ServiceXaWrapper xaw = new ServiceXaWrapper(dctx); >>>> - xaw.setRollbackService("vlTimeOutReversal", context); >>>> - //xaw.setCommitService("vlTimeOutReversal", context); >>>> Debug.logInfo("Set 704 context : " + context, module); >>>> try { >>>> - xaw.enlist(); >>>> - } catch (XAException e) { >>>> + dctx.getDispatcher().addRollbackService("vlTimeOutReversal", context, false); >>>> + //dctx.getDispatcher().addCommitService("vlTimeOutReversal", context, false); >>>> + } catch (GenericServiceException e) { >>>> Debug.logError(e, "Unable to setup 0704 Timeout Reversal", module); >>>> } >>>> } >>>> @@ -1214,14 +1209,10 @@ public class ValueLinkServices { >>>> } >>>> >>>> if (!failure) { >>>> - // set the void on rollback wrapper >>>> - ServiceXaWrapper xaw = new ServiceXaWrapper(dctx); >>>> - activateCtx.put("cardNumber", activateResult.get("cardNumber")); >>>> - activateCtx.put("pin", activateResult.get("pin")); >>>> - xaw.setRollbackService("voidActivateGiftCard", activateCtx); >>>> + // set the void on rollback >>>> try { >>>> - xaw.enlist(); >>>> - } catch (XAException e) { >>>> + dispatcher.addRollbackService("voidActivateGiftCard", activateCtx, false); >>>> + } catch (GenericServiceException e) { >>>> Debug.logError(e, "Unable to setup Activate/Void on error", module); >>>> } >>>> } >>>> >>>> Modified: ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java >>>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java?rev=1616925&r1=1616924&r2=1616925&view=diff >>>> ============================================================================== >>>> --- ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java (original) >>>> +++ ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java Sat Aug 9 09:00:39 2014 >>>> @@ -40,7 +40,6 @@ import java.util.Set; >>>> import java.util.TreeSet; >>>> >>>> import javax.mail.internet.MimeMessage; >>>> -import javax.transaction.xa.XAException; >>>> >>>> import javolution.util.FastList; >>>> import javolution.util.FastMap; >>>> @@ -65,8 +64,8 @@ import org.ofbiz.service.DispatchContext >>>> import org.ofbiz.service.GenericServiceException; >>>> import org.ofbiz.service.LocalDispatcher; >>>> import org.ofbiz.service.ModelService; >>>> +import org.ofbiz.service.ServiceSynchronization; >>>> import org.ofbiz.service.ServiceUtil; >>>> -import org.ofbiz.service.ServiceXaWrapper; >>>> import org.ofbiz.service.mail.MimeMessageWrapper; >>>> import org.owasp.esapi.errors.EncodingException; >>>> >>>> @@ -142,23 +141,19 @@ public class CommonServices { >>>> } >>>> >>>> public static Map<String, Object> testRollbackListener(DispatchContext dctx, Map<String, ?> context) { >>>> - Locale locale = (Locale) context.get("locale"); >>>> - ServiceXaWrapper xar = new ServiceXaWrapper(dctx); >>>> - xar.setRollbackService("testScv", context); >>>> try { >>>> - xar.enlist(); >>>> - } catch (XAException e) { >>>> + ServiceSynchronization.registerRollbackService(dctx, "testScv", null, context, false, false); >>>> + } catch (GenericServiceException e) { >>>> Debug.logError(e, module); >>>> } >>>> + Locale locale = (Locale) context.get("locale"); >>>> return ServiceUtil.returnError(UtilProperties.getMessage(resource, "CommonTestRollingBack", locale)); >>>> } >>>> >>>> public static Map<String, Object> testCommitListener(DispatchContext dctx, Map<String, ?> context) { >>>> - ServiceXaWrapper xar = new ServiceXaWrapper(dctx); >>>> - xar.setCommitService("testScv", context); >>>> try { >>>> - xar.enlist(); >>>> - } catch (XAException e) { >>>> + ServiceSynchronization.registerCommitService(dctx, "testScv", null, context, false, false); >>>> + } catch (GenericServiceException e) { >>>> Debug.logError(e, module); >>>> } >>>> return ServiceUtil.returnSuccess(); >>>> >>>> Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java >>>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java?rev=1616925&r1=1616924&r2=1616925&view=diff >>>> ============================================================================== >>>> --- ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java (original) >>>> +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java Sat Aug 9 09:00:39 2014 >>>> @@ -22,7 +22,6 @@ import java.util.Date; >>>> import java.util.Map; >>>> >>>> import javax.transaction.Transaction; >>>> -import javax.transaction.xa.XAException; >>>> >>>> import org.ofbiz.service.calendar.RecurrenceRule; >>>> import org.ofbiz.entity.Delegator; >>>> @@ -117,14 +116,7 @@ public abstract class GenericAbstractDis >>>> } >>>> >>>> public void addRollbackService(String serviceName, Map<String, ? extends Object> context, boolean persist) throws GenericServiceException { >>>> - ServiceXaWrapper xa = new ServiceXaWrapper(this.getDispatchContext()); >>>> - xa.setRollbackService(serviceName, context, true, persist); >>>> - try { >>>> - xa.enlist(); >>>> - } catch (XAException e) { >>>> - Debug.logError(e, module); >>>> - throw new GenericServiceException(e.getMessage(), e); >>>> - } >>>> + ServiceSynchronization.registerRollbackService(this.getDispatchContext(), serviceName, null, context, true, persist); >>>> } >>>> >>>> public void addRollbackService(String serviceName, boolean persist, Object... context) throws GenericServiceException { >>>> @@ -132,14 +124,7 @@ public abstract class GenericAbstractDis >>>> } >>>> >>>> public void addCommitService(String serviceName, Map<String, ? extends Object> context, boolean persist) throws GenericServiceException { >>>> - ServiceXaWrapper xa = new ServiceXaWrapper(this.getDispatchContext()); >>>> - xa.setCommitService(serviceName, context, true, persist); >>>> - try { >>>> - xa.enlist(); >>>> - } catch (XAException e) { >>>> - Debug.logError(e, module); >>>> - throw new GenericServiceException(e.getMessage(), e); >>>> - } >>>> + ServiceSynchronization.registerCommitService(this.getDispatchContext(), serviceName, null, context, true, persist); >>>> } >>>> >>>> public void addCommitService(String serviceName, boolean persist, Object... context) throws GenericServiceException { >>>> >>>> Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/LocalDispatcher.java >>>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/LocalDispatcher.java?rev=1616925&r1=1616924&r2=1616925&view=diff >>>> ============================================================================== >>>> --- ofbiz/trunk/framework/service/src/org/ofbiz/service/LocalDispatcher.java (original) >>>> +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/LocalDispatcher.java Sat Aug 9 09:00:39 2014 >>>> @@ -281,7 +281,7 @@ public interface LocalDispatcher { >>>> >>>> >>>> /** >>>> - * Adds a rollback service to the current TX using the ServiceXaWrapper >>>> + * Adds a rollback service to the current TX using ServiceSynchronization >>>> * @param serviceName >>>> * @param context >>>> * @param persist >>>> @@ -291,7 +291,7 @@ public interface LocalDispatcher { >>>> public void addRollbackService(String serviceName, boolean persist, Object... context) throws GenericServiceException; >>>> >>>> /** >>>> - * Adds a commit service to the current TX using the ServiceXaWrapper >>>> + * Adds a commit service to the current TX using ServiceSynchronization >>>> * @param serviceName >>>> * @param context >>>> * @param persist >>>> >>>> Added: ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java >>>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java?rev=1616925&view=auto >>>> ============================================================================== >>>> --- ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java (added) >>>> +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java Sat Aug 9 09:00:39 2014 >>>> @@ -0,0 +1,167 @@ >>>> +package org.ofbiz.service; >>>> + >>>> +import java.util.List; >>>> +import java.util.Map; >>>> +import java.util.WeakHashMap; >>>> + >>>> +import javax.transaction.RollbackException; >>>> +import javax.transaction.Status; >>>> +import javax.transaction.Synchronization; >>>> +import javax.transaction.SystemException; >>>> +import javax.transaction.Transaction; >>>> + >>>> +import javolution.util.FastList; >>>> +import javolution.util.FastMap; >>>> + >>>> +import org.ofbiz.base.util.Debug; >>>> +import org.ofbiz.entity.transaction.GenericTransactionException; >>>> +import org.ofbiz.entity.transaction.TransactionFactory; >>>> +import org.ofbiz.entity.transaction.TransactionUtil; >>>> + >>>> +/** >>>> + * This class is used to execute services when a transaction is either >>>> + * committed or rolled back. It should generally be accessed via >>>> + * LocalDispatcher's addCommitService and addRollbackService methods >>>> + * or by using the service ECA event attribute values global-commit, >>>> + * global-rollback or global-commit-post-run >>>> + * >>>> + */ >>>> +public class ServiceSynchronization implements Synchronization { >>>> + >>>> + public static final String MODULE = ServiceSynchronization.class.getName(); >>>> + >>>> + private static Map<Transaction, ServiceSynchronization> syncingleton = new WeakHashMap<Transaction, ServiceSynchronization>(); >>>> + private List<ServiceExecution> services = FastList.newInstance(); >>>> + >>>> + public static void registerCommitService(DispatchContext dctx, String serviceName, String runAsUser, Map<String, ? extends Object> context, boolean async, boolean persist) throws GenericServiceException { >>>> + ServiceSynchronization sync = ServiceSynchronization.getInstance(); >>>> + if (sync != null) { >>>> + sync.services.add(new ServiceExecution(dctx, serviceName, runAsUser, context, async, persist, false)); >>>> + } >>>> + } >>>> + >>>> + public static void registerRollbackService(DispatchContext dctx, String serviceName, String runAsUser, Map<String, ? extends Object> context, boolean async, boolean persist) throws GenericServiceException { >>>> + ServiceSynchronization sync = ServiceSynchronization.getInstance(); >>>> + if (sync != null) { >>>> + sync.services.add(new ServiceExecution(dctx, serviceName, runAsUser, context, async, persist, true)); >>>> + } >>>> + } >>>> + >>>> + protected static ServiceSynchronization getInstance() throws GenericServiceException { >>>> + ServiceSynchronization sync = null; >>>> + try { >>>> + Transaction transaction = TransactionFactory.getTransactionManager().getTransaction(); >>>> + synchronized (transaction) { >>>> + sync = syncingleton.get(transaction); >>>> + if (sync == null) { >>>> + sync = new ServiceSynchronization(); >>>> + transaction.registerSynchronization(sync); >>>> + syncingleton.put(transaction, sync); >>>> + } >>>> + } >>>> + } catch (SystemException e) { >>>> + throw new GenericServiceException(e.getMessage(), e); >>>> + } catch (IllegalStateException e) { >>>> + throw new GenericServiceException(e.getMessage(), e); >>>> + } catch (RollbackException e) { >>>> + throw new GenericServiceException(e.getMessage(), e); >>>> + } >>>> + return sync; >>>> + } >>>> + >>>> + @Override >>>> + public void afterCompletion(int status) { >>>> + for (ServiceExecution serviceExec : this.services) { >>>> + serviceExec.runService(status); >>>> + } >>>> + } >>>> + >>>> + @Override >>>> + public void beforeCompletion() { >>>> + >>>> + } >>>> + >>>> + static class ServiceExecution { >>>> + protected DispatchContext dctx = null; >>>> + protected String serviceName; >>>> + protected String runAsUser = null; >>>> + protected Map<String, ? extends Object> context = null; >>>> + protected boolean rollback = false; >>>> + protected boolean persist = true; >>>> + protected boolean async = false; >>>> + >>>> + ServiceExecution(DispatchContext dctx, String serviceName, String runAsUser, Map<String, ? extends Object> context, boolean async, boolean persist, boolean rollback) { >>>> + this.dctx = dctx; >>>> + this.serviceName = serviceName; >>>> + this.runAsUser = runAsUser; >>>> + this.context = context; >>>> + this.async = async; >>>> + this.persist = persist; >>>> + this.rollback = rollback; >>>> + } >>>> + >>>> + protected void runService(int status) { >>>> + if ((status == Status.STATUS_COMMITTED && !rollback) || (status == Status.STATUS_ROLLEDBACK && rollback)) { >>>> + Thread thread = new Thread() { >>>> + @Override >>>> + public void run() { >>>> + String msgPrefix = null; >>>> + if (rollback) { >>>> + msgPrefix = "[Rollback] "; >>>> + } else { >>>> + msgPrefix = "[Commit] "; >>>> + } >>>> + >>>> + boolean beganTx; >>>> + try { >>>> + // begin the new tx >>>> + beganTx = TransactionUtil.begin(); >>>> + // configure and run the service >>>> + try { >>>> + // obtain the model and get the valid context >>>> + ModelService model = dctx.getModelService(serviceName); >>>> + Map<String, Object> thisContext; >>>> + if (model.validate) { >>>> + thisContext = model.makeValid(context, ModelService.IN_PARAM); >>>> + } else { >>>> + thisContext = FastMap.newInstance(); >>>> + thisContext.putAll(context); >>>> + } >>>> + >>>> + // set the userLogin object >>>> + thisContext.put("userLogin", ServiceUtil.getUserLogin(dctx, thisContext, runAsUser)); >>>> + if (async) { >>>> + if (Debug.infoOn()) Debug.logInfo(msgPrefix + "Invoking [" + serviceName + "] via runAsync", MODULE); >>>> + dctx.getDispatcher().runAsync(serviceName, thisContext, persist); >>>> + } else { >>>> + if (Debug.infoOn()) Debug.logInfo(msgPrefix + "Invoking [" + serviceName + "] via runSyncIgnore", MODULE); >>>> + dctx.getDispatcher().runSyncIgnore(serviceName, thisContext); >>>> + } >>>> + } catch (Throwable t) { >>>> + Debug.logError(t, "Problem calling " + msgPrefix + "service : " + serviceName + " / " + context, MODULE); >>>> + try { >>>> + TransactionUtil.rollback(beganTx, t.getMessage(), t); >>>> + } catch (GenericTransactionException e) { >>>> + Debug.logError(e, MODULE); >>>> + } >>>> + >>>> + } finally { >>>> + // commit the transaction >>>> + try { >>>> + TransactionUtil.commit(beganTx); >>>> + } catch (GenericTransactionException e) { >>>> + Debug.logError(e, MODULE); >>>> + } >>>> + } >>>> + } catch (GenericTransactionException e) { >>>> + Debug.logError(e, MODULE); >>>> + } >>>> + >>>> + } >>>> + }; >>>> + thread.start(); >>>> + } >>>> + } >>>> + } >>>> + >>>> +} >>>> >>>> Propchange: ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java >>>> ------------------------------------------------------------------------------ >>>> svn:eol-style = native >>>> >>>> Propchange: ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java >>>> ------------------------------------------------------------------------------ >>>> svn:keywords = "Date Rev Author URL Id" >>>> >>>> Propchange: ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceSynchronization.java >>>> ------------------------------------------------------------------------------ >>>> svn:mime-type = text/plain >>>> >>>> Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceXaWrapper.java >>>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceXaWrapper.java?rev=1616925&r1=1616924&r2=1616925&view=diff >>>> ============================================================================== >>>> --- ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceXaWrapper.java (original) >>>> +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceXaWrapper.java Sat Aug 9 09:00:39 2014 >>>> @@ -34,7 +34,9 @@ import org.ofbiz.entity.transaction.Tran >>>> >>>> /** >>>> * ServiceXaWrapper - XA Resource wrapper for running services on commit() or rollback() >>>> + * @deprecated - Use ServiceSynchronization instead (via LocalDispatcher) >>>> */ >>>> +@Deprecated >>>> public class ServiceXaWrapper extends GenericXaResource { >>>> >>>> public static final String module = ServiceXaWrapper.class.getName(); >>>> >>>> Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaAction.java >>>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaAction.java?rev=1616925&r1=1616924&r2=1616925&view=diff >>>> ============================================================================== >>>> --- ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaAction.java (original) >>>> +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaAction.java Sat Aug 9 09:00:39 2014 >>>> @@ -22,8 +22,6 @@ import java.util.LinkedList; >>>> import java.util.List; >>>> import java.util.Map; >>>> >>>> -import javax.transaction.xa.XAException; >>>> - >>>> import javolution.util.FastMap; >>>> >>>> import org.ofbiz.base.util.Debug; >>>> @@ -33,8 +31,8 @@ import org.ofbiz.service.DispatchContext >>>> import org.ofbiz.service.GenericServiceException; >>>> import org.ofbiz.service.LocalDispatcher; >>>> import org.ofbiz.service.ModelService; >>>> +import org.ofbiz.service.ServiceSynchronization; >>>> import org.ofbiz.service.ServiceUtil; >>>> -import org.ofbiz.service.ServiceXaWrapper; >>>> import org.w3c.dom.Element; >>>> >>>> /** >>>> @@ -115,19 +113,12 @@ public class ServiceEcaAction implements >>>> } >>>> >>>> if (eventName.startsWith("global-")) { >>>> - // XA resource ECA >>>> - ServiceXaWrapper xaw = new ServiceXaWrapper(dctx); >>>> if (eventName.equals("global-rollback")) { >>>> - xaw.setRollbackService(serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates >>>> + ServiceSynchronization.registerRollbackService(dctx, serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates >>>> } else if (eventName.equals("global-commit")) { >>>> - xaw.setCommitService(serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates >>>> + ServiceSynchronization.registerCommitService(dctx, serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates >>>> } else if (eventName.equals("global-commit-post-run")) { >>>> - xaw.setCommitService(serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates >>>> - } >>>> - try { >>>> - xaw.enlist(); >>>> - } catch (XAException e) { >>>> - throw new GenericServiceException("Unable to enlist ServiceXaWrapper with transaction", e); >>>> + ServiceSynchronization.registerCommitService(dctx, serviceName, runAsUser, context, "async".equals(serviceMode), persist); // using the actual context so we get updates >>>> } >>>> } else { >>>> // standard ECA >>>> >>>> >> > |
Free forum by Nabble | Edit this page |