quarkusio / quarkus

Quarkus: Supersonic Subatomic Java.
https://quarkus.io
Apache License 2.0
13.63k stars 2.64k forks source link

Support deployment and hot deployment of additional web content beyond src/main/resources/META-INF/resources #3886

Open aaronanderson opened 5 years ago

aaronanderson commented 5 years ago

Description I am developing a web application on Quarkus like this example that uses React and webpack. I have configured my JavaScript build process to publish resources to the supported src/main/resources/META-INF/resources directory and deployment and hot deployment work. However this location is intended to store version controlled sources and is not an ideal location for generated resources.

In addition to the standard web resource location above I would like for the Quarkus undertow extension to support an additional build directory for both packaging and hot deployment of dynamically generated content. target/generated-resources is my suggestion.

Implementation ideas Ideally both src/main/resources/META-INF/resources and target/generated-resources could be merged together for both packaging and hot deployment purposes. It appears knownDirectories is already built into the undertow deployment extension so perhaps this enhancement can be accomplished by simply modifying the maven/gradle plugins to support configuring it.

emmanuelbernard commented 5 years ago

Another though I had recently is whether we should support something like this

-Dquarkus.(static|web)resource.path=/some/other/path

Which would add a new path outside the app containing static resources. It could be listened ot for hotdeployment too as needed. That way you can point your backend to the output dir of your front end project and have a zero copy experience.

Feel free to shoot the idea down if it would not be useful in practice

gsmet commented 5 years ago

@emmanuelbernard I think it's probably something we need to figure out for 1.0? WDYT?

emmanuelbernard commented 5 years ago

It’s in the nice to have category for me. Looks like a net new feature we can put post 1.0 if we have too.

On Mon 9 Sep 2019 at 12:04, Guillaume Smet notifications@github.com wrote:

@emmanuelbernard https://github.com/emmanuelbernard I think it's probably something we need to figure out for 1.0? WDYT?

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/quarkusio/quarkus/issues/3886?email_source=notifications&email_token=AACJNWB2ZYZVNCY3DICDYPDQIYNTVA5CNFSM4IUAJ2J2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOD6G7JXI#issuecomment-529396957, or mute the thread https://github.com/notifications/unsubscribe-auth/AACJNWEFXVQ3R3TG3J3BNN3QIYNTVANCNFSM4IUAJ2JQ .

machi1990 commented 5 years ago

Another though I had recently is whether we should support something like this

-Dquarkus.(static|web)resource.path=/some/other/path

Which would add a new path outside the app containing static resources. It could be listened ot for hotdeployment too as needed. That way you can point your backend to the output dir of your front end project and have a zero copy experience.

Feel free to shoot the idea down if it would not be useful in practice

Hi @emmanuelbernard I am assigning myself this issue as I am planning to give it a go in the coming days.

stale[bot] commented 4 years ago

This issue/pullrequest has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.

rsvoboda commented 4 years ago

Adding ideas from #3018:

Expose just files in the root directory vs. all content and directories recursively

Possibility to expose multiple directories under multiple endpoints (mapping 1:1)

Possibility to expose multiple directories under one endpoint, mapping n:1, challenge with duplicate file names and same sub-directories structure

maxandersen commented 4 years ago

if this is just about having devmode pick up changes from additional locations isn't this better done as something devmode needs to become aware of ?

DaveO-Home commented 4 years ago

Say, based on this discussion, I'm not sure what is supported. However, I have a react demo that hangs when the react javascript is rebundled(fuse-box) with some Java code change and the browser is refreshed. If I manually restart the Quarkus dev server, the changes are deployed and the app works. This also happens when copying static content. The refresh works when I only change Java code. The demo can be found at @ https://www.npmjs.com/package/dodex-quarkus Tested with both 1.5.0 and 1.5.1


import java.io.IOException;
import java.sql.SQLException;

import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.event.Observes;

