ofbiz-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Adrian Crum <adrian.c...@sandglass-software.com>
Subject Re: svn commit: r1616925 - in /ofbiz/trunk: applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ framework/common/src/org/ofbiz/common/ framework/service/src/org/ofbiz/service/ framework/service/src/org/ofbiz/service/eca/
Date Sat, 09 Aug 2014 09:24:46 GMT
:(

I thought we stopped using Javolution.

Adrian Crum
Sandglass Software
www.sandglass-software.com

On 8/9/2014 10:00 AM, lektran@apache.org 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
>
>

Mime
View raw message