I would not expect any problems because of Groovy here, so far Groovy-Classes have behaved like Java-Classes in my projects

Wolfgang

Am 20.04.2018 um 17:03 schrieb Blake McBride:
Yes, it is calling a static method on a Groovy class.  Is there a problem with what I am doing in term of re-entrant or multi-entrant interference?

Thanks.

Blake


On Fri, Apr 20, 2018 at 8:16 AM, Wolfgang Pedot <[email protected] <mailto:[email protected]>> wrote:

    I dont know, your code looks like it is calling a static method on
    a class.

    What I was referring to was using something like
    GroovyScriptEngine.createScript and reusing the returned
    Script-Object.

    Wolfgang

    Am 20.04.2018 um 14:32 schrieb Blake McBride:

        Every time I call Groovy from Java I do the following code
        snippets.  Does this have the problem you are referring to?

        public void runGroovy(String fileName) {
             JSONObject injson = ...
             JSONObject outjson = ...
             HibernateSessionUtil hsu = ...

             GroovyClass gclass =loadClass(fileName,true);
             if (gclass !=null) {
                 Class[] ca = {
                         JSONObject.class,
                         JSONObject.class,
                         HibernateSessionUtil.class,
                         HTMLFlex.class };

                 try {
                     @SuppressWarnings("unchecked")
                     Method methp = gclass.getMethod(_method, ca);
                     if (methp ==null) {
                         errorReturn(response,"Method " + _method +"
        not found in class " +this.getClass().getName(),null);
                         return;
                     }
                     methp.invoke(null, injson, outjson, hsu,this);
                 }catch (Exception e) {
                     errorReturn(response,"Error running method " +
        _method +" in class " +this.getClass().getName(), e);
                     return;
                 }
             }else {
                 errorReturn(response,"Error loading " + fileName,null);
                 return;
             }
        }
        public synchronized static GroovyClass loadClass(String
        fileName, boolean report) { GroovyClass gclass; *[some class
        cacheing code]*try { gclass = new GroovyClass(false,
        fileName); classCache.put(fileName, new ClassInfo(gclass, (new
        File(fileName)).lastModified())); } catch
        (FileNotFoundException e) { if (report) logger.error("File " +
        fileName + " not found", e); return null; } catch (Exception
        e) { if (report) logger.error("Error loading " + fileName, e);
        return null; } return gclass; }



        On Fri, Apr 20, 2018 at 7:15 AM, Wolfgang Pedot
        <[email protected]
        <mailto:[email protected]>
        <mailto:[email protected]
        <mailto:[email protected]>>> wrote:

            For Groovy-scripts you need to know that each instance of
        a script
            has a Binding to store variables in it and that may cause
            re-entrance or concurrency issues if you dont create a new
        script
            instance for each call.

            Wolfgang

            Am 20.04.2018 um 11:21 schrieb Blake McBride:

                Greetings,

                Does Groovy safely support re-entrant and
        multi-entrant calls?
                What I mean by that is the following:

                Re-entrant: on a single OS thread - my Java program
        calls into
                Groovy, then Groovy calls into my Java application,
        and then
                the Java application calls back into Groovy. So the
        stack has
                Java, Groovy, JAVA, and then Groovy again.

                Multi-entrant: my Java application has many threads. 
        One of
                my threads calls into Groovy. Then, while one thread
        is still
                in Groovy, another thread evokes Groovy. So now we
        have two
                calls into Groovy by two independent Java/OS threads
        running
                at the same time.

                I understand the typical problems associated with
                application-level shared variables. This is expected.  The
                question revolves around Groovy's internals.  I
        presume Groovy
                may have some shared data that is internal to Groovy.
        That's
                what I am unclear about. Groovy would have had to be
        designed
                for these scenarios from the ground up.

                This is a little hard to test because if it can't always
                correctly handle these situations, it may not become clear
                until certain scenarios arrive.  It may be hard for
        any "test"
                program I write to cause those scenarios, so I thought
        this
                may be a known answer.

                Thanks!

                Blake McBride


Reply via email to