import dmo.fs.spa.router.SpaRoutes;
import dmo.fs.utils.ColorUtilConstants;
import dmo.fs.utils.DodexUtil;
import io.quarkus.runtime.ShutdownEvent;
import io.quarkus.runtime.StartupEvent;
import io.quarkus.runtime.configuration.ProfileManager;
import io.quarkus.vertx.web.Route;
import io.quarkus.vertx.web.RoutingExchange;
import io.vertx.core.http.HttpMethod;
import io.vertx.core.http.HttpServerResponse;
import io.vertx.core.logging.Logger;
import io.vertx.core.logging.LoggerFactory;
import io.vertx.ext.web.Router;
import io.vertx.ext.web.handler.CorsHandler;
import io.vertx.ext.web.handler.FaviconHandler;
import io.vertx.ext.web.handler.StaticHandler;
import io.vertx.ext.web.handler.TimeoutHandler;

@ApplicationScoped
public class DodexRoutes {
    private final static Logger logger = LoggerFactory.getLogger(DodexRoutes.class.getName());
    private final StaticHandler staticHandler = StaticHandler.create();
    private final boolean isProduction = !ProfileManager.getLaunchMode().isDevOrTest();

    void onStart(@Observes StartupEvent event) {
        String value = System.getenv("VERTXWEB_ENVIRONMENT");
        System.setProperty("org.jooq.no-logo", "true");

        if (isProduction) {
            DodexUtil.setEnv("prod");
            staticHandler.setCachingEnabled(true);
        } else {
            DodexUtil.setEnv(value == null ? "dev" : value);
            staticHandler.setCachingEnabled(false);
        }
        staticHandler.setWebRoot("static");

        logger.info(String.join("", ColorUtilConstants.BLUE_BOLD_BRIGHT, "Dodex Server on Quarkus started",
                ColorUtilConstants.RESET));
    }

    void onStop(@Observes ShutdownEvent event) {
        logger.info(String.join("", ColorUtilConstants.BLUE_BOLD_BRIGHT, "Stopping Quarkus", ColorUtilConstants.RESET));
    }

    @Route(regex = "/test[/]?|/test/.*\\.html", methods = HttpMethod.GET)
    void test(RoutingExchange ex) {
        HttpServerResponse response = ex.response(); // routingContext.response();
        response.putHeader("content-type", "text/html");

        if (isProduction) {
            response.setStatusCode(404).end("not found");
        } else {
            int length = ex.context().request().path().length();
            String path = ex.context().request().path();
            String file = length < 7 ? "test/index.html" : path.substring(1);

            response.sendFile(file);
        }
    }

    // dodex conflicts with websocket endpoint "/dodex" so using ddex
    @Route(regex = "/ddex[/]?|/ddex/.*\\.html", methods = HttpMethod.GET)
    public void prod(RoutingExchange ex) {
        HttpServerResponse response = ex.response(); // routingContext.response();
        response.putHeader("content-type", "text/html");

        if(isProduction) {
            int length = ex.context().request().path().length();
            String path = ex.context().request().path();
            String file = length < 7 ? "dodex/index.html" : path.substring(1).replace("ddex", "dodex");

            response.sendFile(file);
        } else {
            response.setStatusCode(404).end("not found");
        }
    }

    // static content and Spa Routes
    public void init(@Observes Router router) {
        SpaRoutes spaRoutes;
        Router vertxRouter = router;
        router.route("/*").handler(staticHandler).handler(TimeoutHandler.create(2000));
        FaviconHandler faviconHandler = FaviconHandler.create();

        if (DodexUtil.getEnv().equals("dev")) {
            router.route().handler(CorsHandler.create("*"/* Need ports 8089 & 9876 */).allowedMethod(HttpMethod.GET));
        }

        try {
            spaRoutes = new SpaRoutes(router);
            vertxRouter = spaRoutes.getRouter();
        } catch (InterruptedException | IOException | SQLException e) {
            e.printStackTrace();
        }

        vertxRouter.route().handler(faviconHandler);
    }
}
maxandersen commented 4 years ago

hangs where exactly ?

DaveO-Home commented 4 years ago

