You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@ofbiz.apache.org by "Jeffrey Breault (JIRA)" <ji...@apache.org> on 2017/09/15 13:40:00 UTC

[jira] [Created] (OFBIZ-9725) Transaction Timeout in JavaEventHandler

Jeffrey Breault created OFBIZ-9725:
--------------------------------------

             Summary: Transaction Timeout in JavaEventHandler
                 Key: OFBIZ-9725
                 URL: https://issues.apache.org/jira/browse/OFBIZ-9725
             Project: OFBiz
          Issue Type: Bug
          Components: framework/webtools
    Affects Versions: Release Branch 14.12
         Environment: Red Hat Enterprise Linux, release branch 14.12
            Reporter: Jeffrey Breault


I have a service that is scheduled using the webtools scheduler.

I am attempting to use the following service definition


{noformat}
<service name="myCustomService" engine="java" transaction-timeout="36000" require-new-transaction="true"
             location="my.package" invoke="myCustomService" auth="true">
        <description>Run this very long function</description>
    </service>
{noformat}

The function in question is getting data from an oracle database and sanitizing the records and then inserting them into a postgresql database.  There are millions of records in the oracle database and I am grabbing the records in batches of 200, sanitizing them then committing them using a GenericValue.create() method.

Using verbose logging we have the following log messages to indicate that the transaction timeout is being used...


{noformat}
2017-09-15 06:30:48,372 |http-bio-8443-exec-8 |ServiceDispatcher             |D| [ServiceDispatcher.runSync] : invoking service myCustomService [my.package/myCustomService] (java)
2017-09-15 06:30:48,372 |http-bio-8443-exec-8 |TransactionUtil               |D| Current status : No Transaction (6)
2017-09-15 06:30:48,372 |http-bio-8443-exec-8 |TransactionUtil               |D| Set transaction timeout to : 36000 seconds
2017-09-15 06:30:48,372 |http-bio-8443-exec-8 |TransactionUtil               |D| Transaction begun
{noformat}

So, I have the transaction timeout set to 36,000 seconds and the job finishes in 552,515 milliseconds (about 9.2 minutes), but then the JavaEventHandler's finally clause hits a commit and that causes a timeout


{code:java}
private String invoke(String eventPath, String eventMethod, Class<?> eventClass, Class<?>[] paramTypes, Object[] params) throws EventHandlerException {
        boolean beganTransaction = false;
        if (eventClass == null) {
            throw new EventHandlerException("Error invoking event, the class " + eventPath + " was not found");
        }
        if (eventPath == null || eventMethod == null) {
            throw new EventHandlerException("Invalid event method or path; call initialize()");
        }

        Debug.logVerbose("[Processing]: JAVA Event", module);
        try {
            beganTransaction = TransactionUtil.begin();
            Method m = eventClass.getMethod(eventMethod, paramTypes);
            String eventReturn = (String) m.invoke(null, params);

            if (Debug.verboseOn()) Debug.logVerbose("[Event Return]: " + eventReturn, module);
            return eventReturn;
        } catch (java.lang.reflect.InvocationTargetException e) {
            Throwable t = e.getTargetException();

            if (t != null) {
                Debug.logError(t, "Problems Processing Event", module);
                throw new EventHandlerException("Problems processing event: " + t.toString(), t);
            } else {
                Debug.logError(e, "Problems Processing Event", module);
                throw new EventHandlerException("Problems processing event: " + e.toString(), e);
            }
        } catch (Exception e) {
            Debug.logError(e, "Problems Processing Event", module);
            throw new EventHandlerException("Problems processing event: " + e.toString(), e);
        } finally {
            try {
                TransactionUtil.commit(beganTransaction);
            } catch (GenericTransactionException e) {
                Debug.logError(e, module);
            }
        }
    }
{code}

It appears that the invoking of my service creates a default timeout transaction (using GeronimoTransactionFactory's default timeout of 60 seconds)  Which is then suspended by my request-new-transaction and uses my custom timeout parameter.  When the service is finished the commit occurs and the default transaction resumes, and is then committed, which causes the stack-trace. 

This is an error in our production environment so I would like a patch to be created if at all possible.



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)