Thanks to @Andi and @Dan who pointed out that this is fixed and would be available in next version RC1 https://issues.apache.org/jira/browse/ISIS-2978 <https://issues.apache.org/jira/browse/ISIS-2978>

On 5/23/22 2:00 PM, Dhruv wrote:

Hi,

Been long term using apache-isis 1.x for client delivered prototypes successfully. Recently just in 5 weeks we delivered moderately complex app on Azure in production using 2.0.0-M7 (We knew its not release version, but we have been betting on our team's previous know-how and solid isis code-base on fixing any blockers we might get in our way, can share more details if anyone wants on user list for building confidence.) Thank you all here for having such a solid piece of opensource available for enterprise applications.

   Talking about blockers we found, the most notorious one, which we are not sure how to help solve within apache-isis is this one.

    "In Java SE 9, threads that are part of the fork/join common pool will always return the system class loader as their thread context class loader. In previous releases, the thread context class loader may have been inherited from whatever thread causes the creation of the fork/join common pool thread, e.g. by submitting a task. An application cannot reliably depend on when, or how, threads are created by the fork/join common pool, and as such cannot reliably depend on a custom defined class loader to be set as the thread context class loader."

    So in summary, the spring-boot class-loader is not available to any of the work being done in fork-join pool (e.g. submitted for async executions or parallel streams ) and that raises some odd "ClassNotFoundExceptions".

    The easiest way to reproduce is :

    ~/github/isis-app-simpleapp$ mvn clean install

    ~/github/isis-app-simpleapp$ java -jar webapp/target/simpleapp-jpa-webapp-2.0.0-M7-exec.jar


    It would fail with following Jaxb related classes not found error, which are in-fact available in spring-boot classloader but the ForkJoinPool.commonPool-worker uses system-class loader where these would not exists

 ERROR 13763 --- [onPool-worker-3] o.a.i.c.r.m.MenuBarsLoaderServiceDefault : org.apache.isis.core.config.viewer.web.WebAppContextPath: could not find readable resource class path resource [menubars.layout.xml] for the Menubars-Layout.

java.lang.RuntimeException: unrecoverable error: 'Error unmarshalling XML; object class is 'org.apache.isis.applib.layout.menubars.bootstrap3.BS3MenuBars'' with cause ...         at org.apache.isis.commons.internal.exceptions._Exceptions.unrecoverable(_Exceptions.java:144) ~[isis-commons-2.0.0-M7.jar!/:2.0.0-M7]         at org.apache.isis.commons.internal.resources._Xml.verboseException(_Xml.java:201) ~[isis-commons-2.0.0-M7.jar!/:2.0.0-M7]         at org.apache.isis.applib.services.jaxb.JaxbService$Simple.fromXml(JaxbService.java:160) ~[isis-applib-2.0.0-M7.jar!/:2.0.0-M7]         at org.apache.isis.applib.services.jaxb.JaxbService.fromXml(JaxbService.java:83) ~[isis-applib-2.0.0-M7.jar!/:2.0.0-M7]         at org.apache.isis.core.runtimeservices.menubars.MenuBarsLoaderServiceDefault.loadMenuBars(MenuBarsLoaderServiceDefault.java:101) ~[isis-core-runtimeservices-2.0.0-M7.jar!/:2.0.0-M7]         at org.apache.isis.core.runtimeservices.menubars.MenuBarsLoaderServiceDefault.menuBars(MenuBarsLoaderServiceDefault.java:95) ~[isis-core-runtimeservices-2.0.0-M7.jar!/:2.0.0-M7]         at org.apache.isis.core.runtimeservices.menubars.bootstrap3.MenuBarsServiceBS3.loadOrElse(MenuBarsServiceBS3.java:138) ~[isis-core-runtimeservices-2.0.0-M7.jar!/:2.0.0-M7]         at org.apache.isis.core.runtimeservices.menubars.bootstrap3.MenuBarsServiceBS3.menuBarsDefault(MenuBarsServiceBS3.java:130) ~[isis-core-runtimeservices-2.0.0-M7.jar!/:2.0.0-M7]         at org.apache.isis.core.runtimeservices.menubars.bootstrap3.MenuBarsServiceBS3.menuBars(MenuBarsServiceBS3.java:119) ~[isis-core-runtimeservices-2.0.0-M7.jar!/:2.0.0-M7]         at org.apache.isis.core.runtimeservices.menubars.bootstrap3.MenuBarsServiceBS3.menuBars(MenuBarsServiceBS3.java:82) ~[isis-core-runtimeservices-2.0.0-M7.jar!/:2.0.0-M7]         at org.apache.isis.applib.services.menu.MenuBarsService.menuBars(MenuBarsService.java:61) ~[isis-applib-2.0.0-M7.jar!/:2.0.0-M7]         at org.apache.isis.core.metamodel.specloader.SpecificationLoaderDefault.createMetaModel(SpecificationLoaderDefault.java:301) ~[isis-core-metamodel-2.0.0-M7.jar!/:2.0.0-M7]         at org.apache.isis.commons.internal.concurrent._ConcurrentTask$3.innerCall(_ConcurrentTask.java:150) [isis-commons-2.0.0-M7.jar!/:2.0.0-M7]         at org.apache.isis.commons.internal.concurrent._ConcurrentTask$3.innerCall(_ConcurrentTask.java:146) [isis-commons-2.0.0-M7.jar!/:2.0.0-M7]         at org.apache.isis.commons.internal.concurrent._ConcurrentTask$1.innerCall(_ConcurrentTask.java:109) [isis-commons-2.0.0-M7.jar!/:2.0.0-M7]         at org.apache.isis.commons.internal.concurrent._ConcurrentTask.run(_ConcurrentTask.java:86) [isis-commons-2.0.0-M7.jar!/:2.0.0-M7]         at java.util.concurrent.ForkJoinTask$AdaptedRunnableAction.exec(ForkJoinTask.java:1407) [?:?]         at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290) [?:?]         at java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1020) [?:?]         at java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1656) [?:?]         at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1594) [?:?] *        at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:183) [?:?]* Caused by: java.lang.RuntimeException: unrecoverable error: 'Error obtaining JAXBContext for class; object class is 'org.apache.isis.applib.layout.menubars.bootstrap3.BS3MenuBars'' with cause ...         at org.apache.isis.commons.internal.exceptions._Exceptions.unrecoverable(_Exceptions.java:144) ~[isis-commons-2.0.0-M7.jar!/:2.0.0-M7]         at org.apache.isis.commons.internal.resources._Xml.verboseException(_Xml.java:201) ~[isis-commons-2.0.0-M7.jar!/:2.0.0-M7]         at org.apache.isis.commons.internal.resources._Xml.contextOf(_Xml.java:226) ~[isis-commons-2.0.0-M7.jar!/:2.0.0-M7]         at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1705) ~[?:?]         at org.apache.isis.commons.internal.resources._Xml.jaxbContextFor(_Xml.java:217) ~[isis-commons-2.0.0-M7.jar!/:2.0.0-M7]         at org.apache.isis.applib.services.jaxb.JaxbService$Simple.jaxbContextForClass(JaxbService.java:206) ~[isis-applib-2.0.0-M7.jar!/:2.0.0-M7]         at org.apache.isis.applib.services.jaxb.JaxbService$Simple.fromXml(JaxbService.java:157) ~[isis-applib-2.0.0-M7.jar!/:2.0.0-M7]
        ... 19 more
