[jira] [Commented] (OFBIZ-6808) Calling Groovy as Event generates error when delegator.find used

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

[jira] [Commented] (OFBIZ-6808) Calling Groovy as Event generates error when delegator.find used

Nicolas Malin (Jira)

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

Jacques Le Roux commented on OFBIZ-6808:
----------------------------------------

Even if I wonder why this was not done in 1st place, I see no reasons not to do so. I guess initially events were not intended to change things hence no need for transactions. But indeed, at least, a find should be allowed.

I just note here that we should then slightly change the last point at https://cwiki.apache.org/confluence/display/OFBIZ/FAQ+-+Tips+-+Tricks+-+Cookbook+-+HowTo#FAQ-Tips-Tricks-Cookbook-HowTo-DifferenceBetweenEventAndService

> 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
>
> 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)