Fixed in r1616928 Regards Scott
On 9/08/2014, at 12:41 pm, Scott Gray <[email protected]> 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 <[email protected]> > wrote: > >> :( >> >> I thought we stopped using Javolution. >> >> Adrian Crum >> Sandglass Software >> www.sandglass-software.com >> >> On 8/9/2014 10:00 AM, [email protected] 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 >>> >>> >