Caused by: javax.xml.bind.JAXBException: Implementation of JAXB-API has not been found on module path or classpath.         at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:232) ~[jakarta.xml.bind-api-2.3.3.jar!/:2.3.3]         at javax.xml.bind.ContextFinder.find(ContextFinder.java:375) ~[jakarta.xml.bind-api-2.3.3.jar!/:2.3.3]         at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:691) ~[jakarta.xml.bind-api-2.3.3.jar!/:2.3.3]         at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:632) ~[jakarta.xml.bind-api-2.3.3.jar!/:2.3.3]         at org.apache.isis.commons.internal.resources._Xml.contextOf(_Xml.java:224) ~[isis-commons-2.0.0-M7.jar!/:2.0.0-M7]         at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1705) ~[?:?]         at org.apache.isis.commons.internal.resources._Xml.jaxbContextFor(_Xml.java:217) ~[isis-commons-2.0.0-M7.jar!/:2.0.0-M7]         at org.apache.isis.applib.services.jaxb.JaxbService$Simple.jaxbContextForClass(JaxbService.java:206) ~[isis-applib-2.0.0-M7.jar!/:2.0.0-M7]         at org.apache.isis.applib.services.jaxb.JaxbService$Simple.fromXml(JaxbService.java:157) ~[isis-applib-2.0.0-M7.jar!/:2.0.0-M7]
        ... 19 more
Caused by: java.lang.ClassNotFoundException: com.sun.xml.bind.v2.ContextFactory         at jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581) ~[?:?]         at jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) ~[?:?]
        at java.lang.ClassLoader.loadClass(ClassLoader.java:522) ~[?:?]
        at javax.xml.bind.ServiceLoaderUtil.nullSafeLoadClass(ServiceLoaderUtil.java:92) ~[jakarta.xml.bind-api-2.3.3.jar!/:2.3.3]         at javax.xml.bind.ServiceLoaderUtil.safeLoadClass(ServiceLoaderUtil.java:125) ~[jakarta.xml.bind-api-2.3.3.jar!/:2.3.3]         at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:230) ~[jakarta.xml.bind-api-2.3.3.jar!/:2.3.3]         at javax.xml.bind.ContextFinder.find(ContextFinder.java:375) ~[jakarta.xml.bind-api-2.3.3.jar!/:2.3.3]         at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:691) ~[jakarta.xml.bind-api-2.3.3.jar!/:2.3.3]         at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:632) ~[jakarta.xml.bind-api-2.3.3.jar!/:2.3.3]         at org.apache.isis.commons.internal.resources._Xml.contextOf(_Xml.java:224) ~[isis-commons-2.0.0-M7.jar!/:2.0.0-M7]         at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1705) ~[?:?]         at org.apache.isis.commons.internal.resources._Xml.jaxbContextFor(_Xml.java:217) ~[isis-commons-2.0.0-M7.jar!/:2.0.0-M7]         at org.apache.isis.applib.services.jaxb.JaxbService$Simple.jaxbContextForClass(JaxbService.java:206) ~[isis-applib-2.0.0-M7.jar!/:2.0.0-M7]         at org.apache.isis.applib.services.jaxb.JaxbService$Simple.fromXml(JaxbService.java:157) ~[isis-applib-2.0.0-M7.jar!/:2.0.0-M7]
        ... 19 more

    P.S. To note, the spring-boot:run and integration test launchers use exploded-jar deployment thus these errors won't come in an IDE/build/test, but only when using jar based deployment environment/docker.

    It seems the proper fix is that async executions should be using custom pool/executor. It would be better if someone from core team can confirm about the solution, we would be happy to help patch.

    Related details :

https://stackoverflow.com/a/49426561

https://stackoverflow.com/a/59444016

https://stackoverflow.com/a/64455537 (we did custom rebuild of exe jar to solve this)

Thanks,

Dhruv


Reply via email to