Open aaronanderson opened 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
@emmanuelbernard I think it's probably something we need to figure out for 1.0? WDYT?
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 .
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.
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.
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
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 ?
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);
}
}
hangs where exactly ?
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)
One thing I didn't mention; my app runs under Vert.x so the vertical has to be redeployed.
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.
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)
@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);
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.