[ 
https://issues.apache.org/jira/browse/OFBIZ-6808?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15244115#comment-15244115
 ] 

Swapnil M Mane commented on OFBIZ-6808:
---------------------------------------

Dear Jacopo and Jacques, thanks so much for such a detailed discussion :-) 

As per the suggestion above, 
We have created the patch for starting the transaction and committing it for 
the following handlers.

1.) GroovyEventHandler
2.) JavaEventHandler
3.) SimpleEventHandler

For the following handlers, there is already the support of transaction

1.) ServiceEventHandle
2.) ServiceMultiEventHandler
3.) ServiceStreamHandler


For the following handler, we need your thoughts, should we also provide 
transaction support for these handlers as well

1.) SOAPEventHandler
2.) XmlRpcEventHandler
3.) RomeEventHandler
4.) ScriptEventHandler

We request you to kindly review the patch and let us know your kind feedback.

> Calling Groovy as Event generates error when delegator.find used
> ----------------------------------------------------------------
>
>                 Key: OFBIZ-6808
>                 URL: https://issues.apache.org/jira/browse/OFBIZ-6808
>             Project: OFBiz
>          Issue Type: Bug
>          Components: framework
>    Affects Versions: Trunk, Upcoming Branch
>            Reporter: Swapnil M Mane
>         Attachments: OFBIZ-6808.patch
>
>
> We are using Groovy as event in the controller request, everything works fine 
> for us but as we used delegator.find()
> it generates the following error
> -----------------------------------------------------------------------------------------------------------------------------------------------------------
> ERROR: Cannot do a find that returns an EntityListIterator with no 
> transaction in place. Wrap this call in a transaction.
>      [java] java.lang.Exception: Stack Trace
>      [java]   at 
> org.ofbiz.entity.GenericDelegator.find(GenericDelegator.java:1757) 
> [ofbiz-entity.jar:?]
>      [java]   at org.ofbiz.entity.Delegator$find.call(Unknown Source) 
> [ofbiz-entity.jar:?]
>      [java]   at 
> org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
>  [groovy-all-2.2.1.jar:2.2.1]
>      [java]   at 
> org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
>  [groovy-all-2.2.1.jar:2.2.1]
>      [java]   at 
> ProductInventory$_run_closure1.doCall(ProductInventory.groovy:18) [script:?]
>      [java]   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
> ~[?:1.8.0_60]
>      [java]   at 
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
> ~[?:1.8.0_60]
>      [java]   at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>  ~[?:1.8.0_60]
>      [java]   at java.lang.reflect.Method.invoke(Method.java:497) 
> ~[?:1.8.0_60]
>      [java]   at 
> org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90) 
> [groovy-all-2.2.1.jar:2.2.1]
>      [java]   at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233) 
> [groovy-all-2.2.1.jar:2.2.1]
>      [java]   at 
> org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272)
>  [groovy-all-2.2.1.jar:2.2.1]
>      [java]   at 
> groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:909) 
> [groovy-all-2.2.1.jar:2.2.1]
>      [java]   at groovy.lang.Closure.call(Closure.java:423) 
> [groovy-all-2.2.1.jar:2.2.1]
>      [java]   at groovy.lang.Closure.call(Closure.java:439) 
> [groovy-all-2.2.1.jar:2.2.1]
>      [java]   at 
> org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:1324)
>  [groovy-all-2.2.1.jar:2.2.1]
>      [java]   at 
> org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:1296)
>  [groovy-all-2.2.1.jar:2.2.1]
>      [java]   at org.codehaus.groovy.runtime.dgm$147.invoke(Unknown Source) 
> [groovy-all-2.2.1.jar:2.2.1]
>      [java]   at 
> org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoMetaMethodSiteNoUnwrapNoCoerce.invoke(PojoMetaMethodSite.java:271)
>  [groovy-all-2.2.1.jar:2.2.1]
>      [java]   at 
> org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:53)
>  [groovy-all-2.2.1.jar:2.2.1]
>      [java]   at 
> org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
>  [groovy-all-2.2.1.jar:2.2.1]
>      [java]   at 
> org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
>  [groovy-all-2.2.1.jar:2.2.1]
>      [java]   at 
> org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
>  [groovy-all-2.2.1.jar:2.2.1]
>      [java]   at ProductInventory.run(ProductInventory.groovy:11) [script:?]
>      [java]   at 
> org.ofbiz.webapp.event.GroovyEventHandler.invoke(GroovyEventHandler.java:107) 
> [ofbiz-webapp.jar:?]
>      [java]   at 
> org.ofbiz.webapp.control.RequestHandler.runEvent(RequestHandler.java:763) 
> [ofbiz-webapp.jar:?]
>      [java]   at 
> org.ofbiz.webapp.control.RequestHandler.doRequest(RequestHandler.java:476) 
> [ofbiz-webapp.jar:?]
>      [java]   at 
> org.ofbiz.webapp.control.ControlServlet.doGet(ControlServlet.java:210) 
> [ofbiz-webapp.jar:?]
>      [java]   at 
> org.ofbiz.webapp.control.ControlServlet.doPost(ControlServlet.java:89) 
> [ofbiz-webapp.jar:?]
>      [java]   at javax.servlet.http.HttpServlet.service(HttpServlet.java:646) 
> [servlet-api-3.0.jar:?]
>      [java]   at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) 
> [servlet-api-3.0.jar:?]
>      [java]   at 
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
>  [tomcat-7.0.65-catalina.jar:7.0.65]
>      [java]   at 
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
>  [tomcat-7.0.65-catalina.jar:7.0.65]
>      [java]   at 
> org.ofbiz.webapp.control.ContextFilter.doFilter(ContextFilter.java:349) 
> [ofbiz-webapp.jar:?]
>      [java]   at 
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
>  [tomcat-7.0.65-catalina.jar:7.0.65]
>      [java]   at 
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
>  [tomcat-7.0.65-catalina.jar:7.0.65]
>      [java]   at 
> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
>  [tomcat-7.0.65-catalina.jar:7.0.65]
>      [java]   at 
> org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
>  [tomcat-7.0.65-catalina.jar:7.0.65]
>      [java]   at 
> org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)
>  [tomcat-7.0.65-catalina.jar:7.0.65]
>      [java]   at 
> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) 
> [tomcat-7.0.65-catalina.jar:7.0.65]
>      [java]   at 
> org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 
> [tomcat-7.0.65-catalina.jar:7.0.65]
>      [java]   at 
> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
>  [tomcat-7.0.65-catalina.jar:7.0.65]
>      [java]   at 
> org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956) 
> [tomcat-7.0.65-catalina.jar:7.0.65]
>      [java]   at 
> org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423) 
> [tomcat-7.0.65-catalina.jar:7.0.65]
>      [java]   at 
> org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079)
>  [tomcat-7.0.65-tomcat-coyote.jar:7.0.65]
>      [java]   at 
> org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625)
>  [tomcat-7.0.65-tomcat-coyote.jar:7.0.65]
>      [java]   at 
> org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318)
>  [tomcat-7.0.65-tomcat-coyote.jar:7.0.65]
>      [java]   at 
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
>  [?:1.8.0_60]
>      [java]   at 
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
>  [?:1.8.0_60]
>      [java]   at 
> org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
>  [tomcat-7.0.65-tomcat-coyote.jar:7.0.65]
>      [java]   at java.lang.Thread.run(Thread.java:745) [?:1.8.0_60]
> -----------------------------------------------------------------------------------------------------------------------------------------------------------
> Reason: 
> Since we are using find method of GenericDelegator.java
> As per the code implementation it required the transaction should exist 
>    if (!TransactionUtil.isTransactionInPlace()) {
> if not, it generate error
>     ERROR: Cannot do a find that returns an EntityListIterator with no 
> transaction in place. Wrap this call in a transaction.
> -----------------------------------------------------------------------------------------------------------------------------------------------------------
> Possible Solution:
> The one possible solution could be to initialize the transaction when the 
> groovy is called as event and commit the transaction after the completion.
> The following code base at the starting and ending of GroovyEventHandler.java 
> can resolve the issue.
>    // At begining
>     boolean beganTransaction = false;
>     if (!TransactionUtil.isTransactionInPlace()) { 
>         beganTransaction = TransactionUtil.begin(); 
>     }
>    // At End
>    if (beganTransaction) { 
>        TransactionUtil.commit(); 
>    }



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to