When I refresh the browser, it never responds. I'm using gradle. (6.5) It appears to me that static content is not being redeployed. (the js bundle is really static content)

DaveO-Home commented 4 years ago

One thing I didn't mention; my app runs under Vert.x so the vertical has to be redeployed.

jaikiran commented 4 years ago

Hello @DaveO-Home

However, I have a react demo that hangs when the react javascript is rebundled(fuse-box) with some Java code change and the browser is refreshed. If I manually restart the Quarkus dev server, the changes are deployed and the app works.

When it hangs, can you get us the thread dump (using jstack for example) of the Quarkus dev mode Java process? Take 2-3 thread dumps, separated by around 5 seconds each so that we can compare them to see what's going on.

DaveO-Home commented 4 years ago

Ran jhsdb jstack --pid 87613 > notokdump.dat - below is a diff between working and not working:

diff okdump.dat notokdump.dat 
22,23c22,23
<  - com.esotericsoftware.kryo.io.Input.readInt(boolean) @bci=2, line=350 (Interpreted frame)
<  - org.gradle.internal.serialize.kryo.KryoBackedDecoder.readSmallInt() @bci=5, line=127 (Interpreted frame)
---
>  - com.esotericsoftware.kryo.io.Input.readInt(boolean) @bci=2, line=350 (Compiled frame)
>  - org.gradle.internal.serialize.kryo.KryoBackedDecoder.readSmallInt() @bci=5, line=127 (Compiled frame)
110,112c110
<  - java.util.concurrent.ThreadPoolExecutor.runWorker(java.util.concurrent.ThreadPoolExecutor$Worker) @bci=26, line=1116 (Interpreted frame)
<  - java.util.concurrent.ThreadPoolExecutor$Worker.run() @bci=5, line=630 (Interpreted frame)
<  - java.lang.Thread.run() @bci=11, line=832 (Interpreted frame)
---
> Error occurred during stack walking:

Also got this against the non-working dump;

sun.jvm.hotspot.utilities.AssertionFailure: sanity check
    at jdk.hotspot.agent/sun.jvm.hotspot.utilities.Assert.that(Assert.java:32)
    at jdk.hotspot.agent/sun.jvm.hotspot.runtime.RegisterMap.setLocation(RegisterMap.java:158)
    at jdk.hotspot.agent/sun.jvm.hotspot.compiler.ImmutableOopMapSet.updateRegisterMap(ImmutableOopMapSet.java:301)
    at jdk.hotspot.agent/sun.jvm.hotspot.runtime.x86.X86Frame.senderForCompiledFrame(X86Frame.java:399)
    at jdk.hotspot.agent/sun.jvm.hotspot.runtime.x86.X86Frame.sender(X86Frame.java:290)
    at jdk.hotspot.agent/sun.jvm.hotspot.runtime.Frame.sender(Frame.java:205)
    at jdk.hotspot.agent/sun.jvm.hotspot.runtime.Frame.realSender(Frame.java:210)
    at jdk.hotspot.agent/sun.jvm.hotspot.runtime.VFrame.sender(VFrame.java:119)
    at jdk.hotspot.agent/sun.jvm.hotspot.runtime.CompiledVFrame.sender(CompiledVFrame.java:186)
    at jdk.hotspot.agent/sun.jvm.hotspot.runtime.VFrame.javaSender(VFrame.java:143)
    at jdk.hotspot.agent/sun.jvm.hotspot.tools.StackTrace.run(StackTrace.java:81)
    at jdk.hotspot.agent/sun.jvm.hotspot.tools.StackTrace.run(StackTrace.java:45)
    at jdk.hotspot.agent/sun.jvm.hotspot.tools.JStack.run(JStack.java:67)
    at jdk.hotspot.agent/sun.jvm.hotspot.tools.Tool.startInternal(Tool.java:262)
    at jdk.hotspot.agent/sun.jvm.hotspot.tools.Tool.start(Tool.java:225)
    at jdk.hotspot.agent/sun.jvm.hotspot.tools.Tool.execute(Tool.java:118)
    at jdk.hotspot.agent/sun.jvm.hotspot.tools.JStack.runWithArgs(JStack.java:90)
    at jdk.hotspot.agent/sun.jvm.hotspot.SALauncher.runJSTACK(SALauncher.java:290)
    at jdk.hotspot.agent/sun.jvm.hotspot.SALauncher.main(SALauncher.java:406)

