我在 Vaadin 中创建了一个时间函数,使用调度程序每秒更新一个标签。
if (getUI().isPresent()) {
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
UI ui = getUI().get();
Runnable repeatedTask = () -> {
if (ui.isAttached()) {
ui.access(() -> {
timeLabel.setText(
DateTimeFormatter.ofPattern("HH:mm:ss").format(LocalDateTime.now()));
});
}
};
scheduler.scheduleAtFixedRate(repeatedTask, 1, 1, TimeUnit.SECONDS);
ScheduledExecutorService shutdownSchedule = Executors.newScheduledThreadPool(1);
Runnable shutdownTask = () -> {
scheduler.shutdown();
shutdownSchedule.shutdown();
};
shutdownSchedule.schedule(shutdownTask, 3, TimeUnit.MINUTES);
}
当我在本地运行程序时,没有问题,但在生产中,它显示此错误消息。
java.lang.IllegalStateException: The request object has been recycled and is no longer associated with this facade
at org.apache.catalina.connector.RequestFacade.removeAttribute(RequestFacade.java:549) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.catalina.core.ApplicationHttpRequest.removeAttribute(ApplicationHttpRequest.java:281) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at jakarta.servlet.ServletRequestWrapper.removeAttribute(ServletRequestWrapper.java:268) ~[tomcat-embed-core-10.1.5.jar:6.0]
at jakarta.servlet.ServletRequestWrapper.removeAttribute(ServletRequestWrapper.java:268) ~[tomcat-embed-core-10.1.5.jar:6.0]
at org.atmosphere.cpr.
.AtmosphereRequestImpl.removeAttribute(AtmosphereRequestImpl.java:681) ~[atmosphere-runtime-3.0.0.slf4jvaadin2.jar:3.0.0.slf4jvaadin2]
at org.atmosphere.cpr.DefaultBroadcaster.executeAsyncWrite(DefaultBroadcaster.java:915) ~[atmosphere-runtime-3.0.0.slf4jvaadin2.jar:3.0.0.slf4jvaadin2] at org.atmosphere.cpr.DefaultBroadcaster$2.run(DefaultBroadcaster.java:477) ~[atmosphere-runtime-3.0.0.slf4jvaadin2.jar:3.0.0.slf4jvaadin2] at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) ~[na:na]
at java.base/java.util.concurrent.FutureTask.run(F (FutureTask.java:264) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[na:na] at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na]
: This message com.vaadin.flow.server.communication. AtmospherePushConnection$PushMessage@6cbb2d50 will be lost for AtmosphereResour : Failed to execute a write operation for Broadcaster /*
2023-10-02T13:11:23.767+08:00 WARN 254255 --- [here-Shared-278] org.atmosphere.cpr.DefaultBroadcaster ce 999e5bfb-9531-4708-bff3-195024ca36d1, adding it to the BroadcasterCache 2023-10-02T13:11:23.767+08:00 WARN 254255 [here-Shared-278] org.atmosphere.cpr.DefaultBroadcaster java.lang.IllegalStateException: The request object has been recycled and is no longer associated with this facade
at org.apache.catalina.connector.RequestFacade.removeAttribute(RequestFacade.java:549) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.catalina.core.ApplicationHttpRequest.removeAttribute(ApplicationHttpRequest.java:281) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at jakarta.servlet.ServletRequestWrapper.removeAttribute(ServletRequestWrapper.java:268) ~[tomcat-embed-core-10.1.5.jar:6.0]
at jakarta.servlet.ServletRequestWrapper.removeAttribute(ServletRequestWrapper.java:268) ~[tomcat-embed-core-10.1.5.jar:6.0]
at org.atmosphere.cpr.
.AtmosphereRequestImpl.removeAttribute(AtmosphereRequestImpl.java:681) ~[atmosphere-runtime-3.0.0.slf4jvaadin2.jar:3.0.0.slf4jvaadin2]
at org.atmosphere.cpr.DefaultBroadcaster.executeAsyncWrite(DefaultBroadcaster.java:915) ~[atmosphere-runtime-3.0.0.slf4jvaadin2.jar:3.0.0.slf4jvaadin2] at org.atmosphere.cpr.DefaultBroadcaster$2.run(DefaultBroadcaster.java:477) ~[atmosphere-runtime-3.0.0.slf4jvaadin2.jar:3.0.0.slf4jvaadin2] at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) ~[na:na]
at java.base/java.util.concurrent.FutureTask.run(F (FutureTask.java:264) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[na:na]
at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na]
2023-10-02T13:11:25.767+08:00 WARN 254255 --- [here-Shared-282] org.atmosphere.cpr.DefaultBroadcaster 2023-10-02T13:11:25.767+08:00 WARN 254255 [here-Shared-282] org.atmosphere.cpr.DefaultBroadcaster
ce 999e5bfb-9531-4708-bff3-195024ca36d1, adding it to the BroadcasterCache
: This message com.vaadin.flow.server.communication. Atmosphere PushConnection$PushMessage@48d18881 will be lost for AtmosphereResour : Failed to execute a write operation for Broadcaster /*
java.lang.IllegalStateException: The request object has been recycled and is no longer associated with this facade
at org.apache.catalina.connector.RequestFacade.removeAttribute(RequestFacade.java:549) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.catalina.core.ApplicationHttpRequest.removeAttribute(ApplicationHttpRequest.java:281) ~[tomcat-embed-core-10.1.5.jar:10.1.5] .servlet.ServletRequestWrapper.removeAttribute(ServletRequestWrapper.java:268) ~[tomcat-embed-core-10.1.5.jar:6.0]
at
at
at org.atmosphere.cpr.
at org.atmosphere.cpr.AtmosphereRequestImpl.removeAttribute(AtmosphereRequestImpl.java:681) ~[atmosphere-runtime-3.0.0.slf4jvaadin2.jar:3.0.0.slf4jvaadin2] at org.atmosphere. .cpr.
.executeAsyncWrite(DefaultBroadcaster.java:915) ~[atmosphere-runtime-3.0.0.slf4jvaadin2.jar:3.0.0.slf4jvaadin2]
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) ~[na:na]
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[na:na]
at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na]
·Defair to do ver $2.run(DefaultBroadcaster.java:477) ~[atmosphere-runtime-3.0.0.slf4jvaadin2.jar:3.0.0.slf4jvaadin2]
X
我相信这个问题的原因是调度程序试图每秒更新标签,但我不确定如何修复它。我正在使用 Vaadin 24,如果有任何帮助,我们将不胜感激。
我认为你所描述的问题与这个问题类似。
当 Tomcat 完成处理后尝试访问 HttpRequest 对象时,会发生此错误。当您的后台处理比请求的处理寿命更长,但使用请求对象时,通常会发生这种情况。
我认为你应该重构你的代码,使其不依赖于请求。您可以考虑将相关请求属性复制到另一个对象中,并在后台处理中使用该对象。