The non-working dump;

Attaching to process ID 87613, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 14.0.1+7
Deadlock Detection:

No deadlocks found.

"main" #1 prio=5 tid=0x00007fe24c029800 nid=0x15647 runnable [0x00007fe25181d000]
   java.lang.Thread.State: RUNNABLE
   JavaThread state: _thread_in_native
 - sun.nio.ch.EPoll.wait(int, long, int, int) @bci=0 (Interpreted frame)
 - sun.nio.ch.EPollSelectorImpl.doSelect(java.util.function.Consumer, long) @bci=96, line=120 (Interpreted frame)
 - sun.nio.ch.SelectorImpl.lockAndDoSelect(java.util.function.Consumer, long) @bci=42, line=129 (Interpreted frame)
    - locked <0x00000000ff25fc00> (a sun.nio.ch.EPollSelectorImpl)
    - locked <0x00000000ff25ffa0> (a sun.nio.ch.Util$2)
 - sun.nio.ch.SelectorImpl.select() @bci=5, line=146 (Interpreted frame)
 - org.gradle.internal.remote.internal.inet.SocketConnection$SocketInputStream.read(byte[], int, int) @bci=20, line=185 (Interpreted frame)
 - com.esotericsoftware.kryo.io.Input.fill(byte[], int, int) @bci=16, line=146 (Compiled frame)
 - com.esotericsoftware.kryo.io.Input.require(int) @bci=174, line=178 (Compiled frame)
 - com.esotericsoftware.kryo.io.Input.readVarInt(boolean) @bci=2, line=355 (Interpreted frame)
 - com.esotericsoftware.kryo.io.Input.readInt(boolean) @bci=2, line=350 (Compiled frame)
 - org.gradle.internal.serialize.kryo.KryoBackedDecoder.readSmallInt() @bci=5, line=127 (Compiled frame)
 - org.gradle.internal.serialize.DefaultSerializerRegistry$TaggedTypeSerializer.read(org.gradle.internal.serialize.Decoder) @bci=1, line=142 (Interpreted frame)
 - org.gradle.internal.serialize.Serializers$StatefulSerializerAdapter$1.read() @bci=11, line=36 (Interpreted frame)
 - org.gradle.internal.remote.internal.inet.SocketConnection.receive() @bci=4, line=81 (Interpreted frame)
 - org.gradle.launcher.daemon.client.DaemonClientConnection.receive() @bci=4, line=77 (Interpreted frame)
 - org.gradle.launcher.daemon.client.DaemonClientConnection.receive() @bci=1, line=35 (Interpreted frame)
 - org.gradle.launcher.daemon.client.DaemonClient.monitorBuild(org.gradle.launcher.daemon.protocol.Build, org.gradle.launcher.daemon.diagnostics.DaemonDiagnostics, org.gradle.internal.remote.internal.Connection, org.gradle.initialization.BuildCancellationToken, org.gradle.initialization.BuildEventConsumer) @bci=44, line=216 (Interpreted frame)
 - org.gradle.launcher.daemon.client.DaemonClient.executeBuild(org.gradle.launcher.daemon.protocol.Build, org.gradle.launcher.daemon.client.DaemonClientConnection, org.gradle.initialization.BuildCancellationToken, org.gradle.initialization.BuildEventConsumer) @bci=115, line=185 (Interpreted frame)
 - org.gradle.launcher.daemon.client.DaemonClient.execute(org.gradle.internal.invocation.BuildAction, org.gradle.initialization.BuildRequestContext, org.gradle.launcher.exec.BuildActionParameters, org.gradle.internal.service.ServiceRegistry) @bci=156, line=148 (Interpreted frame)
 - org.gradle.launcher.daemon.client.DaemonClient.execute(org.gradle.internal.invocation.BuildAction, org.gradle.initialization.BuildRequestContext, java.lang.Object, org.gradle.internal.service.ServiceRegistry) @bci=9, line=99 (Interpreted frame)
 - org.gradle.launcher.cli.RunBuildAction.run() @bci=78, line=56 (Interpreted frame)
 - org.gradle.internal.Actions$RunnableActionAdapter.execute(java.lang.Object) @bci=4, line=212 (Interpreted frame)
 - org.gradle.launcher.cli.DefaultCommandLineActionFactory$ParseAndBuildAction.execute(org.gradle.launcher.bootstrap.ExecutionListener) @bci=124, line=294 (Interpreted frame)
 - org.gradle.launcher.cli.DefaultCommandLineActionFactory$ParseAndBuildAction.execute(java.lang.Object) @bci=5, line=266 (Interpreted frame)
 - org.gradle.launcher.cli.DebugLoggerWarningAction.execute(org.gradle.launcher.bootstrap.ExecutionListener) @bci=9, line=82 (Interpreted frame)
 - org.gradle.launcher.cli.DebugLoggerWarningAction.execute(java.lang.Object) @bci=5, line=30 (Interpreted frame)
 - org.gradle.launcher.cli.WelcomeMessageAction.execute(org.gradle.launcher.bootstrap.ExecutionListener) @bci=211, line=92 (Interpreted frame)
 - org.gradle.launcher.cli.WelcomeMessageAction.execute(java.lang.Object) @bci=5, line=38 (Interpreted frame)
 - org.gradle.launcher.cli.NativeServicesInitializingAction.execute(org.gradle.launcher.bootstrap.ExecutionListener) @bci=33, line=44 (Interpreted frame)
 - org.gradle.launcher.cli.NativeServicesInitializingAction.execute(java.lang.Object) @bci=5, line=26 (Interpreted frame)
 - org.gradle.launcher.cli.ExceptionReportingAction.execute(org.gradle.launcher.bootstrap.ExecutionListener) @bci=5, line=41 (Interpreted frame)
 - org.gradle.launcher.cli.ExceptionReportingAction.execute(java.lang.Object) @bci=5, line=26 (Interpreted frame)
 - org.gradle.launcher.cli.DefaultCommandLineActionFactory$WithLogging.execute(org.gradle.launcher.bootstrap.ExecutionListener) @bci=349, line=259 (Interpreted frame)
 - org.gradle.launcher.Main.doAction(java.lang.String[], org.gradle.launcher.bootstrap.ExecutionListener) @bci=14, line=35 (Interpreted frame)
 - org.gradle.launcher.bootstrap.EntryPoint.run(java.lang.String[]) @bci=12, line=50 (Interpreted frame)
 - jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(java.lang.reflect.Method, java.lang.Object, java.lang.Object[]) @bci=0 (Interpreted frame)
 - jdk.internal.reflect.NativeMethodAccessorImpl.invoke(java.lang.Object, java.lang.Object[]) @bci=100, line=62 (Interpreted frame)
 - jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(java.lang.Object, java.lang.Object[]) @bci=6, line=43 (Interpreted frame)
 - java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[]) @bci=59, line=564 (Interpreted frame)
 - org.gradle.launcher.bootstrap.ProcessBootstrap.runNoExit(java.lang.String, java.lang.String[]) @bci=161, line=60 (Interpreted frame)
 - org.gradle.launcher.bootstrap.ProcessBootstrap.run(java.lang.String, java.lang.String[]) @bci=3, line=37 (Interpreted frame)
 - org.gradle.launcher.GradleMain.main(java.lang.String[]) @bci=36, line=31 (Interpreted frame)
 - jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(java.lang.reflect.Method, java.lang.Object, java.lang.Object[]) @bci=0 (Interpreted frame)
 - jdk.internal.reflect.NativeMethodAccessorImpl.invoke(java.lang.Object, java.lang.Object[]) @bci=100, line=62 (Interpreted frame)
 - jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(java.lang.Object, java.lang.Object[]) @bci=6, line=43 (Interpreted frame)
 - java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[]) @bci=59, line=564 (Interpreted frame)
 - org.gradle.wrapper.BootstrapMainStarter.start(java.lang.String[], java.io.File) @bci=105, line=35 (Interpreted frame)
 - org.gradle.wrapper.WrapperExecutor.execute(java.lang.String[], org.gradle.wrapper.Install, org.gradle.wrapper.BootstrapMainStarter) @bci=14, line=108 (Interpreted frame)
 - org.gradle.wrapper.GradleWrapperMain.main(java.lang.String[]) @bci=187, line=63 (Interpreted frame)

"Reference Handler" #2 daemon prio=10 tid=0x00007fe24c0b7800 nid=0x1564e waiting on condition [0x00007fe2341b5000]
   java.lang.Thread.State: RUNNABLE
   JavaThread state: _thread_blocked
 - java.lang.ref.Reference.waitForReferencePendingList() @bci=0 (Interpreted frame)
 - java.lang.ref.Reference.processPendingReferences() @bci=0, line=241 (Interpreted frame)
 - java.lang.ref.Reference$ReferenceHandler.run() @bci=0, line=213 (Interpreted frame)

"Finalizer" #3 daemon prio=8 tid=0x00007fe24c0b9800 nid=0x1564f in Object.wait() [0x00007fe2257fe000]
   java.lang.Thread.State: WAITING (on object monitor)
   JavaThread state: _thread_blocked
 - java.lang.Object.wait(long) @bci=0 (Interpreted frame)
    - waiting on <0x00000000fc86b170> (a java.lang.ref.ReferenceQueue$Lock)
 - java.lang.ref.ReferenceQueue.remove(long) @bci=59, line=155 (Interpreted frame)
    - locked <0x00000000fc86b170> (a java.lang.ref.ReferenceQueue$Lock)
 - java.lang.ref.ReferenceQueue.remove() @bci=2, line=176 (Interpreted frame)
 - java.lang.ref.Finalizer$FinalizerThread.run() @bci=37, line=170 (Interpreted frame)

"Signal Dispatcher" #4 daemon prio=9 tid=0x00007fe24c0bf800 nid=0x15650 runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE
   JavaThread state: _thread_blocked

"Common-Cleaner" #11 daemon prio=8 tid=0x00007fe24c10d000 nid=0x15657 in Object.wait() [0x00007fe224ff5000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
   JavaThread state: _thread_blocked
 - java.lang.Object.wait(long) @bci=0 (Interpreted frame)
    - waiting on <0x00000000fc86bc18> (a java.lang.ref.ReferenceQueue$Lock)
 - java.lang.ref.ReferenceQueue.remove(long) @bci=59, line=155 (Interpreted frame)
    - locked <0x00000000fc86bc18> (a java.lang.ref.ReferenceQueue$Lock)
 - jdk.internal.ref.CleanerImpl.run() @bci=65, line=148 (Interpreted frame)
 - java.lang.Thread.run() @bci=11, line=832 (Interpreted frame)
 - jdk.internal.misc.InnocuousThread.run() @bci=20, line=134 (Interpreted frame)

"pool-1-thread-1" #14 prio=5 tid=0x00007fe24c79d000 nid=0x15666 waiting on condition [0x00007fe2246e2000]
   java.lang.Thread.State: TIMED_WAITING (parking)
   JavaThread state: _thread_blocked
 - jdk.internal.misc.Unsafe.park(boolean, long) @bci=0 (Compiled frame; information may be imprecise)
    - parking to wait for <0x00000000fed03ac0> (a java/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject)
 - java.util.concurrent.locks.LockSupport.parkNanos(java.lang.Object, long) @bci=20, line=252 (Compiled frame)
 - java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(long) @bci=117, line=1661 (Compiled frame)
 - java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take() @bci=124, line=1182 (Compiled frame)
 - java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take() @bci=1, line=899 (Compiled frame)
 - java.util.concurrent.ThreadPoolExecutor.getTask() @bci=147, line=1056 (Compiled frame)
Error occurred during stack walking:

"process reaper" #16 daemon prio=10 tid=0x00007fe1c400b000 nid=0x1566c runnable [0x00007fe2242dc000]
   java.lang.Thread.State: RUNNABLE
   JavaThread state: _thread_in_native
 - java.lang.ProcessHandleImpl.waitForProcessExit0(long, boolean) @bci=0 (Interpreted frame)
 - java.lang.ProcessHandleImpl$1.run() @bci=8, line=138 (Interpreted frame)
 - java.util.concurrent.ThreadPoolExecutor.runWorker(java.util.concurrent.ThreadPoolExecutor$Worker) @bci=92, line=1130 (Interpreted frame)
 - java.util.concurrent.ThreadPoolExecutor$Worker.run() @bci=5, line=630 (Interpreted frame)
 - java.lang.Thread.run() @bci=11, line=832 (Interpreted frame)

"DisconnectableInputStream source reader" #20 daemon prio=5 tid=0x00007fe24c91c000 nid=0x1568d runnable [0x00007fe2243dd000]
   java.lang.Thread.State: RUNNABLE
   JavaThread state: _thread_in_native
 - java.io.FileInputStream.readBytes(byte[], int, int) @bci=0 (Interpreted frame)
 - java.io.FileInputStream.read(byte[], int, int) @bci=4, line=272 (Interpreted frame)
 - java.io.BufferedInputStream.read1(byte[], int, int) @bci=39, line=282 (Interpreted frame)
 - java.io.BufferedInputStream.read(byte[], int, int) @bci=49, line=343 (Interpreted frame)
    - locked <0x00000000fc82bd58> (a java.io.BufferedInputStream)
 - org.gradle.util.DisconnectableInputStream$1.run() @bci=242, line=98 (Interpreted frame)
 - java.lang.Thread.run() @bci=11, line=832 (Interpreted frame)

"Forward input" #21 prio=5 tid=0x00007fe24c91d800 nid=0x1568e waiting on condition [0x00007fe224ef4000]
   java.lang.Thread.State: WAITING (parking)
   JavaThread state: _thread_blocked
 - jdk.internal.misc.Unsafe.park(boolean, long) @bci=0 (Interpreted frame)
    - parking to wait for <0x00000000ff2aa100> (a java/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject)
 - java.util.concurrent.locks.LockSupport.park() @bci=5, line=341 (Interpreted frame)
 - java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block() @bci=7, line=505 (Interpreted frame)
 - java.util.concurrent.ForkJoinPool.managedBlock(java.util.concurrent.ForkJoinPool$ManagedBlocker) @bci=149, line=3137 (Interpreted frame)
 - java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await() @bci=89, line=1614 (Interpreted frame)
 - org.gradle.util.DisconnectableInputStream.read(byte[], int, int) @bci=38, line=140 (Interpreted frame)
 - org.gradle.launcher.daemon.client.InputForwarder$1.run() @bci=28, line=78 (Interpreted frame)
 - org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(java.lang.Runnable) @bci=1, line=64 (Interpreted frame)
 - org.gradle.internal.concurrent.ManagedExecutorImpl$1.run() @bci=25, line=48 (Interpreted frame)
 - java.util.concurrent.ThreadPoolExecutor.runWorker(java.util.concurrent.ThreadPoolExecutor$Worker) @bci=92, line=1130 (Interpreted frame)
 - java.util.concurrent.ThreadPoolExecutor$Worker.run() @bci=5, line=630 (Interpreted frame)
 - org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run() @bci=7, line=56 (Interpreted frame)
 - java.lang.Thread.run() @bci=11, line=832 (Interpreted frame)
DaveO-Home commented 4 years ago

@jaikiran The refresh seems to be working when I set the quarkus property:

quarkus.vertx.caching=false

It's interesting that this does not work...

staticHandler.setCachingEnabled(false);